2017-03-09 152 views
1

我對python日誌不是很熟悉,我試圖讓它將輸出記錄到控制檯。我已經得到它的工作,但似乎輸出在控制檯中看到兩次,我不知道爲什麼。我查看了其他有關類似情況的問題,但我找不到任何幫助我的東西。在幾個模塊輸出兩次Python的Python輸出兩次

我有三個模塊,可以稱他們爲MBMC主要。主要導入這3個模塊並調用它們的功能。

在每個模塊中我設置像這樣的記錄程序:

ma.py
import logging 
logger = logging.getLogger('test.ma') #test.mb for mb.py/test.mc for mc.py 
logger.setLevel(logging.DEBUG) 

console_log = logging.StreamHandler() 
console_log.setLevel(logging.DEBUG) 
formatter = logging.Formatter('%(asctime)s - %(name)s - %(message)s') 
console_log.setFormatter(formatter) 
logger.addHandler(console_log) 
... 
... 
#right before the end of each module, after I'm finished logging what I need. 
logger.removeHandler(console_log) 

mb.py
import logging 
logger = logging.getLogger('test.mb') 
logger.setLevel(logging.DEBUG) 

console_log = logging.StreamHandler() 
console_log.setLevel(logging.DEBUG) 
formatter = logging.Formatter('%(asctime)s - %(name)s - %(message)s') 
console_log.setFormatter(formatter) 
logger.addHandler(console_log) 
... 
... 
#end of file 
logger.removeHandler(console_log) 

mc.py
import logging 
logger = logging.getLogger('test.mc') 
logger.setLevel(logging.DEBUG) 

console_log = logging.StreamHandler() 
console_log.setLevel(logging.DEBUG) 
formatter = logging.Formatter('%(asctime)s - %(name)s - %(message)s') 
console_log.setFormatter(formatter) 
logger.addHandler(console_log) 
... 
... 
#end of file 
logger.removeHandler(console_log) 

的我遇到的主要問題是輸出打印兩次並且對於程序的某些部分它沒有格式化。任何幫助將不勝感激,謝謝!

回答

1

使用全局記錄器一個更好的辦法是使用包裝調用logging.getLogger功能:

import logging 

def get_logger(name): 
    logger = logging.getLogger(name) 
    if not logger.handlers: 
     # Prevent logging from propagating to the root logger 
     logger.propagate = 0 
     console = logging.StreamHandler() 
     logger.addHandler(console) 
     formatter = logging.Formatter('%(asctime)s - %(name)s - %(message)s') 
     console.setFormatter(formatter) 
    return logger 

def main(): 
    logger = get_logger(__name__) 
    logger.setLevel(logging.DEBUG) 
    logger.info("This is an info message") 
    logger.error("This is an error message") 
    logger.debug("This is a debug message") 

if __name__ == '__main__': 
    main() 

輸出

2017-03-09 12:02:41,083 - __main__ - This is an info message 
2017-03-09 12:02:41,083 - __main__ - This is an error message 
2017-03-09 12:02:41,083 - __main__ - This is a debug message 

說明:使用函數還允許我們將logger.propagate設置爲False,以防止將日誌消息發送到根記錄器。這幾乎可以肯定是你看到的重複輸出的原因。

更新:在致電get_logger後,必須通過調用logger.setLevel來設置所需級別。如果沒有這樣做,那麼只會看到錯誤消息。

+0

我有一個模塊,帶有幫助程序所有需要日誌記錄調用的3個模塊的功能。所以我將這個功能添加到該模塊(我添加了一些格式化程序/ setLevel更改,我也有上述)。現在在每個模塊中,我只是調用'logger = helper.get_logger('test')'。現在,當我運行我的程序時,根本沒有日誌顯示,只有打印語句 – bbakp3

+0

您必須調用'logger.setLevel'將級別設置爲'logging.DEBUG'。否則,你只會看到錯誤信息。我已更新我的代碼,使其成爲一個完整的示例。 –

+0

我在helper模塊的方法中添加了'logger.setLevel'函數,它現在可以工作了,謝謝! – bbakp3

0

要將多個模塊登錄到一個全局文件,請創建一個日誌記錄實例,然後使用您喜歡的任何模塊獲取該實例。因此,例如在主,我會:

import logging 

logging.basicConfig(filename='logfile.log', level=logging.DEBUG) 
formatter = logging.Formatter('%(asctime)s - %(name)s - %(message)s') 
logger = logging.getLogger('Global Log') 

然後,我希望能夠將追加到該日誌的每個模塊中,我有:

import logging 
logger = logging.getLogger('Global Log') 

現在每次你訪問記錄儀在您的模塊中,您正在訪問相同的日誌記錄實例。這樣,你只需要設置和格式化記錄器一次。

更多的文檔記錄實例: https://docs.python.org/2/library/logging.html#logging.getLogger

+0

我試過了,它似乎工作,但仔細觀察後,仍然有一些部分輸出兩次。第一次只是我的時間/名稱/信息的一般格式,它第二次輸出它只是說 調試:消息 – bbakp3

+0

根據文檔(從我的鏈接到你的地方的簡短方式)它說,使用模塊級功能會導致處理程序被多次添加到記錄器。這是Python 2.7-3.2的一個問題。我不確定這裏的解決方案是什麼,我在3.4.2上工作,並沒有遇到這個問題(我知道這並沒有什麼幫助!) –

+0

感謝您的幫助:) – bbakp3