1

我正在尝试写入一个单独的日志文件,该文件是使用 basicConfig 在循环内创建的。到目前为止,我设法只创建了一个包含所有后续日志调用的日志文件。我在这里错过了一些微不足道的事情吗?我检查了文档,它有关于文件模式的提示,但没有别的。

import logging


class MultipleInstancesStarter:
    def __init__(self):
        pass


    def startMany(self):
        objs = [Main(str(i)) for i in xrange(1, 10)]
        print objs
        for obj in objs:
            obj._start()


class Main:
    def __init__(self, i):
        self.index = i


    def _start(self):
        name = self.index
        logging.basicConfig(
                        filename="log_" + name + ".log",
                        filemode="w",
                        format="%(asctime)s -  %(levelname)s - %(filename)s:%(module)s:%(lineno)d - %(message)s",
                        level=logging.DEBUG)

        logging.debug("%s Message Debug" % name)
        logging.info("%s Message Info" % name)
        logging.error("%s Message Error" % name)


if __name__ == '__main__':
    MultipleInstancesStarter().startMany()

这也只会创建带有来自第二次迭代的日志条目的 log_1.log。我尝试在循环外创建一个对象,它创建一个单独的文件没问题,尽管如下所示。

def startMany(self):
    obj2 = Main("sample")
    obj2._start()

    objs = [Main(str(i)) for i in xrange(1, 10)]
    print objs
    for obj in objs:
        obj._start()

不知道我做错了什么,任何帮助将不胜感激。干杯

4

1 回答 1

2

这将起作用:

import logging


class MultipleInstancesStarter:
    def __init__(self):
        pass

    def startMany(self):
        objs = [Main(str(i)) for i in xrange(1, 10)]
        print objs
        for obj in objs:
            obj._start()


class Main:
    def __init__(self, i):
        self.index = i

    def _start(self):
        name = self.index
        logger = logging.getLogger('%s-%s' % (__name__, self.index))
        handler = logging.FileHandler('log_%s.log' % name)
        log_format = ('%(asctime)s -  %(levelname)s - %(filename)s:'
                      '%(module)s:%(lineno)d - %(message)s')
        formatter = logging.Formatter(log_format)
        handler.setFormatter(formatter)
        logger.addHandler(handler)

        logger.debug("%s Message Debug" % name)
        logger.info("%s Message Info" % name)
        logger.error("%s Message Error" % name)


if __name__ == '__main__':
    MultipleInstancesStarter().startMany()

这是输出(我在日志文件上使用了tail):

==> log_1.log <== 2013-11-12 21:08:15,866 - 错误 - test.py:test:31 - 1 消息错误

==> log_2.log <== 2013-11-12 21:08:15,866 - 错误 - test.py:test:31 - 2 消息错误

==> log_3.log <== 2013-11-12 21:08:15,866 - 错误 - test.py:test:31 - 3 消息错误

==> log_4.log <== 2013-11-12 21:08:15,866 - 错误 - test.py:test:31 - 4 消息错误

==> log_5.log <== 2013-11-12 21:08:15,866 - 错误 - test.py:test:31 - 5 消息错误

==> log_6.log <== 2013-11-12 21:08:15,866 - 错误 - test.py:test:31 - 6 消息错误

==> log_7.log <== 2013-11-12 21:08:15,867 - 错误 - test.py:test:31 - 7 消息错误

==> log_8.log <== 2013-11-12 21:08:15,867 - 错误 - test.py:test:31 - 8 消息错误

==> log_9.log <== 2013-11-12 21:08:15,867 - 错误 - test.py:test:31 - 9 消息错误

基本上,如果日志记录部分变得有点棘手,请使用不同的记录器,在这种情况下为每个实例使用一个记录器。一篇关于 Python 文档的好文章

编辑:我忘了添加日志级别。为此,您可以在将处理程序添加到记录器之前添加它

handler.setLevel(logging.DEBUG)
于 2013-11-12T21:10:43.057 回答