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
,Filter
及Layout
使用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模块日志流处理流程
https://blog.yjll.blog/post/2c25ac60.html