2014-04-07 175 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

相关问题