logging.info没有显示在控制台上,但警告和错误

day*_*mer 64 python logging warnings

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

import logging
logging.info('I am info')  # no output
Run Code Online (Sandbox Code Playgroud)

相反,使用logging.warndo 记录的事件将显示在终端中.

import logging
logging.warn('I am warning')  # outputs "I am warning"
Run Code Online (Sandbox Code Playgroud)

是否有环境级别的变化我可以logging.info打印到控制台?我想避免在每个Python文件中进行更改.

Zty*_*tyx 113

根记录器始终默认为WARNING级别.试着打电话

logging.getLogger().setLevel(logging.INFO)
Run Code Online (Sandbox Code Playgroud)

你应该没事

  • 你知道为什么logging.basicConfig(level = logging.INFO)不起作用吗?我无法在文档中清楚地看到它. (13认同)
  • 这不适用于 Python 3.5:`Python 3.5.2(默认,2018 年 11 月 12 日,13:43:14)` `[GCC 5.4.0 20160609] on linux` `>>> 导入日志记录`>>> rootLog = logging.getLogger()` `>>> rootLog.setLevel(logging.INFO)` `>>> rootLog.info('所有国王的马')``>>> rootLog.warning('所有的国王男人' )``所有的国王男人` (10认同)
  • @jeffk,与我相同,即使 setLevel 设置为logging.INFO,3.6.8 也不会打印信息消息 (10认同)
  • FWIW,这篇文章解释了为什么最好避免根记录器和日志模块级别的方法调用:https://www.electricmonk.nl/log/2017/08/06/understanding-pythons-logging-module/ tl;dr 是:“不要直接针对根记录器进行记录。这意味着:不使用 logging.basicConfig() 并且不使用模块级记录器,例如 logging.warning(),因为它们会产生意想不到的副作用。” (2认同)

小智 18

这会起作用

import logging

logging.basicConfig()
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)

logger.info('its working')
Run Code Online (Sandbox Code Playgroud)


Vla*_*den 11

像@ztyx一样,默认记录器级别是警告.您必须将其设置为较低级别

您可以使用logging.basicConfig并设置记录器级别来完成此操作:

logging.basicConfig(level=logging.DEBUG)
Run Code Online (Sandbox Code Playgroud)

  • @ShayanAmani - 根据文档,“如果根记录器已经配置了处理程序,则该函数不会执行任何操作,除非关键字参数强制设置为 True。” (3认同)
  • 我想知道为什么`logic.getLogger()。setLevel()`可以正常工作,而`basicConfig()`不能为我工作吗? (2认同)

小智 7

上面的解决方案对我不起作用,但是这里的代码起作用了:

# 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)
Run Code Online (Sandbox Code Playgroud)

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


Ste*_*ell 7

在 Python 3 的最新版本(使用 Python 3.8 进行测试)中,控制台日志记录需要创建控制台处理程序才能正确显示info消息。

以下示例是根据Python 文档中的配置日志记录示例修改的:

import logging

# create logger
logger = logging.getLogger('__name__')
level = logging.INFO
logger.setLevel(level)

# ----> console info messages require these lines <----
# create console handler and set level to debug
ch = logging.StreamHandler()
ch.setLevel(level)

# add ch to logger
logger.addHandler(ch)
# -----------------------------------------------------

# 'application' code
logger.debug('debug message')
logger.info('info message')
logger.warning('warn message')
logger.error('error message')
logger.critical('critical message')
Run Code Online (Sandbox Code Playgroud)

运行上面的代码会生成以下输出:

info message
warn message
error message
critical message
Run Code Online (Sandbox Code Playgroud)

这是没有控制台处理程序的相同代码。

import logging

# create logger
logger = logging.getLogger('__name__')
level = logging.INFO
logger.setLevel(level)

# 'application' code
logger.debug('debug message')
logger.info('info message')
logger.warning('warn message')
logger.error('error message')
logger.critical('critical message')
Run Code Online (Sandbox Code Playgroud)

如果没有控制台处理程序,输出将不包含信息消息:

warn message
error message
critical message
Run Code Online (Sandbox Code Playgroud)

我不明白为什么会这样,因为这似乎没有必要。