2017-08-17 41 views
0

目标: 要运行实验“A”10次,每次输入不同的数据。实验A返回一个浮点值作为其输出(让我们称之为结果)。 10个实验的所有10个结果应保存在结果文件中(使用日志记录)。在运行实验A时(每次)需要做很多日志记录。 (10)实验的所有中间输出应写入(10)不同的日志文件。如何使用python for循环中的日志写入特定的输出到多个日志文件?

换句话说, 如果我的实验目录是'exp_dir'。在实验结束后应该存在一个结果(日志)文件,用于保存每个实验的输出(只有输出需要保存,没有其他)。在运行每个实验的过程中,我将为exp_dir中的10个实验中的每一个创建子目录(exp1,exp2等),并将实验的结果记录在相应的子目录中(实验1结果应保存在exp1中子目录)。我打算在使用for循环的单个python文件中执行此操作。

你能让我知道如何分别进行日志记录吗?这是我想什么(而不是10个实验我试了2个实验)

import logging 
import os 

class MyLogger(object): 
    def __init__(self): 
     self.logger = logging.getLogger() 
     self.logger.setLevel(logging.INFO) 

    def activateLogFile(self, f): 
     d = os.path.dirname(f) 
     os.makedirs(d, exist_ok=True) 
     handler = logging.FileHandler(f) 
     self.logger.addHandler(handler) 

    def doLogging(self, fn, info): 
     self.activateLogFile(fn) 
     self.logger.info("{i}\n".format(i=info)) 


def run(): 

    exp_dir = os.getcwd() 
    myLog.doLogging("{d}/res.log".format(d=exp_dir), "This is where results should be logged") 
    myLog.logger.propagate = False 
    for i in range(1, 3): 
     myLog.doLogging("{d}/exp{i}/info.log".format(i=i, d=exp_dir), "some logging") 
    myLog.doLogging("{d}/res.log".format(d=exp_dir), "Experiments done") 

myLog = MyLogger() 

if __name__ == "__main__": 
    run() 

但一切,是在EXP2记录也被记录在EXP1和res.log包括所有的日志记录(EXP1,EXP2也)

我感谢你的帮助

+0

为了说清楚,问题是如何分别记录每个实验以及如何将每个实验的结果保存在结果文件中。 – user1540393

+0

您向我们展示了您想要做的事情,但您并未向我们展示您尝试过的内容。堆栈溢出不是代码写入服务。在发布问题之前,您需要展示自己的努力。你已经导入了日志记录,但是我们没有看到你试图用它做任何事情的任何地方。您是否阅读过文档?尝试了一些东西,它没有工作?编辑你的问题并发布你已经尝试过的。不要评论你的问题;编辑问题本身并添加您的说明。 – AJNeufeld

+0

对不起。我包含了我的代码。 – user1540393

回答

1

你的代码读取(大约):

self.logger = logging.getLogger() 

handler = logging.FileHandler(f1) 
self.logger.addHandler(handler) 
self.logger.info("Log exp 1 stuff") # Logs to f1 

handler = logging.FileHandler(f2) 
self.logger.addHandler(handler) 
self.logger.info("Log exp 2 stuff") # Logs to f1, f2 

handler = logging.FileHandler(f3) 
self.logger.addHandler(handler) 
self.logger.info("Log global stuff") # Logs to f1, f2, f3 

注意你添加第二个,然后是第三个处理程序到您的日志对象。你并没有删除旧的处理程序。

您可以:

def __init__(self): 
     self.handler = None 
     # ... other code ... 

    def activateLogFile(self, f): 
     # ... other code ... 
     if self.handler is not None: 
      self.logger.removeHandler(self.handler) 
     self.handler = logging.FileHandler(f) 
     self.logger.addHandler(self.handler) 

正如Removing handlers from python建议,也许你可以简单地使用:

def activateLogFile(self, f): 
     # ... other code ... 
     self.logger.handlers = [] 
     self.logger.addHandler(handler) 
+0

它的工作原理。谢谢 – user1540393

0

什么用keeping it simple是怎么回事?

import logging 
from os.path import join, dirname, abspath 

def fast_log(msg, filename='res.log'): 
    logging.basicConfig(filename=filename, level=logging.INFO) 
    logging.info(msg) 

def do_experiment(i): 
    filename = join(dirname(abspath(__file__)), "%d.log" % i) 
    fast_log("experiment initialization log", filename) 
    # do stuff 
    fast_log("first stage", filename) 
    # do a lot 
    # more stuff 
    # ... 
    results = execute_final_stage_of_exp() 
    return results 

for i in range(1, 11): 
    fast_log(do_experiment(i)) 
相关问题