通过 Python 日志记录模块将意外错误记录到文件中

Posted

技术标签:

【中文标题】通过 Python 日志记录模块将意外错误记录到文件中【英文标题】:Log unexpected errors to file via Python logging module 【发布时间】:2020-09-14 14:41:29 【问题描述】:

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

我正在关注 Python 的官方日志记录方法 - 我的记录器如下所示:

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!')

但是我怎样才能捕获错误并将它们写入我的日志文件,这些错误是不可预测的或主要不是用户预期的? (=> 所以没有尝试/除外)

您有时只是在错误发生之前不知道错误。例如,当我通过 cronjob 运行脚本时。

感谢您的回复! :-)

【问题讨论】:

【参考方案1】:

我相信您正在寻找以下标志:exc_info

try:
    var += 1
except Exception as e:
    logging.critical(e, exc_info=True)

这将捕获生成的错误消息并将其传播到日志记录。另见https://***.com/a/29556251/8140659

【讨论】:

感谢您的回复!这与我使用“logger.exception”几乎相同。也许我的问题表述得不够清楚:我想记录没有“try/except”代码块的错误。 也许你可以澄清为什么你不想使用 try/except。更容易思考。 因为那时我需要在我的代码中尝试/除一千次,例如每当我进行数据库查询时。 我明白了,这取决于您如何使用代码,将所有内容包装在一个 try/expect 中将是一种简单的方法,对吧? dkreft 是对的——这是回答问题的方法:所有代码都在 try 中,最后的 except 捕获所有致命错误和任何日志记录值。谢谢!

以上是关于通过 Python 日志记录模块将意外错误记录到文件中的主要内容,如果未能解决你的问题,请参考以下文章

仅在出现错误时创建 Python 日志文件(使用日志记录模块)

python日志模块-logging

Python日志—Python日志模块logging介绍

使用日志记录 Python 保存严重错误

python日志模块记录三_日志命名_日志轮转

logging模块基础