[英]How to save python Errors (stderr) to a log file ONLY in case errors actually happen?
我有一个每分钟运行一次的python脚本。 为了进行调试,我想创建带有错误/异常的文本文件,以防它们发生。 如果没有错误,我不需要任何日志文件。
编辑:我不能将我的所有代码都包装在try / except循环中,所以这无济于事。
首先,我将stderr
保存到.txt中,方法是:
sys.stderr = open('ERRORS_%s.txt' % (infile), 'a')
with open("%s_Error_Messages.txt" % (MSKSN), "a") as myfile:
myfile.close()
其次,然后我尝试在任何raise SystemExit
位置之前删除空的"%s_Error_Messages.txt" % (MSKSN)
文件,因为没有引发错误(否则,将不会达到raise SystemExit
位置)。
if os.path.getsize('ERRORS_%s.txt' % (infile)) == 0:
os.remove('ERRORS_%s.txt' % (infile))
我得到的是WindowsError: [Error 32] The process cannot access the file because it is being used by another process
。 我认为这是因为只要脚本运行, stderr
就会一直被python.exe使用。
对于第一步,我还尝试了:
if sys.stderr != 0:
sys.stderr = open('ERRORS_%s.txt' % (infile), 'a')
由于sys.stderr永远不会为0,因此这不起作用。
仅在出现实际错误的情况下如何将sys.stderr写入.txt?
除非您有大量的错误数据需要担心,否则您可以将stderr重定向到stringIO对象,然后根据内容将其写出(或不写出)
import StringIO
import sys
sys.stderr = StringIO.StringIO()
# do stuff
if sys.stderr.getvalue():
with open ("path/to/log.txt") as output:
output.write(sys.stderr.getvalue())
对于上下文管理器来说,这是一个很好的例子,它将设置替换的stderr,运行您的代码,然后在完成sys.__stderr__
stderr重置回sys.__stderr__
。
如果您无法尝试包装代码,也可以尝试使用sys.excepthook设置此功能。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.