首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在python中的for循环中使用日志记录将特定输出写入多个日志文件?

如何在python中的for循环中使用日志记录将特定输出写入多个日志文件?
EN

Stack Overflow用户
提问于 2017-08-18 02:32:22
回答 2查看 296关注 0票数 0

目标:将一个实验“A”运行10次,每次使用不同的输入。实验A返回一个浮点值作为其输出(让我们称其为结果)。10个实验的所有10个结果都应该保存在结果文件中(使用日志记录)。在运行实验A(每次)时,需要进行大量的日志记录。应将(10)个实验的所有中间输出写入(10)个不同的日志文件。

换句话说,如果我的实验目录是'exp_dir‘。在实验结束后,应该有一个结果(日志)文件保存每个实验的输出(只需要保存输出,其他不需要保存)。在运行每个实验的过程中,我将为exp_dir中的10个实验中的每个实验创建子目录(exp1、exp2等),并将实验结果记录在相应的子目录中(实验1的结果应保存在exp1子目录中)。我计划在一个单独的python文件中使用for循环来做这件事。

你能让我知道如何单独做日志吗?这就是我尝试的(而不是我在2个实验中尝试的10个实验)

代码语言:javascript
复制
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也包括)

非常感谢你的帮助

EN

回答 2

Stack Overflow用户

发布于 2017-08-18 04:53:59

您的代码如下所示(大约):

代码语言:javascript
复制
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

注意,您正在向您的日志对象添加第二个处理程序,然后是第三个处理程序。您不能删除旧的处理程序。

您可以:

代码语言:javascript
复制
    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中所建议的,也许您可以简单地使用:

代码语言:javascript
复制
    def activateLogFile(self, f):
        # ... other code ...
        self.logger.handlers = []
        self.logger.addHandler(handler)
票数 1
EN

Stack Overflow用户

发布于 2017-08-18 05:14:31

keeping it simple出了什么问题

代码语言:javascript
复制
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))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45742647

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档