【问题标题】:logging.info doesn't show up on console but warn and error dologging.info 不会出现在控制台上,但会出现警告和错误
【发布时间】:2012-07-17 22:04:05
【问题描述】:

当我使用logging.info 记录事件时,它不会出现在 Python 终端中。

import logging
logging.info('I am info')  # no output

相比之下,使用logging.warn 记录的事件确实会出现在终端中。

import logging
logging.warn('I am warning')  # outputs "I am warning"

是否可以更改环境级别以使logging.info 打印到控制台?我想避免对每个 Python 文件进行更改。

【问题讨论】:

    标签: python logging warnings


    【解决方案1】:

    根记录器始终默认为警告级别。尝试调用

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

    你应该没事的。

    【讨论】:

    • 不,只需要调用一次。记录器被构建为一个层次结构,所有的记录都归结为一个根记录器。通过不为getLogger() 指定任何参数,它会返回根记录器。只要不修改其他记录器,只需要修改根记录器即可。
    • 你知道为什么 logging.basicConfig(level=logging.INFO) 不起作用吗?我在文档上看不清楚。
    • 这不适用于 Python 3.5:Python 3.5.2 (default, Nov 12 2018, 13:43:14)[GCC 5.4.0 20160609] on linux>>> import logging>>> rootLog = logging.getLogger()>>> rootLog.setLevel(logging.INFO)>>> rootLog.setLevel(logging.INFO)>>> rootLog.info('all the kings horses')>>> rootLog.warning('all the kings men')all the kings men
    • FWIW,这篇文章解释了为什么最好避免使用根记录器和记录模块级别的方法调用:electricmonk.nl/log/2017/08/06/… tl;dr 是:“不要直接针对根记录器进行记录。这意味着:没有 logging.basicConfig(),也没有使用模块级记录器,例如 logging.warning(),因为它们有意想不到的副作用。"
    • @jeffk,和我一样 3.6.8 不会打印信息消息,即使 setLevel 设置为 logging.INFO
    【解决方案2】:

    就像@ztyx 所说,默认记录器级别是警告。您必须将其设置为较低的级别

    您可以通过使用logging.basicConfig 并设置logger level 来做到这一点:

    logging.basicConfig(level=logging.DEBUG)
    

    【讨论】:

    • 我想知道为什么basicConfig() 不适合我,尽管logging.getLogger().setLevel() 适合工作?
    • @ShayanAmani - 根据文档,“如果根记录器已经配置了处理程序,则此函数不会执行任何操作,除非关键字参数 force 设置为 True。”
    【解决方案3】:

    上述解决方案对我不起作用,但代码here 起作用:

    # set up logging to file
    logging.basicConfig(level=logging.DEBUG,
                        format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s',
                        datefmt='%m-%d %H:%M',
                        filename='/temp/myapp.log',
                        filemode='w')
    # define a Handler which writes INFO messages or higher to the sys.stderr
    console = logging.StreamHandler()
    console.setLevel(logging.INFO)
    # add the handler to the root logger
    logging.getLogger('').addHandler(console)
    

    (为了便于阅读,我省略了部分代码)

    【讨论】:

    • 这是唯一对我有用的东西。我与logging.error("Connection timed out!") 有一行,即使在basicConfig() 中有level=logging.DEBUG,它也不会打印到控制台。添加处理程序确实如此,非常感谢!
    • 请记住,您使用的处理程序正在发挥作用。例如,如果您的代码具有 NullHandler,则无论日志控制如何,都不会打印任何内容。
    • 这里相同 - 如果我在 basicConfig 中省略 level 参数或将其设置在 INFO 之上,那么控制台记录器将永远不会记录任何内容。如果我忽略了basicConfig,那么我可以整天在记录器上调用setLevel(我可以通过调用getEffectiveLevel 来查看级别变化),但它永远不会记录低于WARNING 级别的任何内容。我实际上不确定这不是正确的行为,但它不是我所期望的。
    【解决方案4】:

    这会起作用

    import logging
    
    logging.basicConfig()
    logger = logging.getLogger(__name__)
    logger.setLevel(logging.INFO)
    
    logger.info('its working')
    

    【讨论】:

      【解决方案5】:

      对于那些使用absl.logging的人,等效的命令是

      from absl import logging
      logging.set_verbosity(logging.INFO)
      

      【讨论】:

        【解决方案6】:

        工作模块级记录器所需的最低代码是多少?我做了一个实验(使用python 3.8.6版)。

        结论是:

        • 需要logging.basicConfig()(但不需要指定level=...)
        • 必须配置根记录器:logging.getLogger().setLevel(...)

        所以,一个最小的工作示例是:

        # in library/module code
        import logging
        lg = logging.getLogger('x.y.z')
        
        # in application code
        logging.basicConfig()
        logging.getLogger().setLevel(logging.INFO)  # configure root logger
        lg.info("hi")  # this should print now
        

        这是实验:

        In [1]: import logging
        
        In [2]: lg = logging.getLogger('x.y.z')
        
        In [3]: lg.info(1)
        
        In [4]: logging.basicConfig()
        
        In [5]: lg.info(1)
        
        In [6]: logging.basicConfig(level=logging.INFO)
        
        In [7]: lg.info(1)
        
        In [8]: logging.basicConfig()
        
        In [9]: logging.getLogger().setLevel(logging.INFO)
        
        In [10]: lg.info(1)
        INFO:x.y.z:1
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-04-16
          • 2019-09-08
          • 2020-06-18
          • 2021-11-24
          • 2013-11-21
          • 2017-06-25
          • 1970-01-01
          • 2016-07-31
          相关资源
          最近更新 更多