【问题标题】:Strange behaviour on my logging class我的日志记录类的奇怪行为
【发布时间】:2013-08-08 03:47:57
【问题描述】:

我会尽量恢复。我有我写的这门课:

日志类

import logging, logging.handlers.TimedRotatingFileHandler

class Logger(object):
    def __init__(self, log_filename):
        logging.basicConfig(format='%(asctime)s %(message)s')
        formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
        loghandler = TimedRotatingFileHandler(
            log_filename, when="midnight", backupCount=50
        )
        loghandler.setFormatter(formatter)
        self.logger = logging.getLogger()
        self.logger.setLevel(logging.INFO)
        self.logger.addHandler(loghandler)

    def getLogger(self):
        return self.logger

确实很好用,现在问题出现了,当我有一个使用 Logger 实例的脚本并且在该脚本中我也实例化了一个使用 Logger 的类时,如下所示:

脚本

import ClassA

A = ClassA()
log = Logger(log_filename='script_logger.log')
logger = log.getLogger()
logger.info('Initiated Script')

while True:
    logger.info('Looping')
    A.run()

我的班级是什么样子的:

A 类模块

class ClassA(object):
    def __init__(self):
        log = Logger(log_filename='class_logger.log')
        self.logger = log.getLogger()
        self.logger.info('Started ClassA')

    def run(self):
        self.logger.info('Into method run')

现在我希望有 2 个单独的日志文件,class_logger.logscript_logger.log 可以正常工作,但两个文件逐行具有完全相同的内容。

所以script_logger.logclass_logger.log有以下内容:

Started classA
Initiated Script
Looping
Into method run
Looping
Into method run
...

有什么线索吗?

【问题讨论】:

    标签: python oop logging


    【解决方案1】:

    原因是当你执行 logging.getLogger() 时,类和脚本具有相同的记录器对象。这是一个单例。如果您想要不同的记录器,那么您应该传递记录器名称,例如 logging.getLogger('logger1') 通常库会使用logging.getLogger(__name__),以便每个模块都有不同的记录器。参考http://docs.python.org/2/library/logging.html#logger-objects

    我已经修改了您的代码,使其现在可以按预期工作

    import logging, logging.handlers
    from logging.handlers import TimedRotatingFileHandler
    
    class Logger(object):
        def __init__(self, log_filename, name):
            logging.basicConfig(format='%(asctime)s %(message)s')
            formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
            loghandler = TimedRotatingFileHandler(
                log_filename, when="midnight", backupCount=50
            )
            loghandler.setFormatter(formatter)
            self.logger = logging.getLogger(name)
            self.logger.setLevel(logging.INFO)
            self.logger.addHandler(loghandler)
    
        def getLogger(self):
            return self.logger
    
    
    class ClassA(object):
        def __init__(self):
            log = Logger(log_filename='class_logger.log', name="Class")
            self.logger = log.getLogger()
            self.logger.info('Started ClassA')
    
        def run(self):
            self.logger.info('Into method run')
    
    
    A = ClassA()
    log = Logger(log_filename='script_logger.log', name="Script")
    logger = log.getLogger()
    logger.info('Initiated Script')
    
    for x in range(5):
        logger.info('Looping')
        A.run()
    

    【讨论】:

    • 谢谢,我明天试试,标记为正确答案。
    猜你喜欢
    • 2010-10-08
    • 1970-01-01
    • 1970-01-01
    • 2017-03-16
    • 2011-07-12
    • 2011-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多