【问题标题】:Ignore specific logging line temporarily暂时忽略特定的日志记录行
【发布时间】:2019-08-20 08:51:30
【问题描述】:

我有一个名为 import_customers() 的方法,它可以加载类似 csv 的数据。

此方法记录到日志级别的 INFO。

在一种情况下,我想避免这种日志记录。

我看到了几种方法:

变体 1:像 do_logging=True 这样的新 kwarg,我可以将其切换为 false。

变体 2:使用一些忽略此行的魔法上下文。

with IgnoreLoggingContext() as context:
    import_customers()

如何实现IgnoreLoggingContext()

如果您认为 V1 更好,请发表评论。

【问题讨论】:

  • 不明白你还在寻找什么...?至少有两个有效答案。或者,如果您有更多要求,您应该在问题中指定它们。
  • @Sraw 我很好奇。是的,有两个有效的答案。也许有人知道第三种解决方案。
  • 立即想到的是您可以为此设置自定义日志记录级别,请参阅或类似stackoverflow.com/questions/2183233/…
  • @stacksonstacks 我不明白为什么自定义日志记录级别会有所帮助。

标签: python logging


【解决方案1】:

这取决于您的需要。如果您想禁用整个日志记录,这将是最简单的:

from contextlib import contextmanager
import logging


@contextmanager
def IgnoreLoggingContext():
    root = logging.getLogger()
    origin_level = root.getEffectiveLevel()
    root.setLevel(logging.WARNING) # Or whatever you want
    yield
    root.setLevel(origin_level)

with IgnoreLoggingContext():
    do_something()

或者您可以将变量传递给管理器以指定要禁用的记录器:

@contextmanager
def IgnoreLoggingContext(name):
    logger = logging.getLogger(name)
    origin_level = logger.getEffectiveLevel()
    logger.setLevel(logging.WARNING) # Or whatever you want
    yield
    logger.setLevel(origin_level)

【讨论】:

    【解决方案2】:

    可以通过disabled 属性完全禁用记录器。另一件事是记录器不一定会传播到根记录器并且可以定义自己的记录处理,因此完全禁用可能如下所示:

    @contextlib.contextmanager
    def off():
        loggers = [logging.getLogger(name) for name in logging.root.manager.loggerDict]
        # turn loggers off
        for logger in loggers:
            logger.disabled = True
        logging.root.disabled = True
        yield
        # turn loggers back on
        for logger in loggers:
            logger.disabled = False
        logging.root.disabled = False
    

    使用示例:

    if __name__ == '__main__':
        logging.basicConfig(level=logging.DEBUG)
        logging.info('foo')
        with off():
            logging.info('bar')
    

    将打印

    INFO:root:foo
    

    【讨论】:

      【解决方案3】:

      只需将日志记录级别从 INFO 更改为 ERROR,完成后将其更改回来。

      # Beginning of file
      rootLogger.setLevel(logging.INFO)
      
      # Change logging level to only log to error, just prior to calling your method
      rootLogger.setLevel(logging.ERROR)
      
      # Change it back when you're done
      rootLogger.setLevel(logging.INFO)
      

      【讨论】:

      • 这会覆盖日志级别,如果它在开始时是 DEBUG。如果引发异常,它不会再次设置旧级别。但基本上我认为你是对的:首先读取当前日志级别。然后 try-except-finally 并在 finally 块中再次设置旧级别。
      猜你喜欢
      • 2019-06-11
      • 1970-01-01
      • 2013-03-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-25
      • 2013-04-22
      相关资源
      最近更新 更多