繁体   English   中英

Python 登录模块未按预期工作

[英]Python logging in modules not working as expected

我确信我只是误解了它是如何工作的,但我似乎无法将日志格式传播到登录模块,除非模块“知道”调用它的模块的名称。

下面的代码演示了这个问题。 下面的代码有效,但我必须对调用它的模块的名称进行硬编码才能应用格式。

应用程序.py

import logging
import mymodule

logger = logging.getLogger('app')
log_formatter = logging.Formatter(f'%(asctime)s %(name)s[%(process)d]: %(levelname)s - %(message)s\n')
log_handler_console = logging.StreamHandler()
log_handler_console.setFormatter(log_formatter)
log_handler_console.terminator = ''
logger.addHandler(log_handler_console)

logger.error('testing 1')
mymodule.dosomething()

模块.py

import logging
logger = logging.getLogger('app.module')
def dosomething():
    logger.error('testing 2')

根据上面的代码,我得到了这个:

2022-01-09 19:01:53,986 app[46541]: ERROR - testing 1
2022-01-09 19:01:53,987 app.module[46541]: ERROR - testing 2

但是如果我将记录器的名称更改为例如“测试”,我会得到:

2022-01-09 19:21:07,590 app[46580]: ERROR - testing 1
testing 2

如果我将 module.py 第 2 行中的记录器名称更改为“app”或“app.something”以外的任何名称,则格式不再适用。 我知道 inheritance 是如何工作的(我认为)但是我怎么能在不硬编码的情况下知道调用模块的名称呢? 我确实在这里看到了一些关于 SO 的例子,但警告说这是一个坏主意。

本质上,我想做的是在主应用程序中定义日志格式,并让主应用程序调用的任何模块都使用相同的格式。 我疯了吗? 似乎是一件显而易见的事情?

您所期望的,“本质上我想做的是在主应用程序中定义日志格式,并让主应用程序调用的任何模块都使用相同的格式。”,是完全合理的。

“我怎么能在不硬编码的情况下知道调用模块的名称呢?” 您可以使用以下代码设置类似于 Python package 层次结构的记录器名称层次结构。

logger = logging.getLogger(__name__)

默认情况下在所有子记录器上启用传播,所有过滤的消息将通过层次结构向上传播,最后传播到根记录器,然后由其处理程序以其指定格式处理。

关于使用Python logging的那些做法更详细的解释,可以参考Good Practices of using Python Logging

实际上,当我仍在试图弄清楚这一点时,我已经为自己找到了答案。 而不是删除这个问题,我想我会为遇到这个问题的其他人回答这个问题。

替换两个实例(即,在主应用程序和模块中)

logger = logging.getLogger('something')

logger = logging.getLogger()

创建了一个“根”记录器,一切都按我的预期工作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM