Heim > Backend-Entwicklung > Python-Tutorial > Detaillierte Erläuterung der Verwendung des Protokollierungsmoduls in Python in einer Multiprozessumgebung

Detaillierte Erläuterung der Verwendung des Protokollierungsmoduls in Python in einer Multiprozessumgebung

高洛峰
Freigeben: 2017-02-14 13:51:08
Original
1963 Leute haben es durchsucht

Viele Anwendungen verfügen über ein Protokollmodul, das zur Aufzeichnung einiger wichtiger Informationen während des Betriebs des Systems verwendet wird, um die Verfolgung des Betriebsstatus des Systems zu erleichtern. In diesem Artikel wird hauptsächlich die Verwendung des Protokollierungsmoduls in einer Umgebung mit mehreren Prozessen vorgestellt. Lassen Sie uns gemeinsam einen Blick darauf werfen.

Vorwort

Ich glaube, jeder Programmierer sollte wissen, dass es bei der Verwendung von Python zum Schreiben von Hintergrundaufgaben häufig erforderlich ist, Ausgabeprotokolle zu verwenden, um den Status der Programmausführung aufzuzeichnen und Fehler zu melden, wenn Fehler auftreten Die Details werden zur weiteren Fehlerbehebung und Analyse gespeichert. Das Protokollierungsmodul von Python ist in dieser Situation ein großer Helfer.

Das Protokollierungsmodul kann die Protokollebene DEBUG, INFO, WARNUNG, FEHLER und KRITISCH angeben. Beispielsweise können während der Entwicklung und beim Debuggen Protokolle mit Ebenen über DEBUG ausgegeben werden, während in einer Produktionsumgebung nur INFO ausgegeben werden ausgegeben werden kann. (Wenn nicht angegeben, ist die Standardstufe Warnung)

Protokollierung Sie können auch die Ausgabe an die Befehlszeile oder Datei angeben und die Protokolldatei auch nach Zeit oder Größe aufteilen.

Auf die detaillierte Verwendung der Protokollierung werde ich hier nicht näher eingehen. Sie können sich hier auf die offizielle Dokumentation oder die Einführung beziehen.

Protokollierungskonfiguration

Normalerweise müssen wir das Protokoll in einer Datei speichern und erwarten, dass die Datei automatisch aufgeteilt wird, um zu vermeiden, dass die Protokolldatei zu groß wird. Nachfolgend finden Sie ein Beispiel für die Protokollierungskonfiguration.

import logging.config
 
logging.config.dictConfig({
 'version': 1,
 'disable_existing_loggers': True,
 'formatters': {
  'verbose': {
   'format': "[%(asctime)s] %(levelname)s [%(name)s:%(lineno)s] %(message)s",
   'datefmt': "%Y-%m-%d %H:%M:%S"
  },
  'simple': {
   'format': '%(levelname)s %(message)s'
  },
 },
 'handlers': {
  'null': {
   'level': 'DEBUG',
   'class': 'logging.NullHandler',
  },
  'console': {
   'level': 'DEBUG',
   'class': 'logging.StreamHandler',
   'formatter': 'verbose'
  },
  'file': {
   'level': 'DEBUG',
   'class': 'logging.RotatingFileHandler',
   # 当达到10MB时分割日志
   'maxBytes': 1024 * 1024 * 10,
   # 最多保留50份文件
   'backupCount': 50,
   # If delay is true,
   # then file opening is deferred until the first call to emit().
   'delay': True,
   'filename': 'logs/mysite.log',
   'formatter': 'verbose'
  }
 },
 'loggers': {
  '': {
   'handlers': ['file'],
   'level': 'info',
  },
 }
})
Nach dem Login kopieren

Wir können damit Protokolle in einem Modul aufzeichnen

import logging
logger = logging.getLogger(__name__)
 
if __name__ == '__main__':
 logger.info('log info')
Nach dem Login kopieren

Verwendung in einer Umgebung mit mehreren Prozessen

Laut offizieller Dokumentation ist die Protokollierung threadsicher, das heißt, es ist für mehrere Threads in einem Prozess sicher, gleichzeitig Protokolle in dieselbe Datei zu schreiben Zeit von. Aber (ja, es gibt ein Aber) es ist nicht sicher, dass mehrere Prozesse Protokolle in dieselbe Datei schreiben. Die offizielle Aussage lautet:

Da es in Python keine Standardmethode gibt, um den Zugriff auf eine einzelne Datei über mehrere Prozesse hinweg zu serialisieren. Wenn Sie sich von mehreren Prozessen aus in einer einzelnen Datei anmelden müssen, ist dies eine Möglichkeit alle Prozesse in einem SocketHandler protokollieren zu lassen und über einen separaten Prozess zu verfügen, der einen Socket-Server implementiert, der aus dem Socket liest und in einer Datei protokolliert (Wenn Sie möchten, können Sie einen Thread in einem der vorhandenen Prozesse für die Ausführung dieser Funktion reservieren .)

Manche werden sagen, dann brauche ich nicht mehrere Prozesse. Allerdings verfügt Python über eine große GIL-Sperre (über die Streitigkeiten über GIL können Sie hier lesen). Es ist unmöglich, Multi-Threading zu verwenden, um die Vorteile von Multi-Core-CPUs zu nutzen von Multi-Core-CPUs, daher können wir das Problem, dass Protokolle unter mehreren Prozessen nicht geöffnet werden, immer noch nicht umgehen.

Um dieses Problem zu lösen, können Sie ConcurrentLogHandler verwenden, um Protokolle in einer Umgebung mit mehreren Prozessen sicher in dieselbe Datei zu schreiben und die Protokolldatei aufzuteilen, wenn die Protokolldatei eine bestimmte Größe erreicht. Im Standardprotokollierungsmodul gibt es eine TimedRotatingFileHandler-Klasse, die Protokolldateien nach Zeit aufteilen kann. Leider unterstützt ConcurrentLogHandler diese Art der Aufteilung von Protokolldateien nach Zeit nicht.

Überarbeiten Sie die Klasse in Handlern.

logging.config.dictConfig({
 ...
 'handlers': {
  'file': {
   'level': 'DEBUG',
   # 如果没有使用并发的日志处理类,在多实例的情况下日志会出现缺失
   'class': 'cloghandler.ConcurrentRotatingFileHandler',
   # 当达到10MB时分割日志
   'maxBytes': 1024 * 1024 * 10,
   # 最多保留50份文件
   'backupCount': 50,
   # If delay is true,
   # then file opening is deferred until the first call to emit().
   'delay': True,
   'filename': 'logs/mysite.log',
   'formatter': 'verbose'
  }
 },
 ...
})
Nach dem Login kopieren

Nach dem Ausführen können Sie feststellen, dass automatisch eine .lock-Datei erstellt wird und die Protokolldatei sicher durch die Sperre geschrieben werden kann.

Ausführlichere Erläuterungen zur Verwendung des Protokollierungsmoduls in Python in einer Multiprozessumgebung finden Sie auf der chinesischen PHP-Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage