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

Posted

技术标签:

【中文标题】Python3 和 PyCharm - 在运行/调试中调试日志记录级别【英文标题】:Python3 & PyCharm - Debug logging levels in run/debug 【发布时间】:2014-05-02 00:24:24 【问题描述】:

我刚开始使用 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

但是调试,信息不显示。

【问题讨论】:

【参考方案1】:

问题与 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 函数,它允许您将日志记录层次结构指定为字典,而无需手动创建每个处理程序和记录器。

【讨论】:

@diimdeep 这是什么意思?就目前而言,您的评论不具建设性,可能会被标记和删除。如果您想以某种方式评估答案/问题的价值,您应该投票/反对它。如果您不理解答案和一些说明,或者您发现与答案相关的不同问题,您应该添加评论解释当前答案有什么问题。否则,您只需提出一个新问题。那么它是哪一个?【参考方案2】:

只是为了让它运行而非常肮脏的解决方法是覆盖日志记录功能。 它可能会派上用场,有时您只是想快速浏览一下而不设置整个调试级别。

!请勿在生产中使用它!

logging.debug = print
logging.info = print

【讨论】:

很遗憾 pycharm 没有为您执行此操作的设置。我觉得它会大大改善开发体验【参考方案3】:
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。请注意,您导入的库也将登录此级别(除非您明确排除它们)。如果 root logger 已经初始化,这将不会执行任何操作,除非您传递 force=True

【讨论】:

以上是关于Python3 和 PyCharm - 在运行/调试中调试日志记录级别的主要内容,如果未能解决你的问题,请参考以下文章

pycharm下同存Python2和Python3的运行方式问题

pycharm编译python3为啥不能直接计算数学结果?

自制进度条在python3下PyCharm中运行或在控制台按照目录运行

关于Python3的import问题(pycharm可以运行,命令行import错误)

拎壶学python3-----pycharm解决运行时少库的问题

隔离python 运行环境和Pycharm 设置代码同步