Python logging模块日志流处理流程

logger是Python标准库的一部分,根据PEP 282中描述,设计时也参考了Java的日志,所以处理流程上和jul、Log4j有跟多相似之处。

logging模块的四大组件

组件名称 对应类名 功能描述
日志器 Logger 提供了应用程序可一直使用的接口
处理器 Handler 将logger创建的日志记录发送到合适的目的输出
过滤器 Filter 提供了更细粒度的控制工具来决定输出哪条日志记录,丢弃哪条日志记录
格式器 Formatter 决定日志记录的最终输出格式

logging模块就是通过这些组件来完成日志处理的,上面所使用的logging模块级别的函数也是通过这些组件对应的类来实现的。

这些组件之间的关系描述:

日志器(logger)需要通过处理器(handler)将日志信息输出到目标位置,如:文件、sys.stdout、网络等。不同的处理器(handler)可以将日志输出到不同的位置。日志器(logger)可以设置多个处理器(handler)将同一条日志记录输出到不同的位置。每个处理器(handler)都可以设置自己的过滤器(filter)实现日志过滤,从而只保留感兴趣的日志。每个处理器(handler)都可以设置自己的格式器(formatter)实现同一条日志以不同的格式输出到不同的地方。

简单点说就是:日志器(logger)是入口,真正干活儿的是处理器(handler),处理器(handler)还可以通过过滤器(filter)和格式器(formatter)对要输出的日志内容做过滤和格式化等处理操作。

如果和Logback类比的话这几个组件分别对应的是 Logger,Appender,FilterLayout

使用yaml进行日志配置

version: 1
formatters:
  simple:
    format: '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
handlers:
  console:
    class: logging.StreamHandler
    level: DEBUG
    formatter: simple
  file:
    class: logging.FileHandler
    filename: logging.log
    encoding: utf-8
    level: INFO
    formatter: simple
  
loggers:
  simpleLogger:
    level: INFO
    handlers: [console,file]
    propagate: no
root:
  level: INFO
  handlers: [console]
  
import logging.config
import yaml

config = None
with open('log.yaml', 'r') as f:
    config = yaml.safe_load(f.read())
    logging.config.dictConfig(config)

def getLogger():
    return logging.getLogger('simpleLogger')

if __name__ == "__main__":
    logger = getLogger()
    
    logger.debug('debug')
    logger.info('info:%s','message')
    logger.error('error')
    

simpleLogger配置的日志级别为INFO,debug的日志没有打印

2020-11-02 16:22:09,194 - simpleLogger - INFO - info:message
2020-11-02 16:22:09,195 - simpleLogger - ERROR - error

参考文档

Python之日志处理(logging模块)

logback 中文手册


Python logging模块日志流处理流程
https://blog.yjll.blog/post/2c25ac60.html
作者
简斋
发布于
2020年11月2日
许可协议