如何全局向 Python Logger 对象添加处理程序?

Pau*_*gel 4 python logging

我想为我的项目创建一个记录器,它有一个跨所有子模块工作的自定义处理程序,并记录未捕获的异常。以下是我的概念验证;请注意,我使用文件处理程序作为最终的自定义处理程序的替代。

主要.py:

import logging
import sys
from module import divide

logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)

fh = logging.FileHandler("test.log")
fh.setLevel(logging.INFO)
logger.addHandler(fh)

def uncaught_error(exc_type, exc_value, exc_traceback):
    logger.error("Uncaught Exception", exc_info = (exc_type, exc_value, exc_traceback))
    sys.__excepthook__(exc_type, exc_value, exc_traceback)
    return

sys.excepthook = uncaught_error

if __name__ == '__main__':
    logger.info("first division problem")
    print(divide(5,2))
    logger.info("second division problem")
    print(divide(10,0))
    logger.info("end")
Run Code Online (Sandbox Code Playgroud)

模块.py:

import logging

logger = logging.getLogger(__name__)

def divide(a, b):
    logger.info("dividing " + str(a) + " by " + str(b))
    return a/b
Run Code Online (Sandbox Code Playgroud)

运行 main.py 后,这是 test.log 的输出:

first division problem
second division problem
Uncaught Exception
Traceback (most recent call last):
  File "main.py", line 23, in <module>
    print(divide(10,0))
  File "/some/path/logging_test/module.py", line 7, in divide
    return a/b
ZeroDivisionError: division by zero
Run Code Online (Sandbox Code Playgroud)

module.py 中未捕获的异常被完美地记录下来,但是该行

logger.info("dividing " + str(a) + " by " + str(b))
Run Code Online (Sandbox Code Playgroud)

显然什么也没做(也没有控制台输出)。有什么错误吗?

小智 7

我刚刚遇到这个问题,我的根日志记录格式没有在其他子模块中使用。我通过改变解决了这个问题

logger = logging.getLogger(__name__)

在 main.py 模块中

logger = logging.getLogger()

这样它实际上获取的是root记录器而不是__main__记录器。

请参阅https://docs.python.org/2/library/logging.html#logging.getLogger