logging - 记录 Python。如何在 NullHandler 中设置模块名称
问题描述
我正在编写一个包含多个模块的备份程序。在这些模块中的每一个中,都有几个带有一些调试和信息消息的类。其中一个模块称为 logger.py,它负责使用 StreamHandler、RotateHandler 和 FileHandler 创建记录器对象,而在其他模块中我插入了一个 NullHandler。目的是能够将记录器导入运行程序的 main.py 文件并拥有一个日志文件。这里我的项目文件夹结构简化:
├── modules
│ ├── __init__.py
│ ├── module1.py
│ ├── module2.py
│ ├── module3.py
│ ├── logger.py
|
└── main.py
这是代码logger.py
:
def logger():
log_name = mypath/mylog.log
log = logging.getLogger()
log.setLevel(logging.DEBUG)
formatter = logging.Formatter("[%(name)s][%(levelname)s]%(funcName)20s =>%(message)s")
file_handler = logging.FileHandler(log_name)
file_handler.setFormatter(formatter)
log.addHandler(file_handler)
...... other handlers......
return log
在module1
, module2
,module3
在我写的文件的开头:
import logging.handlers
log = logging.getLogger('module_name')
null_handler = logging.NullHandler()
log.addHandler(null_handler)
在main.py
:
from modules import logger
log = logger()
log.dubug("Some messages..")
log.info("other messages..")
现在这工作正常,除了模块的名称在输出中以 root 身份退出,而我希望它以当时正在运行的模块的名称退出。奇怪的是,输出module1.py
如我所愿,而其他人则不然。
这里有一个例子:
[module1][DEBUG] myfunction => message in module1
[root][DEBUG] <module> => message in main
[root][DEBUG] <module> => message in main
[root][INFO] <module> => message in module2
[root][DEBUG] <module> => message in module3
设置__name__
并 log = logging.getLogger()
没有改变任何东西
解决方案
经过一些研究和大量测试,我找到了解决方案。为了在日志输出中包含模块名称,您可以通过 2 种方式:
将日志设置为类属性
import logging.handlers
log = logging.getLogger('module_name')
null_handler = logging.NullHandler()
log.addHandler(null_handler)
class MyClass:
self.log = log
然后对于类中的每个日志消息:
self.log.debug("This will have custome logger name!!")
运行时输出main.py
:
[module_name][DEBUG] <module> => This will have custom logger name!!
将日志设置为类变量
这个解决方案更好,因为它更灵活。您可以为同一模块中的每个类设置自定义记录器名称。
import logging.handlers
class Class1:
log = logging.getLogger('class1')
null_handler = logging.NullHandler()
log.addHandler(null_handler)
self.log.debug("Im in Class1")
class Class2:
log = logging.getLogger('class2')
null_handler = logging.NullHandler()
log.addHandler(null_handler)
self.log.debug("Im in Class2")
输出:
[class1][DEBUG] <module> => Im in Class1
[class2][DEBUG] <module> => Im in Class2
推荐阅读
- database - 用于内部和外部使用的 postgresql 数据库设置
- r - 使用管道和 dplyr 将项目附加到列表
- android - 请求重试最佳实践
- python - 后 Django 测试过程中的错误
- html - 将多个静态文本覆盖添加到内联 SVG
- reactjs - (react-native-tab-view) 在 TabBar 中使用 navigation.navigate?
- scalardb - 如果执行重复的 Put,ScalarDB 是否会抛出 NoMutationApplied 异常
- pandas - 不再可以用日期索引 pandas DatetimeIndex?
- makefile - 有没有办法使用标准的 linux 命令行工具将全局文件复制到具有新文件扩展名的同一目录中?
- javascript - 如何使用 useEffect 取消选中