记录 Python。如何在 NullHandler 中设置模块名称

Logging Python. How to set module name in 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

module1module2module3文件的开头我写了:

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

log = logging.getLogger() 中设置 __name__ 没有任何改变

经过一番研究和大量测试后,我找到了解决方案。 为了在日志输出中包含模块名称,您可以通过两种方式:

设置日志为class属性

import logging.handlers

log = logging.getLogger('module_name')
null_handler = logging.NullHandler()
log.addHandler(null_handler)

class MyClass:
    self.log = log

然后对于 class 中的每条日志消息:

self.log.debug("This will have custome logger name!!")

输出时 运行 main.py:

[module_name][DEBUG]  <module>     =>    This will have custom logger name!!

将日志设置为 class 变量

这个解决方案更好,因为它更灵活。您可以为同一模块中的每个 class 自定义记录器名称。

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