记录 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
在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
在 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
我正在编写一个包含多个模块的备份程序。在这些模块中的每一个中,都有几个 类 带有一些调试和信息消息。其中一个模块称为 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
在 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