2016-08-05 15 views
0

注意:这个问题是基于Python通过日志记录发出错误消息的假设。答案表明这个假设是错误的。运行代码的其余部分之前,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() 
+0

你可以发布你的错误信息吗? – haifzhan

+0

@HaifengZhang:'import realprog'失败,语法错误如预期。没有其他消息。它是标准回溯的标准消息。消息本身没有任何问题,除非它被打印,没有记录到文件。你需要这个错误信息吗? – VPfB

回答

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

希望它有帮助!

+0

我可以确认它的工作原理和它有帮助。谢谢。但消息明确记录。这似乎是当Python抱怨语法错误时,它绕过了日志记录。任何人都可以证实这一点? – VPfB

+0

如果这是你所期望的,'logging'模块不会捕获异常。 – cdonts

+0

我在期待Python解释器通过日志发出错误消息。 – VPfB

1

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

在你的real_start()里面,把你的导入语句和你的函数调用放在一起try,catch然后记录这个异常。例如:

可以说例如你的realprog.main()用零除数,我想记录异常,所以我这样做。

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

如果你检查你的文件,你应该有它的例外。

+0

是的,我没有将例外传递给日志系统。但它仍然打印。这就是为什么我假定Python解释器做到这一点。 – VPfB

相关问题