Maison > Article > développement back-end > journalisation du module de journalisation Python
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
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.
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 !