2010-01-08 113 views
6

我已經通過日誌記錄模塊文檔閱讀,雖然我可能錯過了一些明顯的東西,我得到的代碼似乎沒有按預期工作。我正在使用Python 2.6.4。Python記錄多個文件

我的程序由幾個不同的python文件組成,我想從中發送日誌消息到文本文件以及潛在的屏幕。我想這是一件很平常的事情,所以我把它搞亂了。

我的代碼正在做的事情是在正確地記錄到文本文件中。但是登錄屏幕正在被複制,其中一個是指定的格式,另一個沒有。另外,當我關閉屏幕輸出時,我仍然獲得一次打印的文本,我不想 - 我只是希望它被記錄到文件中。

不管怎麼說,一些代碼:

#logger.py 
import logging 
from logging.handlers import RotatingFileHandler 
import os 

def setup_logging(logdir=None, scrnlog=True, txtlog=True, loglevel=logging.DEBUG):   
    logdir = os.path.abspath(logdir) 

    if not os.path.exists(logdir): 
     os.mkdir(logdir) 

    log = logging.getLogger('stumbler') 
    log.setLevel(loglevel) 

    log_formatter = logging.Formatter("%(asctime)s - %(levelname)s :: %(message)s") 

    if txtlog: 
     txt_handler = RotatingFileHandler(os.path.join(logdir, "Stumbler.log"), backupCount=5) 
     txt_handler.doRollover() 
     txt_handler.setFormatter(log_formatter) 
     log.addHandler(txt_handler) 
     log.info("Logger initialised.") 

    if scrnlog: 
     console_handler = logging.StreamHandler() 
     console_handler.setFormatter(log_formatter) 
     log.addHandler(console_handler) 

沒有什麼不尋常那裏。

#core.py 
import logging 
corelog = logging.getLogger('stumbler.core') # From what I understand of the docs, this should work :/ 

class Stumbler: 
    [...] 

    corelog.debug("Messages and rainbows...") 

屏幕輸出顯示了這是如何被複制:

2010-01-08 22:57:07,587 - DEBUG :: SCANZIP: Checking zip contents, file: testscandir/testdir1/music.mp3 
DEBUG:stumbler.core:SCANZIP: Checking zip contents, file: testscandir/testdir1/music.mp3 
2010-01-08 22:57:07,587 - DEBUG :: SCANZIP: Checking zip contents, file: testscandir/testdir2/subdir/executable.exe 
DEBUG:stumbler.core:SCANZIP: Checking zip contents, file: testscandir/testdir2/subdir/executable.exe 

雖然文本文件是獲得正確的格式輸出,在logger.py打開屏幕註銷仍然有顯示的格式不正確輸出。

從我對文檔的理解中,調用corelog.debug(),看作爲corelog是「stumbler」記錄器的孩子,它應該使用該格式並輸出日誌。

對於這樣一個小問題的散文道歉。

TL; DR:如何從多個文件進行日誌記錄?

回答

12

您確定沒有其他日誌記錄設置正在您導入的任何內容中完成。

控制檯日誌中的錯誤輸出看起來像記錄器的默認配置,因此其他內容可能會將其設置爲up。

運行此快速測試腳本:

import logging 
from logging.handlers import RotatingFileHandler 
import os 

def setup_logging(logdir=None, scrnlog=True, txtlog=True, loglevel=logging.DEBUG): 
    logdir = os.path.abspath(logdir) 

    if not os.path.exists(logdir): 
     os.mkdir(logdir) 

    log = logging.getLogger('stumbler') 
    log.setLevel(loglevel) 

    log_formatter = logging.Formatter("%(asctime)s - %(levelname)s :: %(message)s") 

    if txtlog: 
     txt_handler = RotatingFileHandler(os.path.join(logdir, "Stumbler.log"), backupCount=5) 
     txt_handler.doRollover() 
     txt_handler.setFormatter(log_formatter) 
     log.addHandler(txt_handler) 
     log.info("Logger initialised.") 

    if scrnlog: 
     console_handler = logging.StreamHandler() 
     console_handler.setFormatter(log_formatter) 
     log.addHandler(console_handler) 



setup_logging('/tmp/logs') 
corelog = logging.getLogger('stumbler.core') 
corelog.debug("Messages and rainbows...") 

產生這樣的結果:

2010-01-08 15:39:25335 - DEBUG :: 消息和彩虹...

和在我的/tmp/logs/Stumbler.log

2010-01-08 15:39:25,335 - INFO :: Logger初始化。 2010-01-08 15:39:25335 - DEBUG ::消息和 彩虹......

這和預期一樣,當我在Python 2.4,2.5執行,並2.6.4

+1

哇, 發現。我有logging.basicConfig()仍然在我的一些其他模塊中使用。我從未想到他們可能會造成問題。謝謝! – Loix0 2010-01-09 00:12:46