Maison  >  Article  >  développement back-end  >  journalisation du module de journalisation Python

journalisation du module de journalisation Python

高洛峰
高洛峰original
2017-02-22 09:23:141146parcourir

Fonction au niveau du module

logging.getLogger([name]) : renvoie un objet enregistreur si aucun nom n'est spécifié, l'enregistreur racine sera renvoyé

logging.debug(). , logging.info( ), logging.warning(), logging.error(), logging.critical() : définissez le niveau de journalisation de l'enregistreur racine

logging.basicConfig() : utilisez le formateur par défaut pour créez un StreamHandler pour le système de journalisation, définissez la configuration de base et ajoutez-le à l'enregistreur racine

Logger

logging.getLogger([name])

Renvoie une instance d'enregistreur If. le nom n'est pas spécifié, renvoie le logger racine.

Chaque programme doit obtenir un Logger avant de sortir des informations. Logger correspond généralement au nom du module du programme. Par exemple, le module d'interface graphique d'un outil de chat peut obtenir son Logger comme ceci :

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

Et le module principal Cela peut ressembler à ceci :

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

Logger.setLevel(logging.WARNING ): Spécifiez le niveau de journalisation le plus bas, inférieur à Le niveau d'AVERTISSEMENT sera ignoré

Logger.addFilter(filt), Logger.removeFilter(filt) : Ajoutez ou supprimez le filtre spécifié

Logger .addHandler(hdlr), Logger.removeHandler(hdlr ) : Ajouter ou supprimer le gestionnaire spécifié

Handlers

l'objet handler est responsable de l'envoi informations pertinentes vers la destination spécifiée. Il peut s'agir d'un fichier, d'un écran, d'un réseau, d'un socket, etc.

Handler.setLevel(lel) : Spécifie le niveau d'information à traiter. Les informations inférieures au niveau lel seront ignorées

. Handler.setFormatter() : Sélectionnez un format de sortie pour ce gestionnaire

Handler.addFilter(filt), Handler.removeFilter(filt) : Ajouter ou supprimer un objet filtre

Le journal est imprimé à l'écran

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

打印到屏幕

Par défaut, la journalisation imprime le journal à l'écran et le niveau de journalisation est AVERTISSEMENT
La relation entre la taille du niveau de journal est : CRITIQUE > AVERTISSEMENT > INFO > DEBUG > NOTSET, vous pouvez bien entendu également définir vous-même le niveau de journalisation.

Formater la sortie du journal

Paramètres de la fonction logging.basicConfig :
filename : Spécifiez le nom du fichier journal
filemode : La même signification que la fonction file , spécifiez Le mode d'ouverture du fichier journal, 'w' ou 'a'
format : Spécifie le format et le contenu du format de sortie peut générer de nombreuses informations utiles, comme le montre l'exemple ci-dessus :

.
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

修改输出格式

Variable de format de journal

%(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被忽略

日志格式

Méthode de journalisation

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方法

Étant donné que StreamHandler et FileHandler sont des méthodes de traitement de journaux couramment utilisées, elles sont directement incluses dans le module de journalisation, tandis que d'autres méthodes sont incluses dans le module logging.handlers

Définir le module de journalisation dans le programme

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')

代码

Contenu de l'affichage à l'écran

RRR - INFO - message d'information

RRR - AVERTISSEMENT - message d'avertissement

EEE - ERREUR - message d'erreur

EEE - CRITIQUE - message critique

Contenu du fichier

2017- 02-21 21:35:05,700 - RRR - AVERTISSEMENT - message d'avertissement

2017-02-21 21:35:05,700 - EEE - ERREUR - message d'erreur

2017-02 -21 21:35:05,700 - EEE - CRITIQUE - message critique


Filtre

Le format des paramètres lors de l'appel de logging.getLogger() est similaire à "A.B.C". Ce format est utilisé pour configurer le filtre. Après avoir ajouté un filtre, le journal sera sorti après avoir été traité par le filtre

Le filtre "AAA.BBB" permet uniquement aux enregistreurs dont les noms commencent par "AAA.BBB" de sortir des informations

Vous pouvez ajouter plusieurs filtres, tant qu'un filtre rejette, le journal ne sera pas sorti

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')

代码

Coupez le journal

Coupé par taille

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')

代码

intervalle : intervalle de temps

quand : unité de temps S secondes M minutes H heures D jours W chaque semaine (intervalle==0 représente lundi) minuit chaque matin

À propos de l'enregistreur racine et de la relation parent-enfant de l'enregistreur

L'enregistreur racine a déjà été mentionné à plusieurs reprises. il existe une relation parent-enfant entre les instances de l'enregistreur racine. C'est l'enregistreur de niveau supérieur, qui est l'ancêtre de tous les enregistreurs. Comme indiqué ci-dessous : le logger racine est le logger par défaut si vous ne créez pas d'instance de logger et n'appelez pas directement logging.debug(), logging.info(), logging.warning(), logging.error() et logging.critical. (), puis utilisez Le logger est le logger racine, qui peut être créé automatiquement et est également une instance unique.

python日志模块 logging


Comment obtenir l'enregistreur racine via logging.getLogger() ou logging.getLogger("") pour obtenir l'instance de l'enregistreur racine.
Le niveau par défaut de l'enregistreur levelroot est logging.AVERTISSEMENT
Comment exprimer la relation parent-enfant. La méthode de dénomination du nom de l'enregistreur peut exprimer la relation parent-enfant entre les enregistreurs. Par exemple : parent_logger = logging. getLogger('foo')child_logger = logging.getLogger('foo.bar')
Qu'est-ce que le niveau effectif ? Logger a un concept appelé niveau effectif. Si un enregistreur ne définit pas explicitement le niveau, il utilise le niveau du parent. Si le père ne fixe pas explicitement le niveau, le niveau du père du père sera utilisé, et ainsi de suite... Enfin, lorsque l'on atteint le root logger, le niveau doit avoir été défini. La valeur par défaut est logging.WARNING. Une fois que les enregistreurs enfants ont reçu le message, il distribue non seulement le message à son gestionnaire pour traitement, mais le transmet également à tous les enregistreurs ancêtres pour traitement

Pour en savoir plus. Articles liés à la journalisation du module de journalisation Python, veuillez faire attention au site Web chinois PHP !

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn