簡體   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