记录消息在控制台Python中出现两次

时间:2013-06-20 08:05:34

标签: python logging jython

我找到this回答一个看似相似的问题,但是(因为我是Python的新手)我不知道如何在我的代码中实现这个解决方案(如果它毕竟是同样的问题)。

在我的代码中,我有以下部分:

logging.basicConfig(level=logging.DEBUG,
                    format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s',
                    filename='C:\\Tests\\TRACE.log',
                    filemode='a')
console = logging.StreamHandler()
console.setLevel(logging.INFO)
consoleFormatter = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s')
console.setFormatter(consoleFormatter)
logging.getLogger('').addHandler(console)
localLog = logging.getLogger('text')

有趣的是,它过去工作正常,但有时它开始将这些重复的消息写入控制台。

有人可以给我指点吗?

3 个答案:

答案 0 :(得分:5)

通常会出现重复的日志语句,因为附加了两个单独的处理程序,它们将您的日志语句定向到同一个位置。有一些事情值得尝试解决问题的根源:

  1. 注释掉对logging.basicConfig的调用 - 如果这样可以消除重复的日志语句,那么这意味着您可能不需要手动配置第二个日志处理程序。
  2. 如果您使用的是IDE,可能需要在日志语句中添加断点,并使用调试器进行操作,以便您可以内省pythons日志设置的状态,以更清楚地了解不同处理程序的附加信息。
  3. 为了使您的日志记录更易于管理,可能值得将配置移出代码并进入配置文件 - logging configuration上的Python文档是一个很好的起点。

答案 1 :(得分:5)

似乎我已经找到了这个问题的根源。

事情是,我曾经在模块级别获取记录器。它看起来很合理,但存在一个缺陷 - 在从文件加载配置之前,Python日志记录模块会尊重所有创建的记录器。所以基本上,当我导入一个模块(内部使用获取记录器)到主代码(我也在那里调用记录器)时,它导致两次记录器数据的流式传输。

此问题的可能解决方案是:

  1. 不要在模块级别获取记录器
  2. disable_existing_loggers设为 False 自Python 2.7
  3. 以来添加

答案 2 :(得分:0)

我的记录器配置情况与此相同,我使用的修复程序是:

class Logger:

@staticmethod
def setup(name, file_name):

    log_file = <path to save the file>
    log_file_max_size = 1024 * 1024 * 20  # megabytes
    log_num_backups = 3
    log_format = "%(asctime)s [%(levelname)s]: %(filename)s(%(funcName)s:%(lineno)s) >> %(message)s"
    log_filemode = "w"  # w: overwrite; a: append
    logging.basicConfig(filename=log_file, format=log_format, filemode=log_filemode, level=logging.DEBUG)
    rotate_file = logging.handlers.RotatingFileHandler(
        log_file, maxBytes=log_file_max_size, backupCount=log_num_backups
    )
    logger = logging.getLogger(name)
    # Console output line.
    console_handler = logging.StreamHandler()
    console_handler.setLevel(logging.INFO)
    log_formatter = logging.Formatter(log_format)
    console_handler.setFormatter(log_formatter)
    logger.handlers = rotate_file, console_handler

    return logger