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.
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 修改输出格式
%(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被忽略 日志格式
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方法
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') 代码
EEE – FEHLER – FehlermeldungEEE – KRITISCH – kritische MeldungInhalt in Datei2017 -02-21 21:35:05,700 - RRR - WARNING - Warnmeldung
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') 代码
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') 代码
Ü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.
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!