python - 为不同的记录器设置不同的文件名
问题描述
使用这个 python 代码:
import logging
log1 = logging.getLogger("module1")
log2 = logging.getLogger("module2")
如何设置log1写入fileName1和log2写入filename2?
默认情况下,它们都写入 STDERR 而不是文件
提前谢谢
解决方案
直接将相关处理程序添加到每个记录器,例如
log1.addHandler(logging.handlers.FileHandler(fileName1)
log2.addHandler(logging.handlers.FileHandler(fileName1)
您可能需要在这些处理程序上设置任何格式化程序。
请注意,此时,发送到任一记录器的消息仍将写入 stderr:logging
是处理程序树,记录记录从“叶”记录器开始,并在发送到其父记录器之前由每个记录器处理,直到根记录器。路径中的每个记录器都可能将消息打印到某些输出(例如文件、系统日志、流……)并将其发送到其父级。
有几个选项可以避免/配置/改进这种行为:
- 如果没问题,什么也不做(例如,您希望所有日志记录都转到默认输出,但有些要在其他目的地复制)
- 将这些记录器设置为不传播 (
logger.propagate = False
),在这种情况下,日志记录将在相关记录器处“停止”,并且不会再向上爬到树上 - 将 a 设置
NullHandler
为根记录器的处理程序,这样它就不会打印它接收到的消息(如果消息到达根记录器并且没有配置处理程序,StreamHandler(sys.stderr)
则自动设置 a),这允许所有消息到达根记录器并且只被放在那里,如果您想在将来添加更多处理程序,这很方便(例如,将每条日志消息发送到系统日志) - 完全禁用根记录器(
logging.getLogger().disabled = True
),但这并没有真正记录在案,而且有点不确定
推荐阅读
- c++ - 创建加密安全密码。并验证它是否有效
- python - 画布未绑定到类中的鼠标按钮,tkinter-Python3
- python-3.x - 了解如何在 `if then else` 语句中组合 `contains` `upper` 方法以使用 pandas 创建新变量
- swift - Xcode 无法连接到 SQLITE 数据库
- asp.net - How to support both kinds of URLs
- ruby - Docusign Ruby API - 尝试做某事时收到 302
- python - Python3:Azure Key Vault 密钥,创建 RAS 密钥:TypeError
- python-3.x - 获取 pyspark RDD 行的前三列
- excel - Excel - 表格标题在公式中不起作用
- mongodb - MongoDb 需要很长时间来更新文档量少的Db