通过 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 日志记录模块将意外错误记录到文件中的主要内容,如果未能解决你的问题,请参考以下文章