2014-04-07 206 views
0

我想自動化一些測試並將每個測試的輸出記錄到不同的文件中,但似乎所有測試輸出都附加到第一個日誌文件中,而不是單獨的文件。我可以知道我該如何解決這個問題?Python日誌記錄無法寫入多個日誌文件

我所做的是: 首先,定義包含所有測試配置文件的runthis.cfg。 二,執行run.py.它進口A級,for循環和寫的一些日誌數據爲每個循環

在runthis.cfg

2 
prob1.cfg 
prob2.cfg 

在run.py

from fa import A 

def run_it(cfg_data): 
    cfg = cfg_data.split('\n') 
    runCount = int(cfg[0]) 

    for i in range(1, runCount+1):   
     print "\n\nRunning " + cfg[i] + "..." 
     cA.readProblemInstance(cfg[i]) 



cA = A() 

if __name__ == '__main__':  
    run_config_file = open('runthis.cfg', 'r') 
    cfg_data = ''.join(run_config_file.readlines()) 
    run_config_file.close()   

    run_it(cfg_data) 

在fa.py

from datetime import datetime 
import time 
import logging 

class A(): 
    def activateLogFile(self, f): 
     logging.basicConfig(filename=f, level=logging.INFO) 

    def readProblemInstance(self, fn):  
     fn = fn.replace('.', '_') 
     fn = fn + '_' + datetime.now().strftime('%Y_%m_%d_%H_%M_%S_%f') 
     self.activateLogFile(fn) 

     logging.info("%s" %fn) 

輸出是,在prob1_cfg_2014_04_07_12_39_38_293000,

INFO:root:prob1_cfg_2014_04_07_12_39_38_293000 
INFO:root:prob2_cfg_2014_04_07_12_39_38_294000 

prob2_cfg_2014_04_07_12_39_38_294000不存在!

回答

1

@metatoaster已經給出了一個很好的說明爲什麼你的代碼不會登錄到多個文件,所以這個答案只會處理你如何登錄到多個文件給你的例子。

因此,給定記錄器的處理程序都存儲在該記錄器的.handlers屬性中。這基本上只是一個可以添加到記錄器的addHandler方法的列表。 在這種情況下,您的代碼將變成:

# new style classes should inherit from object 
class A(object): 
    def __init__(self): 
     # create a logger for the class and set the log level 
     # here we use the root logger 
     self.logger = logging.getLogger() 
     self.logger.setLevel(logging.INFO) 

    def activateLogFile(self, f): 
     # create a handler with the name defined by the variable f 
     handler = logging.FileHandler(f) 
     # add that handler to the logger 
     self.logger.addHandler(handler) 

    def readProblemInstance(self, fn):  
     fn = fn.replace('.', '_') 
     fn = fn + '_' + datetime.now().strftime('%Y_%m_%d_%H_%M_%S_%f') 
     self.activateLogFile(fn) 
     self.logger.info("%s" %fn) 
+0

@metatoaster提到的添加towhat,我在你的回覆中添加了幾行。它現在可以正常工作,分別登錄不同的文件。不添加此行,新日誌將寫入舊文件和新創建的日誌文件。 – twfx

+0

我的印象是,OP希望能夠同時登錄到兩個文件。在這種情況下,不需要刪除以前的處理程序。 – ebarr

+0

好吧,無論如何,我得到了解決這個問題的線索! – twfx

2

logging.basicConfig不會替代已經存在的處理程序(它確實會說「如果根記錄程序已經爲它配置了處理程序,此函數不會執行任何操作」),該函數是在該函數第一次調用時設置的。你必須做的是刪除附加到根日誌記錄器的任何處理程序,並通過再次調用basicConfig或其他函數添加新的處理程序。

注意以下行爲,當你沒有刪除原來的處理程序

>>> rootlogger = logging.getLogger() 
>>> logging.basicConfig(filename='/tmp/testlog.txt', level=logging.INFO) 
>>> rootlogger.handlers 
[<logging.FileHandler object at 0xd4a450>] 
>>> logging.basicConfig(filename='/tmp/testlog.txt', level=logging.INFO) 
>>> rootlogger.handlers 
[<logging.FileHandler object at 0xd4a450>] 

注相同的對象ID。現在將現有的處理程序分配給一個變量(保留它),然後刪除,然後再次調用logging.basicConfig

>>> handler = rootlogger.handlers[0] 
>>> rootlogger.removeHandler(handler) 
>>> logging.basicConfig(filename='/tmp/testlog.txt', level=logging.INFO) 
>>> rootlogger.handlers 
[<logging.FileHandler object at 0x1161350>] 

請注意不同的對象ID。

+0

可我知道我應該包括哪些rootlogger頭? – twfx

+1

rootlogger不是一個包。它是'getLogger()'的輸出,沒有參數。 'rootlogger = logging.getLogger()'。 – ebarr

+0

@ebarr謝謝,我在各種複製/粘貼中忽略了這一行。現在已經解決了。 – metatoaster

相關問題