我的伐木课上有奇怪的行为

2024-04-26 00:49:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我会尽可能地恢复。我写了一节课:

日志记录类

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

它确实工作得很好,现在当我有一个使用记录器实例的脚本,并且在该脚本中我实例化了一个也使用记录器的类时,问题就出现了,类似这样:

脚本

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')

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

因此script_logger.logclass_logger.log具有以下内容:

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

有什么线索吗?你知道吗


Tags: runselfinfo脚本logloggingdefscript
1条回答
网友
1楼 · 发布于 2024-04-26 00:49:48

原因是类和脚本具有相同的logger对象日志记录.getLogger(). 是单身汉。如果您需要不同的记录器,那么您应该传递记录器名称,例如日志记录.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()

相关问题 更多 >