5

我找到一个看似相似问题的答案,但是(因为我是 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')

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

有人可以在这里给我一个方向吗?

4

3 回答 3

5

看来我已经弄清楚了这个问题的根源。

问题是我曾经在模块级别获取记录器。它看起来很合乎逻辑,但有一个陷阱——Python 日志记录模块会在您从文件加载配置之前尊重所有创建的记录器。所以基本上,当我将一个模块(它在内部使用获取记录器)导入到主代码(我也在其中调用记录器)时,它导致两次流式传输记录器数据。

这个问题的可能解决方案是:

  1. 不要在模块级别获取记录器
  2. 设置disable_existing_loggersFalse自 Python 2.7 起添加
于 2013-08-14T05:38:47.613 回答
5

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

  1. 注释掉对 logging.basicConfig 的调用 - 如果这消除了重复的日志语句,那么这意味着您可能不需要手动配置第二个日志处理程序。
  2. 如果您使用的是 IDE,则可能值得在日志语句上设置断点,并使用调试器单步执行,这样您就可以内省 python 日志设置的状态,从而更清楚地了解附加了哪些不同的处理程序。

为了使您的日志记录更易于管理,可能值得考虑将配置从代码中移出并放入配置文件 - 关于日志记录配置的 Python 文档是一个很好的起点。

于 2013-06-20T08:17:39.153 回答
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
于 2017-09-07T16:03:34.780 回答