Heim  >  Artikel  >  Backend-Entwicklung  >  Protokollierung des Python-Protokollierungsmoduls

Protokollierung des Python-Protokollierungsmoduls

高洛峰
高洛峰Original
2017-02-22 09:23:141146Durchsuche

Funktion auf Modulebene

logging.getLogger([name]): Gibt ein Logger-Objekt zurück. Wenn kein Name angegeben ist, wird der Root-Logger zurückgegeben

logging.debug(). , logging.info( ), logging.warning(), logging.error(), logging.critical(): Legen Sie die Protokollebene des Root-Loggers fest

logging.basicConfig(): Verwenden Sie den Standardformatierer für Erstellen Sie einen StreamHandler für das Protokollierungssystem, legen Sie die Grundkonfiguration fest und fügen Sie ihn dem Root-Logger hinzu.

Logger

logging.getLogger([name])

Gibt eine Logger-Instanz zurück Name ist nicht angegeben, gibt den Root-Logger zurück.

Jedes Programm muss einen Logger erhalten, bevor es Informationen ausgeben kann. Logger entspricht normalerweise dem Modulnamen des Programms. Beispielsweise kann das grafische Schnittstellenmodul eines Chat-Tools seinen Logger wie folgt erhalten:

LOG=logging.getLogger("chat.gui")

Und das Kernmodul kann so aussehen:

LOG=logging.getLogger("chat.kernel")

Logger.setLevel(logging.WARNING ): Geben Sie die niedrigste Protokollebene an, niedriger als Die Ebene der WARNUNG wird ignoriert

Logger.addFilter(filt), Logger.removeFilter(filt): Den angegebenen Filter hinzufügen oder entfernen

Logger .addHandler(hdlr), Logger.removeHandler(hdlr): Fügen Sie den angegebenen Handler hinzu oder löschen Sie ihn.

Handlers

Das Handler-Objekt ist für das Senden verantwortlich relevante Informationen an das angegebene Ziel. Es kann sich um eine Datei, einen Bildschirm, ein Netzwerk, einen Socket usw. handeln.

Handler.setLevel(lel): Gibt die zu verarbeitende Informationsebene an. Informationen unterhalb der LEL-Ebene werden ignoriert

Handler.setFormatter(): Wählen Sie ein Ausgabeformat für diesen Handler

Handler.addFilter(filt), Handler.removeFilter(filt): Fügen Sie ein Filterobjekt hinzu oder löschen Sie es

Das Protokoll wird auf dem Bildschirm gedruckt

import logging

logging.debug('This is debug message')
logging.info('This is info message')
logging.warning('This is warning message')

 

返回:
WARNING:root:This is warning message

打印到屏幕

Standardmäßig wird das Protokoll auf dem Bildschirm gedruckt, und die Protokollebene ist WARNUNG; Die Protokollebenenbeziehung ist: KRITISCH > > INFO > NOTSET, natürlich können Sie den Log-Level auch selbst definieren.

Protokollausgabe formatieren

Parameter der Funktion logging.basicConfig:

Dateiname: Geben Sie den Protokolldateinamen an.
Dateimodus: Dieselbe Bedeutung wie die Datei Funktion, geben Sie den Öffnungsmodus der Protokolldatei an, „w“ oder „a“
Format: Gibt das Format und den Inhalt des Ausgabeformats an, das viele nützliche Informationen ausgeben kann, wie im obigen Beispiel gezeigt:

import logging

logging.basicConfig(level=logging.DEBUG,
                format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
                datefmt='%a, %d %b %Y %H:%M:%S',
                filename='myapp.log',
                filemode='w')
    
logging.debug('This is debug message')
logging.info('This is info message')
logging.warning('This is warning message')

 

./myapp.log文件中内容为:
Sun, 24 May 2009 21:48:54 demo2.py[line:11] DEBUG This is debug message
Sun, 24 May 2009 21:48:54 demo2.py[line:12] INFO This is info message
Sun, 24 May 2009 21:48:54 demo2.py[line:13] WARNING This is warning message

修改输出格式
Protokollformatvariable

%(levelno)s: 打印日志级别的数值
 %(levelname)s: 打印日志级别名称
 %(pathname)s: 打印当前执行程序的路径,其实就是sys.argv[0]
 %(filename)s: 打印当前执行程序名
 %(funcName)s: 打印日志的当前函数
 %(lineno)d: 打印日志的当前行号
 %(asctime)s: 打印日志的时间
 %(thread)d: 打印线程ID
 %(threadName)s: 打印线程名称
 %(process)d: 打印进程ID
 %(message)s: 打印日志信息
datefmt: 指定时间格式,同time.strftime()
level: 设置日志级别,默认为logging.WARNING
stream: 指定将日志的输出流,可以指定输出到sys.stderr,sys.stdout或者文件,默认输出到sys.stderr,当stream和filename同时指定时,stream被忽略

日志格式
Protokollierungsmethode

logging.StreamHandler: 日志输出到流,可以是sys.stderr、sys.stdout或者文件
logging.FileHandler: 日志输出到文件

日志回滚方式,实际使用时用RotatingFileHandler和TimedRotatingFileHandler
logging.handlers.BaseRotatingHandler
logging.handlers.RotatingFileHandler
logging.handlers.TimedRotatingFileHandler

logging.handlers.SocketHandler: 远程输出日志到TCP/IP sockets
logging.handlers.DatagramHandler:  远程输出日志到UDP sockets
logging.handlers.SMTPHandler:  远程输出日志到邮件地址
logging.handlers.SysLogHandler: 日志输出到syslog
logging.handlers.NTEventLogHandler: 远程输出日志到Windows NT/2000/XP的事件日志
logging.handlers.MemoryHandler: 日志输出到内存中的制定buffer
logging.handlers.HTTPHandler: 通过"GET"或"POST"远程输出到HTTP服务器

logging方法
Da StreamHandler und FileHandler häufig verwendete Protokollverarbeitungsmethoden sind, sind sie direkt im Protokollierungsmodul enthalten. während andere Methoden im Modul logging.handlers enthalten sind

Definieren Sie das Protokollmodul im Programm

import logging
# create logger
def logger(log_type):
logger = logging.getLogger(log_type) # 创建Logger对象,类型是'TEST-LOG'
logger.setLevel(logging.WARNING) # 设置最低的日志级别,此级别覆盖ch and fh的级别
# 创建输出到控制台处理程序,并设置级别为DEBUG
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG) # 控制输出到屏幕的级别
# 创建输出到文件的处理程序,并设置级别
fh = logging.FileHandler("access.log")
fh.setLevel(logging.WARNING)
# 创建日志格式
formatter_Stream = logging.Formatter('%(name)s - %(levelname)s - %(message)s')
formatter_File = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
# add formatter to ch and fh
ch.setFormatter(formatter_Stream)
fh.setFormatter(formatter_File)
# add ch and fh to logger
logger.addHandler(ch)
logger.addHandler(fh)
return logger
eee = logger('EEE')
rrr = logger('RRR')
rrr.debug('debug message')
rrr.info('info message')
rrr.warning('warn message')
eee.error('error message')
eee.critical('critical message')

代码
Inhalt der Bildschirmanzeige

RRR - INFO - Infomeldung

RRR – WARNUNG – Warnmeldung

EEE – FEHLER – Fehlermeldung

EEE – KRITISCH – kritische Meldung

Inhalt in Datei

2017 -02-21 21:35:05,700 - RRR - WARNING - Warnmeldung


2017-02-21 21:35:05,700 - EEE - ERROR - Fehlermeldung

2017- 02-21 21:35:05,700 – EEE – KRITISCH – kritische Nachricht



Filter

Das Format der Parameter beim Aufruf von logging.getLogger() ähneln „A.B.C“. Dieses Format wird zum Konfigurieren des Filters verwendet. Nach dem Hinzufügen eines Filters wird das Protokoll ausgegeben, nachdem es vom Filter verarbeitet wurde


Der Filter „AAA.BBB“ erlaubt nur Loggern, deren Namen mit „AAA.BBB“ beginnen, Informationen auszugeben


Sie können mehrere Filter hinzufügen. Solange ein Filter ablehnt, wird das Protokoll nicht ausgegeben

import logging
def logger(log_type):
logger = logging.getLogger(log_type) # 创建Logger对象,类型是'TEST-LOG'
logger.setLevel(logging.DEBUG) # 此级别覆盖ch and fh的级别
# 创建输出到控制台处理程序,并设置级别为DEBUG
ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG) # 控制输出到屏幕的级别
 
# 设置过滤器
filter = logging.Filter('AAA.BBB.CCC')
ch.addFilter(filter)
formatter_Stream = logging.Formatter('%(name)s - %(levelname)s - %(message)s')
ch.setFormatter(formatter_Stream)
logger.addHandler(ch) # ch加入logger
return logger
eee = logger('AAA.BBB.CCC')
rrr = logger('AAA.BBB.DDD')
rrr.error('debug message')
rrr.error('info message')
eee.error('critical message')
eee.error('critical message')

代码
Das Protokoll schneiden

Nach Größe schneiden

import logging
from logging import handlers
# create logger
def logger(log_type):
logger = logging.getLogger(log_type)
logger.setLevel(logging.DEBUG)
fh = logging.FileHandler("access.log")
fh.setLevel(logging.WARNING)
# 按时间切割日志文件
fh = handlers.TimedRotatingFileHandler(filename='access.log', when='s', interval=10 )
formatter_File = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
fh.setFormatter(formatter_File)
logger.addHandler(fh)
return logger
rrr = logger('AAA.BBB.DDD')
rrr.error('debug message')
rrr.error('info message')
rrr.error('warn message')

代码
Intervall: Zeitintervall


wenn: Zeiteinheit S Sekunden M Minuten H Stunden D Tage W jede Woche (Intervall==0 steht für Montag) jeden Morgen um Mitternacht

Über den Root-Logger und die Eltern-Kind-Beziehung des Loggers

Der Root-Logger wurde tatsächlich schon oft erwähnt. Zwischen Logger-Instanzen besteht eine Eltern-Kind-Beziehung. Root-Logger Es ist der Logger der obersten Ebene, der der Vorfahre aller Logger ist. Wie unten gezeigt: Root-Logger ist der Standard-Logger, wenn Sie keine Logger-Instanz erstellen und logging.debug(), logging.info(), logging.warning(), logging.error() und logging.critical direkt aufrufen () Funktionen, dann verwenden Der Logger ist der Root-Logger, der automatisch erstellt werden kann und auch eine einzelne Instanz ist.

python日志模块 logging


So erhalten Sie den Root-Logger über logging.getLogger() oder logging.getLogger(""), um die Root-Logger-Instanz abzurufen.
Die Standardebene des Levelroot-Loggers ist logging.WARNUNG
So drücken Sie die Eltern-Kind-Beziehung aus: Die Benennungsmethode des Logger-Namens kann die Eltern-Kind-Beziehung zwischen Loggern ausdrücken. getLogger('foo')child_logger = logging.getLogger('foo.bar')
Was ist die effektive Ebene? Logger hat ein Konzept namens effektive Ebene. Wenn ein Logger die Ebene nicht explizit festlegt, verwendet er die Ebene des übergeordneten Protokolls. Wenn der Vater die Ebene nicht explizit festlegt, wird die Ebene des Vaters des Vaters verwendet usw. Wenn wir schließlich den Root-Logger erreichen, muss die Ebene festgelegt worden sein. Der Standardwert ist logging.WARNUNG. Nachdem untergeordnete Logger die Nachricht erhalten haben, wird die Nachricht nicht nur zur Verarbeitung an ihren Handler weitergeleitet, sondern sie wird auch an alle Vorfahren-Logger zur Verarbeitung weitergeleitet.

Weitere Informationen Artikel zum Thema Protokollierung des Python-Protokollmoduls, bitte beachten Sie die chinesische PHP-Website!

Stellungnahme:
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