当我使用
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 文件中进行更改。
根记录器始终默认为警告级别。打电话试试
logging.getLogger().setLevel(logging.INFO)
你应该没问题。
就像@ztyx所说,默认记录器级别是警告。你必须将其设置为较低的级别
您可以使用 logging.basicConfig 并设置 logger level:
logging.basicConfig(level=logging.DEBUG)
上述解决方案对我不起作用,但代码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)
(为了可读性,我省略了部分代码)
这会起作用
import logging
logging.basicConfig()
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)
logger.info('its working')
在 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
我不明白为什么会这样,因为这似乎没有必要。
工作模块级记录器所需的最低代码是什么?我做了一个实验(使用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
如果您使用 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
对于使用
absl.logging
的用户,等效命令是
from absl import logging
logging.set_verbosity(logging.INFO)
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(level=logging.DEBUG)
这将创建记录器。 logger.level 将是我们在此处设置的级别。 还将创建一个流处理程序,级别为 NOTSET。 如果没有级别参数,根记录器的默认级别是警告。
我通常使用这样的配置:
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")