通过Python logging模块将意外错误记录到文件

8

我已经在互联网、Python官方文档和StackOverflow上搜索了相当长的时间,但似乎找不到一个合适的答案。

我正在按照Python官方的日志记录HOWTO操作 - 我的记录器看起来像这样:

import os, logging
os.chdir("C:/Users/kerfuffle/Desktop/logtest")

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

fh = logging.FileHandler("logging.log")
fh.setLevel(logging.INFO)
sh = logging.StreamHandler()
sh.setLevel(logging.DEBUG)

formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
fh.setFormatter(formatter)
sh.setFormatter(formatter)

logger.addHandler(fh)
logger.addHandler(sh)

logger.debug("debug!")
logger.info("info!")
logger.warning("warning!")

代码的最后 3 行运行良好,我们也通过 StreamHandler 得到了适当的输出。 logging.log - 文件:
2020-05-27 15:41:59,586 - INFO - info!
2020-05-27 15:41:59,586 - WARNING - warning!

控制台输出:

2020-05-27 15:41:59,584 - DEBUG - debug!
2020-05-27 15:41:59,586 - INFO - info!
2020-05-27 15:41:59,586 - WARNING - warning!

我不理解的是以下内容: 如果我故意制造一个错误,我期望它能够被记录到文件中。因此,我将尚未定义的变量"var"添加到我的脚本中:

var += 1

如上所示,我将在控制台中StreamHandler()日志旁边接收标准错误输出:

2020-05-27 15:45:37,444 - DEBUG - debug!
2020-05-27 15:45:37,445 - INFO - info!
2020-05-27 15:45:37,451 - WARNING - warning!
Traceback (most recent call last):
  File "c:/Users/kerfuffle/Desktop/logtest/file.py", line 23, in <module>
    var += 1
NameError: name 'var' is not defined

我的日志文件仅显示:

2020-05-27 15:45:37,445 - INFO - info!
2020-05-27 15:45:37,445 - WARNING - warning!

根据教程,我知道我可以通过以下方式尝试转义所有内容:

try:
    var += 1
except Exception:
    logger.exception("You moron! Don't do that") #or
    logger.error('What a stupid error!')

然而,如果用户无法预测或主要不会预料到错误,我该如何捕获并将它们写入日志文件呢?(=>因此不能使用try/except)

有时候你在发生错误之前是无法预知的。例如当我通过cronjob运行脚本时。

谢谢您的回复! :-)

1个回答

3

1
谢谢您的回复!这基本上与使用“logger.exception”相同。也许我表达我的问题不够清楚:我想在没有“try / except”代码块的情况下记录错误。 - kerfuffle
也许您可以澄清一下为什么不想使用try/except,这样更容易思考。 - dkreeft
因为那样我需要在我的代码中使用一千次try/except,例如每当我进行数据库查询时。 - kerfuffle
3
我明白了,根据你代码的使用情况,将所有内容放入一个try/except语句中可能是一种简单的方法,对吗? - dkreeft
dkreeft 是正确的 - 这种方法回答了问题:所有的代码都在 try 块中,而最后的 except 捕获了所有致命错误和任何记录值。谢谢! - DrWhat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接