我試圖用Python的日誌記錄模塊替換臨時日誌記錄系統。我正在使用日誌記錄系統在單行上輸出長時間任務的進度信息,因此您可以在日誌中或在控制檯中觀看日誌。我通過在我的日誌記錄功能上設置了一個標誌來抑制該日誌消息的換行符並逐個構建行。在Python日誌記錄模塊中取消換行
所有的日誌都是從一個線程完成的,所以沒有序列化問題。
是否可以使用Python的日誌記錄模塊做到這一點?這是個好主意嗎?
我試圖用Python的日誌記錄模塊替換臨時日誌記錄系統。我正在使用日誌記錄系統在單行上輸出長時間任務的進度信息,因此您可以在日誌中或在控制檯中觀看日誌。我通過在我的日誌記錄功能上設置了一個標誌來抑制該日誌消息的換行符並逐個構建行。在Python日誌記錄模塊中取消換行
所有的日誌都是從一個線程完成的,所以沒有序列化問題。
是否可以使用Python的日誌記錄模塊做到這一點?這是個好主意嗎?
讓我們從最後一個問題開始:不,我不相信這是個好主意。 國際海事組織,從長遠看,它傷害了日誌文件的可讀性。
我建議堅持使用logging模塊並在'tail'命令中使用'-f'選項來觀察控制檯的輸出。您可能最終會使用FileHandler。注意'delay'的默認參數是False,這意味着輸出不會被緩衝。
如果你真的需要抑制換行符,我會建議創建自己的Handler。
將新行\n
插入StreamHandler
類中。
如果你真的設置固定這種行爲,那麼這裏的我是如何解決這個由monkey patching的logging.StreamHandler類中的emit(self, record)
方法的例子。
猴子補丁是一種擴展或修改動態語言的運行時代碼而不改變原始源代碼的方法。這個過程也被稱爲鴨子衝壓。
這裏是emit()
自定義實現省略了換行:
def customEmit(self, record):
# Monkey patch Emit function to avoid new lines between records
try:
msg = self.format(record)
if not hasattr(types, "UnicodeType"): #if no unicode support...
self.stream.write(msg)
else:
try:
if getattr(self.stream, 'encoding', None) is not None:
self.stream.write(msg.encode(self.stream.encoding))
else:
self.stream.write(msg)
except UnicodeError:
self.stream.write(msg.encode("UTF-8"))
self.flush()
except (KeyboardInterrupt, SystemExit):
raise
except:
self.handleError(record)
然後你會做一個自定義日誌記錄類(在這種情況下,從TimedRotatingFileHandler
子類)。
class SniffLogHandler(TimedRotatingFileHandler):
def __init__(self, filename, when, interval, backupCount=0,
encoding=None, delay=0, utc=0):
# Monkey patch 'emit' method
setattr(StreamHandler, StreamHandler.emit.__name__, customEmit)
TimedRotatingFileHandler.__init__(self, filename, when, interval,
backupCount, encoding, delay, utc)
有些人可能會認爲,這種類型的解決方案是不Python的,或什麼的。可能是這樣,所以要小心。
另外,請注意,這將全局修補SteamHandler.emit(...)
,所以如果您使用多個日誌記錄類,那麼此修補程序也會影響其他日誌記錄類!
查閱這些進一步閱讀:
希望有所幫助。
如果您想這樣做,您可以更改日誌處理程序終止符。我正在使用Python 3.4。正如Ninjakannon所述,它是在Python 3.2中引入的。
handler = logging.StreamHandler()
handler.terminator = ""
當StreamHandler寫入它時,最後寫入終止符。
這是[在Python 3.2中引入的](https://docs.python.org/3/library/logging.handlers.html#streamhandler)。 – Ninjakannon
如果您想在同一行中記錄多個事物,請考慮不要使用'logging',而是使用一個好的舊文件對象並直接寫入它(並將其寫入到與其他基於行的日誌文件不同的文件中,東西)。 – ThiefMaster
@ThiefMaster我現在正在寫一個文件和stdout。這感覺就像我正在重寫日誌記錄,所以我寧願使用日誌記錄,如果它結束了更少的努力。 –