首页 > 解决方案 > 记录 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()没有改变任何东西

标签: loggingpython-3.6

解决方案


经过一些研究和大量测试,我找到了解决方案。为了在日志输出中包含模块名称,您可以通过 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

推荐阅读