python程序可以在运行其余代码之前配置日志记录吗?

时间:2016-08-05 15:49:23

标签: python logging

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

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

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

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

我在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()

2 个答案:

答案 0 :(得分: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

希望它有所帮助!

答案 1 :(得分:1)

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

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) 

如果您检查文件,则应该在其中包含例外。