首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >忽略子模块中的Python日志记录处理程序

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

Stack Overflow用户
提问于 2018-07-03 02:14:32
回答 1查看 544关注 0票数 0

情况

在我的main.py中,我的日志处理程序配置如下

logger = logging.getLogger("__name__")
fh = logging.FileHandler("./log/error.log")
fh.setLevel(logging.WARN)
logger.addHandler(fh)

在我的main.py中,我在一个子模块sub.py中调用了一些@staticmethod。因为它们是静态的,所以在开始时的每个方法中,我都使用logger = logging.getLogger(__name__)获取main.py的记录器(也许您知道获取该记录器的更好方法?目前,这是打破DRY的)。

问题

当我使用例如logger.error("something went wrong")在我的main.py中记录一些东西时,它将被保存在我的error.log文件中,就像我配置它一样。它不会像我想要的那样被发送到控制台。但是当我从我的sub.py方法执行相同的日志记录调用时,它会被发送到控制台(stderr),这不是我想要的。

我做错了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-03 08:56:04

错误级别打印到控制台是默认配置,因此main.py不会配置您的记录器。

这是因为main.py正在配置一个名为"__name__“的记录器。Sub正在配置一个名为"main.sub“的记录器(假设有一个基本的包结构,并且您执行main.py)。

解决之道

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

logger = logging.getLogger("main")

对记录器main.sub的调用将冒泡到记录器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__'
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51141691

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档