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

Eug*_*e S 5 python logging jython

我发现这个答案,但一个看似类似的问题,(因为我是新手到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')
Run Code Online (Sandbox Code Playgroud)

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

请问有人给我指点吗?

rob*_*cox 5

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

  1. 注释掉对logging.basicConfig的调用 - 如果这样可以消除重复的日志语句,那么这意味着您可能不需要手动配置第二个日志处理程序.
  2. 如果您使用的是IDE,则可能需要在日志语句中添加断点,并使用调试器进行操作,以便您可以自省状态的pythons日志设置,以更清楚地了解不同处理程序的附加信息.

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

  • 您好,感谢您的回答,但是我如何注释掉所有“loggingBasicConfig”?它包括路径、格式和文件模式等强制设置... (2认同)

Eug*_*e S 5

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

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

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

  1. 不要在模块级别获取记录器
  2. 设置disable_existing_loggers.自Python 2.7起添加