python logging 日志模块

  1. 日志级别
  2. 初级使用
  3. logging的组件
    1. 记录器 logger
    2. 处理器 handler
    3. 格式器 formatter
  4. 配置日志记录
    1. 代码配置日志记录
    2. yaml配置日志记录

日志级别

级别 何时使用
DEBUG 细节信息,仅当诊断问题时适用。
INFO 确认程序按预期运行。
WARNING 表明有已经或即将发生的意外(例如:磁盘空间不足)。程序仍按预期进行。
ERROR 由于严重的问题,程序的某些功能已经不能正常执行
CRITICAL 严重的错误,表明程序已不能继续执行

初级使用

import logging
logging.warning('Watch out!')  # will print a message to the console
logging.info('I told you so')  # will not print anything

记录到文件

import logging
logging.basicConfig(filename='example.log', encoding='utf-8', level=logging.DEBUG)
logging.debug('This message should go to the log file')
logging.info('So should this')
logging.warning('And this, too')
logging.error('very bad')

logging的组件

logging采用组件的方式组合使用

logging 模块的四大组件

组件 说明
loggers 提供应用程序代码直接使用的接口
handlers 处理器将日志记录(由记录器创建)发送到适当的目标。
filters 过滤器提供了更细粒度的功能,用于确定要输出的日志记录。
formatters 用于控制日志信息的最终输出格式

记录器 logger

记录器的三个任务

  1. 记录器对程序公开了几个接口,可以用于记录日志信息
  2. 根据严重程度或者过滤器确定是否记录日志
  3. 将记录的日志发送给处理器handler

常用的接口:

  • Logger.getLogger()
  • Logger.setLevel()
  • Logger.addHandler()Logger.removeHandler()
  • Logger.addFilter()Logger.removeFilter()

以及记录日志信息方法:

  • Logger.debug()
  • Logger.info()
  • Logger.warning()
  • Logger.error()
  • Logger.exception()

其中Logger.exception()Logger.error()的区别是,前者会自动记录异常信息,后者不会。

在命名记录器时使用的一个好习惯是在每个使用日志记录的模块中使用模块级记录器,命名如下:

Logger.getLogger(__name__)

多次调用getLogger()具有相同的名称将返回对同一记录器对象的引用。

处理器 handler

hanlder将适当的(根据日志消息的严重性)日志记录发送的指定的目标。

作为示例场景,应用程序可能希望将所有日志消息发送到日志文件,将错误或更高的所有日志消息发送到标准输出,以及将所有关键消息发送至一个邮件地址。 此方案需要三个单独的处理器,其中每个处理器负责将特定严重性的消息发送到特定位置。

标准库中包含很多处理器,常用的有StreamHandlerFileHandler。更多的处理器可以在这里找到。

常用的接口:

  • Handler.setLevel()Logger.setLevel()不同,Logger的是发送给Handler的最低严重性,而Hander的是发送给目标的最低严重性。
  • Handler.setFormatter()
  • Handler.addFilter()Handler.removeFilter()

格式器 formatter

标准格式如下:

logging.Formatter.__init__(fmt=None, datefmt=None, style='%')

三个可选项分别是消息格式字符串日期格式字符串样式指示符

fmt='%(asctime)s - %(levelname)s - %(message)s'

配置日志记录

代码配置日志记录

import logging

# create logger logger = logging.getLogger('simple_example') logger.setLevel(logging.DEBUG)
# create console handler and set level to debug ch = logging.StreamHandler() ch.setLevel(logging.DEBUG)
# create formatter formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
# add formatter to ch ch.setFormatter(formatter)
# add ch to logger logger.addHandler(ch)
# 'application' code logger.debug('debug message') logger.info('info message') logger.warning('warn message') logger.error('error message') logger.critical('critical message')

yaml配置日志记录

log.py
import logging
import logging.config
import yaml

from lib.data.data import pystr

def setup_logger() -> logging.Logger: with open('logconf.yaml') as f: config = yaml.safe_load(f.read()) logging.config.dictConfig(config) logger = logging.getLogger('simpleExample')
return logger
logger = setup_logger()
logging.yaml
version: 1
formatters:
  simple:
    format: '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
handlers:
  console:
    class: logging.StreamHandler
    level: INFO
    formatter: simple
    stream: ext://sys.stdout
  debug_file_handler:
    class: logging.handlers.RotatingFileHandler
    level: DEBUG
    formatter: simple
    filename: ./log/debug.log
    maxBytes: 10485760 # 10MB
    backupCount: 20
error_file_handler:
    class: logging.handlers.RotatingFileHandler
    level: ERROR
    formatter: simple
    filename: ./log/error.log
    maxBytes: 10485760 # 10MB
    backupCount: 20
    encoding: utf8
loggers:
  pyaio:
    level: DEBUG
    handlers: [console, debug_file_handler, error_file_handler]
    propagate: no
root:
  level: DEBUG
  handlers: [console]   encoding: utf8

转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 365433079@qq.com