Python logging
文章目录
入门
设置 logging 的完整流程
| |
包含关系:logger –> handler –> formater
- logger 中设置 handler
- handler 中设置 formater
基本功能
https://docs.python.org/zh-cn/3/howto/logging.html#logging-basic-tutorial
日志级别 level
- DEBUG
- INFO
- …
- info()
- debug()
- …
记录到文件
| |
获取命令行参数 –log=INFO
注意:需要验证输入值的合法性
1getattr(logging, loglevel.upper())
验证:
| |
设置格式 format
| |
格式内部变量名称参考 https://docs.python.org/zh-cn/3/library/logging.html#logrecord-attributes
levelname
- level
message
- 用户输入的信息部份
filename
- 当前 python 文件名
lineno
- 代码的行号
- …
注
- 这里的 levelname 等等,都是 LogRecord 类的属性
显示日期 datefmt
| |
通过设置 log format
- %(asctime)s
高级功能
logging 的 四大组件
记录器 logger
- 信息接收接口
处理程序 handlers
- 决定信息分发到哪里
过滤器 filters
- 决定是否输出信息
格式化程序 formatters
- 信息样式
负责传输信息的类
LogRecord
logger
- 以 "." 号分割的层级命名结构
- eg: 'scan.text' 'scan.html'
根 logger
- 名称:root logger
即默认的 logger
- logging.info() 对应的 logger
为每个模块生成 logger
| |
loggging.getLogger(logger_name)
- 多次调用引用的是同一个对象
消息方法
- debug()
- info()
- warning()
- error()
exception()
- 注意:输出错误的同时,还会输出调用栈
- …
配置
basicConfig()
- Logger.setLevel()
- Logger.addHandler() <—> Logger.removeHandler()
- Logger.addFilter() <—> Logger.removeFilter()
logger 的 命名层级
当前层级 logger 不能处理的 记录 [没有设置 setLevel()],会递归到上级 logger 来处理
If a level is not explicitly set on a logger, the level of its parent is used instead as its effective level. If the parent has no explicit level set, its parent is examined, and so on - all ancestors are searched until an explicitly set level is found.
Handlers 处理程序
https://docs.python.org/3/howto/logging.html#useful-handlers
用于配置的方法
- setLevel()
- addFormatter()
StreamHandler(stream=None)
用于 file-like object(object with write() and flush() methods)
https://docs.python.org/3/library/logging.handlers.html#logging.StreamHandler
方法
- emit(LogRecord_obj)
- flush()
- setStream()
属性
- terminator
- line terminator, like '\n'
注意
- 当 stream==None 时,输出到 str.err
- 即输出到控制台
FileHandler(filename, mode='a', encoding=None, delay=False)
方法
- close()
- emit()
Formatters
被绑定到 Handlers 上面
调用
streamhandler.addFormatter(your_format)
1logging.Formatter.__init__(fmt=None, datefmt=None, style='%')
格式化参数 列表
配置
使用范例
范例:
| |
使用配置文件 logging.conf 文件
loggging.config.fileConfig()
使用 dict
loggging.config.dictConfig()
异常处理
手动控制
1 2 3 4import traceback # * 把异常调用栈,转换成字符串 logging.error(traceback.format_exc())自动转换
1logging.exception(e)
多进程 multiprocessing + logging
python 官方解决方案
参考:
方法:
- 使用 logging.QueueHandler
在主进程起:
- queue 用来传递 LogRecord
listener_process 用来监听 queue, 并处理 queue 传递过来的 LogRecord,并发送给 root logger
1 2 3 4 5record = queue.get() if record is None: # We send this as a sentinel to tell the listener to quit. break logger = logging.getLogger(record.name) logger.handle(record)配置
listener 只需要配置普通的 handler, 如 FileHandler
- 负责末端 log 处理,不添加 QueueHandler, 负责造成循环处理
worker 配置添加 QueueHandler
- 其中的 logger 收到的 log, 会被传递给 queue 发送给 listener
注意:
- 这里实际上在每一个进程都设置了 logger, handler, 他们只能在当前进程生效
- 在主进程起一个 listener_process 进程
代码:
文章作者 Sawyer Zheng
上次更新 2025-02-24 (77fafc9)