我想为我的项目创建一个记录器,它有一个跨所有子模块工作的自定义处理程序,并记录未捕获的异常。以下是我的概念验证;请注意,我使用文件处理程序作为最终的自定义处理程序的替代。
主要.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
| 归档时间: |
|
| 查看次数: |
9743 次 |
| 最近记录: |