logging.info 未显示在控制台上,但会出现警告和错误

问题描述 投票:0回答:10

当我使用

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 python-logging
10个回答
220
投票

根记录器始终默认为警告级别。打电话试试

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

你应该没问题。


51
投票

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

您可以使用 logging.basicConfig 并设置 logger level:

logging.basicConfig(level=logging.DEBUG)

31
投票

上述解决方案对我不起作用,但代码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)

(为了可读性,我省略了部分代码)


17
投票

这会起作用

import logging

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

logger.info('its working')

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

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

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

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


4
投票

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

要点是:

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

因此,最小的工作示例是:

库/模块代码不需要配置记录器:

# library/module code: lib.py
import logging
LOGGER = logging.getLogger('x.y.z')

def some_function():
    LOGGER.info("hi")

应用程序代码需要配置记录器至少2行:

# Application Code
import logging, lib

logging.basicConfig()
logging.getLogger().setLevel(logging.INFO)  # configure root logger

main()  # code that will trigger lib

这是实验:

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

1
投票

如果您使用 Django 来支持您的服务器,您只需要更改 settings.py 文件中的日志级别,如下所示:

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

此处文档中的更多示例: https://docs.djangoproject.com/en/4.0/topics/logging/#configuring-logging-1


0
投票

对于使用

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

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

0
投票

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。 如果没有级别参数,根记录器的默认级别是警告。

参考


0
投票

我通常使用这样的配置:

logging.basicConfig(level=logging.INFO, format="%(asctime)s %(levelname)s %(message)s", datefmt="%Y-%m-%d %H:%M:%S", filename=f"./logs/app_log_{datetime}.log")
© www.soinside.com 2019 - 2024. All rights reserved.