繁体   English   中英

仅在实际发生错误的情况下,如何仅将python错误(stderr)保存到日志文件?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM