2017-07-17 29 views
0

我在我正在處理的Python應用程序中格式化記錄器輸出時遇到了一些問題。目前,我在一個獨立的文件中創建我的記錄並將其存儲在像這樣一類變量...Python記錄器消息顯示在單獨的行上

import logging 

    class Logging(): 
     FORMAT = '[%(levelname)s]: %(asctime)-15s' 
     logging.basicConfig(format=FORMAT) 
     logger = logging.getLogger('Mariner') 
     ch = logging.StreamHandler() 
     logger.addHandler(ch) 
     logger.setLevel(logging.INFO) 

對於我所有的類,需要登錄的功能,我只需導入我的記錄器類,如下所示:

import Logging from Logging 

然後我繼續參考Logger類變量在使用像這樣:

Logging.logger.info("some message") 

在記錄消息時出現在我的控制檯,它們跨越兩行用拳頭CON包含格式化的輸出,第二個包含純文本消息。例如:在第二行一旦上了第一線W /格式化,而一旦沒有:

[INFO]: 2017-07-16 19:28:47,888 
    writing book state to mongo db... 

我也試着明確添加消息屬性來我的格式化字符串,但該結果的消息在被打印兩次。

我是新來的Python日誌記錄,並看到其他用戶確定他們的問題是由多個處理程序連接引起的。不過,我不認爲這是真的,因爲我試圖宣佈我的記錄器一次,並跨班分享同一個實例。如果確實是這個問題,我很抱歉問一個重複的問題,並會感激某種方向。我注意到我正在獨立的線程上運行的進程中使用相同的記錄器,但是我已經讀了一些關於python中的日誌實現,它似乎是線程安全的。

回答

0

不需要添加其他StreamHandler中,因爲logging.basicConfig會StreamHandler中添加至根記錄。 https://docs.python.org/2/library/logging.html#logging.basicConfig

改變你的代碼下面應該工作。

FORMAT = '[%(levelname)s]: %(asctime)-15s %(message)s' 
logging.basicConfig(format=FORMAT, level=logging.INFO) 
logger = logging.getLogger('Mariner') 
logger.info('some message') 

應登錄一行

[INFO]: 2017-07-16 23:35:49,721 some message 
0

你實際上正在陷入「多處理程序附加問題」。你正在用你的第一條消息觸及某種默認處理程序,然後由StreamHandler打印出實際的消息。如果刪除不要將StreamHandler添加到記錄器並將格式字符串更改爲'[%(levelname)s]: %(asctime)-15s',則應該在一行上打印日誌。

順便說一句,我不認爲把你的記錄器放在課堂上是有幫助的。我認爲最好在啓動時初始化一次,然後讓不同的線程通過名稱引用它(或者返回由getLogger返回的記錄器的包裝器方法,也許這個名稱可以存儲在一個常量中)

+0

太棒了。一旦我獲得了聲譽,我就會高興起來。爲了迴應你的問題,讓記錄器成爲共享常數的想法正是我所要做的。當我在代碼中引用記錄器時,我正在做這樣的事情......「從記錄導入記錄」,然後按照「Logging.logger ...」的用法。我想也許封裝這個對象的類沒有必要?我對Python編程新手(但絕對不是新的面向對象的通用設計)。 – user8260860

相關問題