Python3& PyCharm - 在运行/调试中调试日志记录级别

时间:2014-03-24 14:57:47

标签: python debugging logging python-3.x pycharm

我刚开始使用PyCharm,有没有办法显示调试&信息警告?

import logging
logger = logging.getLogger('tipper')
logger.setLevel(logging.DEBUG)
logger.debug('debug message')
logger.info('info message')
logger.warn('warn message')
logger.error('error message')
logger.critical('critical message')

警告,错误,关键所有节目:

/home/username/someproject/.someprojectenv/bin/python3/home/username/someproject/go.py
warn message
error message
critical message

Process finished with exit code 0

然而,调试,信息不显示。

3 个答案:

答案 0 :(得分:16)

问题与PyCharm无关,但与日志配置的工作方式有关。如果您尝试编写在普通python交互式会话中显示的代码,则会得到相同的输出:

>>> import logging
>>> logger = logging.getLogger('tipper')
>>> logger.setLevel(logging.DEBUG)
>>> logger.debug('debug message')
>>> logger.info('info message')
>>> logger.warn('warn message')
warn message
>>> logger.error('error message')
error message
>>> logger.critical('critical message')
critical message

问题是设置logger的级别还不够!您还必须向记录器添加处理程序,否则记录器将简单地将消息转发到链中。这些消息最终会显示在root记录器上,默认情况下,该记录器的级别为logging.WARN,因此会丢弃DEBUG级别的消息。

但是,如果您向logger添加处理程序,则一切正常:

>>> logger.addHandler(logging.StreamHandler())
>>> logger.debug('test')
test

您可以为每个记录器设置多个处理程序,每个处理程序可以具有不同的记录级别。

有关记录器和处理程序级别的更多信息,请参阅this问题。我还建议您仔细阅读logging模块和各种指南(例如logging How-To)的文档,因为它具有非常高级的配置。

同样来自python3.2的dictConfig函数允许您将日志记录层次结构的配置指定为字典,而无需手动手动创建每个处理程序和记录器。

答案 1 :(得分:1)

Very dirty workaround just to get it run is to overwrite the logging functions. It may come in handy sometimes you just want to take a quick look without setting the whole debug level.

!DONT USE THIS IN PRODUCTION!

logging.debug = print
logging.info = print

答案 2 :(得分:0)

import logging
import datetime

logging.basicConfig(
    level=logging.DEBUG,
    format="%(asctime)s [%(levelname)8.8s] %(message)s",
    handlers=[logging.StreamHandler(),
              logging.FileHandler(f'log/{datetime.datetime.now().isoformat().replace(":", "-")}.log', encoding='utf-8')],
)
logger = logging.getLogger(__name__)

广告Bakuriu说,Python的默认日志级别为WARNING,因为否则输出将被淹没。

作为他们的答案的补充,如上所述,您还可以使用basicConfig。这将修改所有其他记录器都继承的 root 记录器的设置,这意味着您不必在项目中的每个文件中都设置DEBUG。请注意,导入的库也将在此级别登录(除非您明确排除它们)。如果根记录器已经被初始化,那么这将不起作用,除非您通过force=True