2011-05-06 97 views
1

我有一個用python編寫的簡單的命令行程序。程序日誌篩選使用以下方式配置的記錄模塊:不同系統中的Python日誌顯示不同的格式/級別

logging.basicConfig(level=logging.INFO, format='%(levelname)-8s %(message)s') 

奇怪的是,在我的筆記本電腦,在合適的水平程序日誌(INFO)一個與所需的格式,而當我在服務器上運行該程序,該程序僅記錄其他格式的錯誤和警告。

在我運行的Python 2.7的虛擬環境內兩個系統。環境並不完全相同。

我認爲一些模塊正在改變我的配置。我不明白爲什麼它只發生在服務器上,但有什麼辦法可以找到哪一個?

由於提前,

回答

1

伐木的basicConfig() API不會做任何事情(如記錄),如果根logger已經配置的處理程序。您的basicConfig()調用可能會被忽略,因爲服務器中的其他代碼已經爲根日誌記錄器配置了一些處理程序。

一般庫代碼不應該添加處理程序 - 這是應用程序開發人員的責任。但是,如果你是例如使用框架開發Web應用程序,該框架可能已經配置了一些處理程序。

你說「在服務器上」,但目前還不清楚是否你在談論的服務應用程序,或只是運行的恰好是一個服務器的計算機上的實用程序腳本。正如你所說,虛擬環境略有不同,所以它們之間的區別可能是尋找提示的地方。

要找出根記錄器上的配置處理程序的配置,可以使用grep basicConfig()addHandler()的相關源代碼。

另外,你可以明確地添加處理程序,而不是依靠basicConfig()來爲你做它:

f = logging.Formatter('%(levelname)-8s %(message)s') 
h = logging.StreamHandler() 
h.setFormatter(f) 
logging.getLogger().addHandler(h) 

,但是這可能會導致多條消息,如果其他控制檯處理程序也被添加到根記錄器。

+0

感謝您的幫助 – Hernan 2011-05-07 18:00:51

0

如果你認爲這是一個特定的模塊,嘗試凍結代碼,使用cx_freeze,或Py2exe。這將創建並執行可執行文件,並將它所需的模塊放入其中,以便它不依賴於系統上的模塊。

+0

感謝您的建議。看來我的程序導入的一個模塊僅在服務器中記錄了一些內容,然後我的程序配置了日誌記錄模塊。那麼所有的日誌都不是我想要的。如果在我的程序中,我會在第一行中導入和配置日誌記錄。然後,一切都按我想要的方式工作。 – Hernan 2011-05-06 09:23:03

0

Python記錄系統的配置是在Python過程是唯一的。如果有人更改進程中的日誌記錄配置,則此過程中生成的所有日誌都將遵循此配置。

相關問題