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

时间:2020-05-27 14:07:50

标签: python file logging

我已经搜索互联网,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运行的脚本时。

感谢您的答复! :-)

1 个答案:

答案 0 :(得分:0)

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

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

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