python - 使用相同的记录器通过 python 日志记录分离文件输出
问题描述
使用以下代码,我将信息日志写入 info.log 并将错误日志写入 error.log
import logging
logger_info = logging.getLogger('info')
logger_err = logging.getLogger('err')
logger_info.setLevel(logging.INFO)
logger_err.setLevel(logging.WARNING)
info_file_handler = logging.FileHandler('info.log')
error_file_handler = logging.FileHandler('error.log')
logger_info.addHandler(info_file_handler)
logger_err.addHandler(error_file_handler)
logger_info.info('info test')
logger_err.error('error test')
现在我使用 2 个记录器:logger_err 和 logger_info。
我可以将这 2 个记录器转换为 1 个记录器,它们logger_info.info
将写入info.log
并logger_info.error
写入error.log
解决方案
这并不常见,因为日志记录通常会处理严重性高于阈值的消息,但可以通过使用 2 个处理程序和自定义过滤器来实现:
- 您将处理程序附加到具有 ERROR 级别的记录器并使其写入 error.log 文件
- 您将第二个处理程序附加到具有 INFO 级别的同一记录器并使其写入 info.log 文件
- 您将自定义过滤器添加到第二个处理程序以拒绝级别高于 INFO 的消息
演示:
class RevFilter:
"""A filter to reject messages ABOVE a maximum level"""
def __init__(self, maxLev):
self.maxLev = maxLev
def filter(self, record):
return record.levelno <= self.maxLev
hinf = logging.FileHandler('/path/to/info.log')
herr = logging.FileHandler('/path/to/error.log')
herr.setLevel(logging.ERROR)
hinf.setLevel(logging.INFO)
hinf.addFilter(RevFilter(logging.INFO))
logger = logging.getLogger(name)
logger.addHandler(hinf)
logger.addHandler(herr)
logger.setLevel(logging.INFO) # or lower of course...
从那时起,文件error.log将接收logger
ERROR或更高级别发送的消息,而info.log将仅接收INFO级别的消息,不高也不低。
推荐阅读
- maven - 使用 Maven Tycho 和 Eclipse RCP 构建客户端应用程序分发
- sequence-diagram - 序列图中前端页面之间的交互
- c# - 未应用 DbSet 的动态包含操作
- visual-studio-code - 如何禁用特定扩展的 vscode-code-runner?
- angular - 无法在 Ionic 中使用 SQLite 创建数据库
- sql - 我可以在 DB2 中找到包含某个列的所有存储过程吗?
- javascript - 如何通过嵌套表单字段的值更新数据对象
- python - python套接字服务器中的客户端线程
- c# - 如果内容不合适,XtraReports 分页?
- linux - sh 奇怪的命令输出 - vscode 远程 ssh