Info 不会出现在控制台上,但是会出现警告和错误

当我使用 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 文件中进行更改。

124593 次浏览

根日志记录器始终默认为警告级别

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

你会没事的。

就像@ztyx 所说的,默认的日志记录器级别是警告。你必须把它设置到一个较低的级别

你可以通过使用 BasicConfig并设置 记录器电平:

logging.basicConfig(level=logging.DEBUG)

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

# 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)

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

会成功的

import logging


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


logger.info('its working')

对于使用 absl.logging的用户,等效的命令是

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

对于一个工作模块级别的日志记录器,最低需要的代码是什么。

外卖是:

  • 需要 logging.basicConfig()(但是,不需要指定 level=...)
  • 配置 root 日志记录器的是 有需要: 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

如果您正在使用 Django 为服务器供电,那么您只需要像这样更改 setings.py 文件中的日志级别:

"handlers": {
"console": {
--                  "level": "WARNING",
++                  "level": "INFO",
"class": "logging.StreamHandler",
"formatter": "stackdriver",
}
},

这里的文档中有更多的例子: Https://docs.djangoproject.com/en/4.0/topics/logging/#configuring-logging-1

logging.info()将使用根日志记录器进行日志记录。

根据 官方文件, 如果不为日志记录器设置显式处理程序,则将使用称为 lastResort的特殊处理程序。 参见 这里有密码。默认情况下,lastResort的日志记录级别(它是流处理程序)是30。 我们可以改变它的水平输出信息消息。

# setting both the logger and handler's level will work as expected.
logger.setLevel(logging.DEBUG)
logging.lastResort.setLevel(logging.DEBUG)

然而,这就像一个黑客,从来没有一个鼓励的行动。

使用 logging.basicConfig ()

如果我们想真正快速地做日志记录,我们可以使用方法 logging.basicConfig

logging.basicConfig(level=logging.DEBUG)

这将创建日志记录器。 logger.level 将是我们在这里设置的级别。 还将创建一个流处理程序,其级别为 NOTSET。 如果没有级别参数,根日志记录器的默认级别是 WARWN。

参考文献

在最新版本的 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')

运行上述代码将生成以下输出:

info message
warn message
error message
critical message

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

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')

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

warn message
error message
critical message

我不明白为什么会出现这种情况,因为这似乎是没有必要的。