2016-09-22 40 views
0

python日誌記錄模塊有一個通用模式(ex1,ex2),其中每個模塊中爲每個python模塊獲取一個新的日誌記錄器對象。爲什麼要在每個新模塊中獲取新的記錄器對象?

我不是盲目追隨模式的粉絲,所以我想多瞭解一點。

爲什麼要每一個新的模塊中的一個新的記錄器對象?

爲什麼不讓每個人都使用相同的根記錄器並將格式器配置爲%(module)s

是否有示例,其中該模式是必要的/需要(即某種性能原因[1],因爲)?

[1] 在一個多線程的python程序中,是否存在某種通過使用多個日誌記錄對象修復的隱藏同步問題?

+0

相關的問題,但可能需要一個新的計算器問題本身:如果您有多個日誌記錄都使用相同的控制檯,流對象,和/或文件處理程序是有一個隱藏的同步問題(只有一個線程可以讀/寫的文件一次)? –

+0

'logging'被定義爲線程安全的,因此記錄器*可以使用鎖寫入其日誌。這意味着在多線程環境中使用是安全的。但是請注意,在unix系統上使用多處理時,這是一個衆所周知的問題:默認情況下'fork'不會複製鎖並在罕見情況下導致死鎖。看[這裏](http://stackoverflow.com/questions/24509650/deadlock-with-logging-multiprocess-multithread-python-script)。 – Bakuriu

回答

1

每個記錄器可以單獨配置。一般來說,模塊本身並沒有配置模塊記錄器,所有。您可以創建一個獨特的記錄器並使用它來記錄不同級別的詳細信息。無論誰使用使用記錄器都會決定要查看的消息級別,發送消息的位置以及如何顯示它們。他們可能希望將一個模塊的所有內容(DEBUG及以上)記錄到一個文件中,而另一個模塊則可能只關心是否發生嚴重錯誤(在這種情況下,他們希望通過電子郵件直接發送給他們)。如果每個模塊使用相同的(根)記錄器,則不會有這種靈活性。

1

記錄器名稱定義凡在你的應用程序事件(邏輯)發生。因此,推薦模式

logger = logging.getLogger(__name__) 

使用跟蹤Python包層次結構的記錄器名稱。這反過來又允許任何正在配置日誌記錄的人爲特定記錄器打開或關閉詳細信息。如果一切都只使用根記錄器,則無法獲得細節的細節控制,當系統達到一定的大小/複雜度時這一點很重要。

記錄器名稱不需要精確地跟蹤包的名字 - 你可以在一定的封裝中的多個記錄器,例如。主要的決定因素是需要多大的靈活性(如果你正在編寫一個應用程序),也許還需要你的用戶需要多大的靈活性(如果你正在編寫一個庫)。

+0

「當系統達到一定的大小/複雜度時」:我認爲在中小程序中,模式並不那麼重要。但隨着你的複雜性/規模的增長...這種模式變得更加重要/必要。 –

+0

@TrevorBoydSmith沒錯。 –

相關問題