情况
在我的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),这不是我想要的。
我做错了什么?
发布于 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__'
https://stackoverflow.com/questions/51141691
复制相似问题