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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了通过Python日志记录模块将意外错误记录到文件中相关的知识,希望对你有一定的参考价值。

我已经搜索互联网,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!')

但是,如何捕获用户无法预测或主要不期望的错误并将其写入日志文件? (=>请勿尝试/除外)

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

谢谢您的答复! :-)

答案

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

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

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

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

python日志模块-logging

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

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

Python中的多行日志记录

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

Python多进程记录到共享文件