注意:此问题基于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()
答案 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)
如果您检查文件,则应该在其中包含例外。