Python日志记录无法写入多个日志文件

时间:2014-04-07 02:52:30

标签: python python-2.7 logging

我想自动化一些测试并将每个测试的输出记录到不同的文件中,但似乎所有测试输出都附加到第一个日志文件中,而不是单独的文件。我可以知道如何纠正这个问题?

我做的是: 首先,定义包含所有测试配置文件的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不存在!

2 个答案:

答案 0 :(得分: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。

答案 1 :(得分: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)