我想自动化一些测试并将每个测试的输出记录到不同的文件中,但似乎所有测试输出都附加到第一个日志文件中,而不是单独的文件。我可以知道如何纠正这个问题?
我做的是: 首先,定义包含所有测试配置文件的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不存在!
答案 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)