我在 Python 設置中有一個基本的記錄器處理程序來記錄到文件。我希望此日志處理程序記錄通常會打印到控制臺的任何/所有標準輸出或標準錯誤消息,但我不想重定向或捕獲它。換句話說,我仍然希望以通常的方式打印所有內容。這里的用例是我不想用try: do_something_that_could_raise_exception()except Exception as e: logger.exception(e)相反,我只想讓應用程序運行,并能夠查看日志文件以查看遇到的任何錯誤的堆棧跟蹤。我只希望所有 stdout/stderr 消息也出現在我的日志文件中。這似乎是一個在 SO 上被多次詢問的主題的轉折。我已經閱讀了Logging Python stdout to File... with active stdout (backspacing/updating) , Redirect stdout to a file in Python? ,以及許多其他人,但這些似乎并沒有解決我的情況。我見過的所有問題都在談論如何使用多個處理程序同時打印到日志和標準輸出,或者如何將標準輸出重定向到日志以便終端中不顯示任何內容。編輯為后代編輯。經過更多搜索后,我發現https://code.tutsplus.com/tutorials/professional-error-handling-with-python--cms-25950,它演示了如何添加一個函數裝飾器,將異常定向到給定的日志處理程序. 這并不像我希望的那樣簡潔(因為我仍然必須將函數裝飾器添加到我的所有函數定義中),但它比將我的所有函數調用包裝在 try-except 中要簡潔得多。def log_error(logger) def decorated(f): @functools.wraps(f) def wrapped(*args, **kwargs): try: return f(*args, **kwargs) except Exception as e: if logger: logger.exception(e) raise return wrapped return decoratedHere is how to use it:0102030405060708091011import logginglogger = logging.getLogger()@log_error(logger)def f(): raise Exception('I am exceptional')
1 回答

千巷貓影
TA貢獻1829條經驗 獲得超7個贊
由于您似乎只對可以使用的異常sys.excepthook
而不是包裝器感興趣,如下所述:Logging uncaught exceptions in Python
這樣,它只需要定義一次,并且在定義新函數時不會忘記它。
添加回答
舉報
0/150
提交
取消