Fournit des interfaces de journalisation et de nombreux modules de traitement permettant aux utilisateurs de stocker les journaux dans différents formats, d'aider au débogage des programmes ou d'enregistrer des informations de sortie pendant l'exécution du programme.
Le niveau de journalisation est divisé en cinq niveaux, la priorité de haut en bas est :
**CRITIQUE ; ** Erreur de programme grave
**ERREUR ; **Erreur de programme/erreur de fonction partielle
**AVERTISSEMENT ; **Le programme peut contenir des erreurs
**INFO ; **Informations lorsque le programme fonctionne normalement
Informations de débogage du programme DEBUG
Le niveau d'enregistrement du journal par défaut est AVERTISSEMENT, c'est-à-dire lorsque le niveau de journalisation Il ne sera enregistré que s'il est supérieur ou égal à ATTENTION.
Le niveau d'enregistrement couramment utilisé est INFO, qui est utilisé pour enregistrer certaines informations sur le fonctionnement normal du programme (similaire à l'impression).
Lorsque le niveau de journalisation atteint AVERTISSEMENT ou supérieur, cela indique que le programme ne peut pas fonctionner normalement à ce moment-là.
logging.basicConfig(**kwargs)
créera un enregistreur racine par défaut lorsqu'il n'y a pas de création explicite d'un enregistreur. logging.basicConfig(**kwargs) peut créer un streamHandle avec un formateur par défaut et l'ajouter au logger racine pour initialiser la configuration de base.
Par exemple
import logging logging.debug('Debug code!') logging.info('Run code!') logging.warning('Watch out!') logging.error('This is an error') logging.critical('This is a ciritical')
Dans le code ci-dessus, la journalisation ne crée pas explicitement un enregistreur (logging.getLogger). Il utilisera la valeur par défaut lors de l'utilisation de debug(), info(), warn(), error(), critic(). ) directement l'enregistreur racine et appellera automatiquement le logging.basicConfig(**kwargs) personnalisé ou par défaut pour initialiser l'enregistreur racine.
Les paramètres du fichier logging.basicConfig personnalisé(**kwargs) ont les options principales suivantes :
Parameters | Fonction |
---|---|
filename | Spécifiez le nom du fichier pour enregistrer le journal, utilisez le fichier spécifié name Créez un FileHandler, le journal enregistré sera enregistré dans le fichier |
format | Spécifiez le format de sortie et le contenu, la valeur par défaut est le nom du niveau, le nom et le message séparés par deux points |
datefmt | Utilisez la date spécifiée / Format de l'heure, le même que celui accepté par time.strftime(). |
level | Spécifiez le niveau de l'enregistreur racine, la valeur par défaut est la journalisation. AVERTISSEMENT |
stream | Spécifiez le flux de sortie du journal, vous pouvez spécifier la sortie vers sys.stderr, std.stdout ou un fichier, la sortie par défaut est sys .stderr. Initialisez StramHandler à l'aide du flux spécifié. Remarque : Les paramètres stream et filename sont incompatibles. Si les deux sont utilisés en même temps, une ValueError sera générée. Par exemple, l'enregistreur racine est initialisé en personnalisant logging.basicConfig(**kwargs). ci-dessous. Obtenez les enregistrements de journal au niveau DEBUG et supérieur et enregistrez-les dans le fichier log.txt. |
logging.getLogger(name)
Par défaut, le logger adopte une structure hiérarchique, et les différents niveaux sont distingués par .
. Par exemple, s'il existe un enregistreur nommé foo
, alors foo.a
et foo.b
sont tous deux enfants de foo</ code> enregistreur de niveau. Bien entendu, le premier enregistreur de niveau supérieur est l'enregistreur racine. Si name=None, le logger racine est construit. <p></p>Vous pouvez utiliser directement le nom du module actuel comme nom de l'enregistreur <code> logging.getLogger(__name__)
logging.getLogger(name)
实例化记录器
默认情况下,记录器采用层级结构,通过 .
来区分不同的层级。比如 有个名叫 foo
的记录器 则 foo.a
和 foo.b
都是 foo
的子级记录器。当然,最开始的或者说最上层的记录器就是 root logger。如果 name=None,构建的是root logger。
可以直接用当前模块的名称当作记录器的名字 logging.getLogger(__name__)
子级记录器通常不需要单独设置日志级别以及 Handler,如果子级记录器没有单独设置,则它的行为会委托给父级。比如说,记录器foo
的级别为INFO,而foo.a
和 foo.b
都不设置日志级别。此时foo.a
和 foo.b
会遵循foo
Les enregistreurs de niveau enfant n'ont généralement pas besoin de définir le niveau de journalisation et le gestionnaire séparément. Si l'enregistreur de niveau enfant n'a pas If défini individuellement, son comportement est délégué au parent. Par exemple, l'enregistreur foo
a un niveau INFO, mais ni foo.a
ni foo.b
n'ont de niveau de journalisation défini. À ce stade, foo.a
et foo.b
suivront le paramètre de niveau de foo
, c'est-à-dire uniquement les journaux dont le niveau est supérieur à ou égal à INFO sera enregistré ; et si foo S'il n'est pas défini, le logger racine sera trouvé. Le niveau de racine par défaut est WARGING.
Quelques méthodes couramment utilisées de la classe logger
method | Description de la fonction | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Logger.setLevel() | Définir le niveau de message de journal que l'enregistreur (Logger) traitera | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Logger .addHandler() | Ajouter un objet gestionnaire | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Logger.removeHandler() | Supprimer un objet gestionnaire | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Logger.addFilter() | Ajouter un objet filtre | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Logger.removeFilter() | Supprimer un objet filtre | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Logger.debug() | Définir la journalisation du niveau DEBUG | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Logger.info() | Définir la journalisation du niveau INFO | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Logger.warning() | Définir le niveau d'AVERTISSEMENT LOGGER.ERROR() | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Définissez un paramètre de niveau personnalisé pour créer un enregistrement de journal |
Handler.setFormatter() | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Handler.addFilter () | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Handler.removeFilter() | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
logging.StramHandler() | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
logging.FilterHandler() | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
RotationFileHandler() | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
TimeRotatingFileHandler() | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
logging.handers.HTTPHandler() | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
logging.handlers.SMTPHandler() | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Filter filter组件用来过滤 logger 对象,一个 filter 可以直接添加到 logger对象上,也可以添加到 handler 对象上,而如果在logger和handler中都设置了filter,则日志是先通过logger的filter,再通过handler的filter。由于所有的信息都可以经过filter,所以filter不仅可以过滤信息,还可以增加信息。 Filter 类的实例化对象可以通过 logging.Filter(name) 来创建,其中name 为 记录器的名字,如果没有创建过该名字的记录器,就不会输出任何日志: filter = logging.Filter("foo.a") Copier après la connexion 基本过滤器类只允许低于指定的日志记录器层级结构中低于特定层级的事件,例如 这个用 Filter 类 有 三个方法 :
Formatter 格式化日志的输出;实例化: 其中 fmt 参数 有以下选项:
例如: formatter = logging.Formatter('%(asctime)s %(levelname)-8s: %(message)s') # -表示右对齐 8表示取8位 handler.formatter = formatter Copier après la connexion datefmt 参数 有以下选项:
例如: formatter = logging.Formatter('%(asctime)s %(levelname)-8s: %(message)s') # -表示右对齐 8表示取8位 handler.formatter = formatter Copier après la connexion datefmt 参数 有以下选项:
例子: formatter = logging.Formatter("%(asctime)s %(levelname)s %(message)s","%Y%m%d-%H:%M:%S") handler.formatter = formatter Copier après la connexion logging 的配置
在 loguser.conf 中 写入相关的信息 [loggers] keys=root,fileLogger,rotatingFileLogger [handlers] keys=consoleHandler,fileHandler,rotatingFileHandler [formatters] keys=simpleFormatter [logger_root] level=INFO handlers=consoleHandler [logger_fileLogger] level=INFO handlers=fileHandler qualname=fileLogger propagate=0 [logger_rotatingFileLogger] level=INFO handlers=consoleHandler,rotatingFileHandler qualname=rotatingFileLogger propagate=0 [handler_consoleHandler] class=StreamHandler level=INFO formatter=simpleFormatter args=(sys.stdout,) [handler_fileHandler] class=FileHandler level=INFO formatter=simpleFormatter args=("logs/fileHandler_test.log", "a") [handler_rotatingFileHandler] class=handlers.RotatingFileHandler level=WARNING formatter=simpleFormatter args=("logs/rotatingFileHandler.log", "a", 10*1024*1024, 50) [formatter_simpleFormatter] format=%(asctime)s - %(module)s - %(levelname)s -%(thread)d : %(message)s datefmt=%Y-%m-%d %H:%M:%S Copier après la connexion
from logging import config with open('./loguser.conf', 'r', encoding='utf-8') as f: ## 加载配置 config.fileConfig(f) ## 创建同名Logger,其按照配置文件的handle,formatter,filter方法初始化 logger = logging.getLogger(name="fileLogger") Copier après la connexion
在 loguser.yaml文件 中 配置相关信息 version: 1 disable_existing_loggers: False # formatters配置了日志输出时的样式 # formatters定义了一组formatID,有不同的格式; formatters: brief: format: "%(asctime)s - %(message)s" simple: format: "%(asctime)s - [%(name)s] - [%(levelname)s] :%(levelno)s: %(message)s" datefmt: '%F %T' # handlers配置了需要处理的日志信息,logging模块的handler只有streamhandler和filehandler handlers: console: class : logging.StreamHandler formatter: brief level : DEBUG stream : ext://sys.stdout info_file_handler: class : logging.FileHandler formatter: simple level: ERROR filename: ./logs/debug_test.log error_file_handler: class: logging.handlers.RotatingFileHandler level: ERROR formatter: simple filename: ./logs/errors.log maxBytes: 10485760 # 10MB #1024*1024*10 backupCount: 50 encoding: utf8 loggers: #fileLogger, 就是在代码中通过logger = logging.getLogger("fileLogger")来获得该类型的logger my_testyaml: level: DEBUG handlers: [console, info_file_handler,error_file_handler] # root为默认情况下的输出配置, 当logging.getLogger("fileLoggername")里面的fileLoggername没有传值的时候, # 就是用的这个默认的root,如logging.getLogger(__name__)或logging.getLogger() root: level: DEBUG handlers: [console] Copier après la connexion 同样的可以通过导入 yaml 文件加载配置 with open('./loguser.yaml', 'r', encoding='utf-8') as f: yaml_config = yaml.load(stream=f, Loader=yaml.FullLoader) config.dictConfig(config=yaml_config) root = logging.getLogger() # 子记录器的名字与配置文件中loggers字段内的保持一致 # loggers: # my_testyaml: # level: DEBUG # handlers: [console, info_file_handler,error_file_handler] my_testyaml = logging.getLogger("my_testyaml") Copier après la connexion logging 和 print 的区别看起来logging要比print复杂多了,那么为什么推荐在项目中使用 logging 记录日志而不是使用print 输出程序信息呢。 相比与print logging 具有以下优点:
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!
Article précédent:Comment redimensionner, recadrer, faire pivoter et retourner des images en Python
Article suivant:Comment utiliser python-docx
Déclaration de ce site Web
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
Derniers articles par auteur
Derniers numéros
Rubriques connexes
Plus>
|