【问题标题】:Disable output of root logger禁用根记录器的输出
【发布时间】:2017-02-10 19:42:52
【问题描述】:

我在一个名为“logger.py”的文件中有以下代码

import logging

format = '%(asctime)s - %(name)-30s - %(levelname)-8s - %(message)s'
logging.basicConfig(level=logging.DEBUG,
                    format=format)

formatter = logging.Formatter(format)

fh = logging.FileHandler('test.log')
fh.setFormatter(formatter)
fh.setLevel(logging.DEBUG)

ch = logging.StreamHandler()
ch.setFormatter(formatter)
ch.setLevel(logging.INFO)

logging.getLogger().addHandler(fh)
logging.getLogger().addHandler(ch)

在另一个文件中

import logging
import logger

logger = logging.getLogger(__name__)
logger.info('Staring Scheduler')

我得到以下控制台输出

2014-07-14 22:27:10,915 - __main__                       - INFO     - Staring Scheduler
2014-07-14 22:27:10,915 - __main__                       - INFO     - Staring Scheduler

我无法禁用双输出。我想使用额外的流处理程序来自定义打印到控制台的日志级别。将来我还想使用 RotatingFileHandler 而不是简单的文件处理程序。

有人知道如何在保持简单记录器设置与第二个文件一样的同时实现此目的吗?我有搜索,但似乎没有解决方案。

更新 1(已解决)

文件logger.py

import logging

logging.getLogger().setLevel(logging.DEBUG)

formatter = logging.Formatter('%(asctime)s - %(name)-30s - %(levelname)-8s - %(message)s')

fh = logging.FileHandler('test.log')
fh.setFormatter(formatter)
fh.setLevel(logging.DEBUG)

ch = logging.StreamHandler()
ch.setFormatter(formatter)
ch.setLevel(logging.ERROR)

logging.getLogger().addHandler(fh)
logging.getLogger().addHandler(ch)

文件test.py

import logging
import logger

logger = logging.getLogger(__name__)
logger.debug('Debug message')
logger.info('Info message')
logger.warning('Warning message')
logger.error('Error message')
logger.critical('Critical message')

控制台输出:

2014-07-15 09:47:58,171 - __main__                       - ERROR    - Error message
2014-07-15 09:47:58,171 - __main__                       - CRITICAL - Critical message

Test.log内容:

2014-07-15 09:47:58,171 - __main__                       - DEBUG    - Debug message
2014-07-15 09:47:58,171 - __main__                       - INFO     - Info message
2014-07-15 09:47:58,171 - __main__                       - WARNING  - Warning message
2014-07-15 09:47:58,171 - __main__                       - ERROR    - Error message
2014-07-15 09:47:58,171 - __main__                       - CRITICAL - Critical message

【问题讨论】:

    标签: python logging


    【解决方案1】:

    您看到双重输出的原因是您在第一个文件中设置了 两个 StreamHandlers; logger.py

    这一行中明确的一个:

    ch = logging.StreamHandler()
    

    此行中的另一个:

    logging.basicConfig(level=logging.DEBUG,
    

    根据logging.basicConfig 的文档:

    通过创建带有默认格式化程序的 StreamHandler 并将其添加到根记录器来为日志记录系统进行基本配置。

    所以你应该删除 basicConfig 行。

    但是,在删除它之后,您需要将根记录器的级别设置为 DEBUG,因为您在 basicConfig 行中执行此操作:

    logging.getLogger().setLevel(logging.DEBUG)
    

    【讨论】:

      【解决方案2】:

      因此,您可以先删除已将 StreamHandler 添加到根 syslogger 的 basicConfig,因此您实际上有两个 StreamHandler:

      logging.getLogger().addHandler(fh)
      logging.getLogger().addHandler(ch)
      print logging.getLogger().handlers
      
      [<logging.StreamHandler object at 0x7f3f57c4d050>, <logging.FileHandler object at 0x7f3f57c091d0>, <logging.StreamHandler object at 0x7f3f57c09250>]
      

      那么你必须做 basicConfig 为你做的事情:

      logging.getLogger().setLevel(logging.INFO)
      

      【讨论】:

      • 删除basicConfig 语句是修复的关键。根记录器的级别需要设置为最低级别debug,以便FileHandler 记录调试消息。
      【解决方案3】:

      您正在调用logging.basicConfig(),默认为StreamHandler。相反,您应该手动设置级别。

      >>> import logging
      
      >>> format = '%(asctime)s - %(name)-30s - %(levelname)-8s - %(message)s'
      >>> formatter = logging.Formatter(format)
      >>> fh = logging.FileHandler('test.log')
      >>> fh.setFormatter(formatter)
      >>> fh.setLevel(logging.DEBUG)
      >>> ch = logging.StreamHandler()
      >>> ch.setFormatter(formatter)
      >>> ch.setLevel(logging.INFO)
      >>> logging.getLogger().addHandler(fh)
      >>> logging.getLogger().addHandler(ch)
      >>> l = logging.getLogger(__name__)
      >>> l.setLevel(logging.INFO)
      >>> l.info("HI")
      2014-07-15 08:46:50,000 - __main__                       - INFO     - HI
      

      文件内容为:

      msvalkon@lunkwill:~$ cat test.log
      2014-07-15 08:46:50,000 - __main__                       - INFO     - HI
      

      另外,您正在覆盖您的logger。在你的another file:

      import logging
      import logger # <-- importing logger.py
      
      logger = logging.getLogger(__name__) # <-- overwriting the logger name, nothing from logger.py is now availabe
      logger.info('Staring Scheduler') # This is just a logging object
      

      您的日志配置已完成在这种情况下,因为导入将通过您的代码。在其他一些情况下可能不是真的。通过更改变量名称或完全更改配置方案来修复。

      【讨论】:

      • 我同意。糟糕的榜样和糟糕的作风。
      猜你喜欢
      • 1970-01-01
      • 2016-09-24
      • 2019-08-31
      • 1970-01-01
      • 2022-01-20
      • 1970-01-01
      • 2017-06-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多