子模块中忽略的Python日志记录处理程序

时间:2018-07-02 18:14:32

标签: python logging

情况

我在main.py

中配置了日志记录处理程序
logger = logging.getLogger("__name__")
fh = logging.FileHandler("./log/error.log")
fh.setLevel(logging.WARN)
logger.addHandler(fh)

在我的main.py中,我正在子模块@staticmethod中调用一些sub.py。由于这些是静态的,因此在开始的每种方法中,我都使用main.py 来获取logger = logging.getLogger(__name__)的记录器(也许您知道一种更好的方式来获取该记录器?目前正在破坏{{1 }}天哪)

问题

例如,当我使用{ DRY,然后将其保存为我配置的main.py文件。它将发送到控制台,就像我想要的那样。 但是,当我通过logger.error("something went wrong")方法执行相同的日志记录调用时,它还会发送到控制台(stderr),这不是我想要的。

我在做什么错了?

1 个答案:

答案 0 :(得分:1)

将错误级别打印到控制台是默认配置,因此main.py并未配置记录器。

那是因为main.py正在配置一个名叫“ __name__”的记录器。 Sub正在配置一个名为“ main.sub”的记录器(假设使用基本的包结构并执行main.py)。

修复

最快的解决方法是在main.py中更新此行:

logger = logging.getLogger("main")

对logger main.sub的调用将冒泡到logger main并被其处理程序捕获。

带走

您可能仍想在main.py中使用__name__,因为您已经阅读了这是一个好习惯。只有其他模块调用的模块才是这种情况。请记住以下几点:

如果您运行 python main.py

'__name__' in main.py is still the same
__name__ in main.py resolves to '__main__'
__name__ in sub.py resolves to 'main.sub'

如果您运行 python sub.py

'__name__' in main.py is still the same
__name__ in main.py resolves to 'main'
__name__ in sub.py resolves to '__main__'