【问题标题】:Can a python program configure logging before running the rest of code?python 程序可以在运行其余代码之前配置日志记录吗?
【发布时间】:2016-08-05 15:49:23
【问题描述】:

注意:此问题基于 Python 通过日志记录发出错误消息的假设。答案表明假设是错误的。


我正在开发一个程序,它不是从命令行启动,而是由守护进程启动。 Stderr 被重定向到空设备。

通常它会将消息记录到文件中,但是当某些错误阻止正常启动时,没有要读取的错误消息,因为它被发送到空设备。

为了在这种情况下节省一点调试时间,我尝试了一个小“启动器”,它首先将文件处理程序添加到根记录器。

我已经在realprog 模块中使用故意的语法错误对其进行了测试。它将两个“开始”消息记录到文件中,但语法错误的回溯仍然打印到 stderr。你能帮忙吗?

import logging

logger = logging.getLogger()
logger.setLevel(logging.INFO)
logger.addHandler(logging.FileHandler('test.log'))
logger.info("logging start")

def real_start():
    # assume e.g. a syntax error in the realprog
    import realprog
    realprog.main()

if __name__ == '__main__':
    logger.info("program start")
    real_start()

【问题讨论】:

  • 你能发布你的错误信息吗?
  • @HaifengZhang: import realprog 失败,语法错误如预期。没有其他消息。它是带有标准回溯的标准消息。消息本身没有任何问题,只是它被打印出来,而不是记录到文件中。你需要这个错误信息吗?

标签: python logging


【解决方案1】:

你可以使用:

if __name__ == '__main__':
    logger.info("program start")
    try:
        real_start()
    except Exception:
        # This will log the traceback.
        logger.exception("An error ocurred.")

但是,您应该将记录器级别至少提高到logging.ERROR

希望对你有帮助!

【讨论】:

  • 我可以确认它有效并且有帮助。谢谢。但是该消息是明确记录的。似乎当 Python 抱怨语法错误时,它绕过了日志记录。有人可以确认吗?
  • logging 模块不会捕获您所期望的异常。
  • 我期待 Python 解释器通过日志记录发出错误消息。
  • 但这不是logging 的工作方式。你有责任记录你想要的任何东西。
  • 我明白了。我在这个问题上添加了一个注释,这只是(我的)误解。
【解决方案2】:

您没有将异常传递给您的记录器,因此它无法编写它。

在您的 real_start() 中,将您的 import 语句和您的函数调用放入 try、catch 中,然后记录异常。

例如,假设您的 realprog.main() 将一个数字除以零,我想记录异常,所以我这样做了。

def real_start():
    try:
        import realprog
        realprog.main()
    except ZeroDivisionError as e:
        logger.info(e, exc_info=True) 

如果你检查你的文件,你应该有它里面的异常。

【讨论】:

  • 是的,我没有将异常传递给日志系统。但无论如何它都会被打印出来。这就是为什么我假设 Python 解释器可以做到这一点。
猜你喜欢
  • 2010-12-28
  • 2018-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-31
  • 1970-01-01
  • 2022-08-17
  • 1970-01-01
相关资源
最近更新 更多