Python3与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 个回答
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
,就像上面展示的那样。这会修改根日志记录器的设置,所有其他的日志记录器都会从这个根日志记录器继承设置,这样你就不需要在项目中的每个文件里都设置DEBUG级别。需要注意的是,你导入的库也会在这个级别上记录日志(除非你特别排除它们)。如果根日志记录器已经初始化了,这个设置不会有任何作用,除非你传入force=True
。
一个非常不太干净的解决办法,就是覆盖掉日志记录的功能。这样做有时候会很方便,特别是当你只是想快速查看一些信息,而不想调整整个调试级别的时候。
!不要在正式环境中使用这个办法!
logging.debug = print
logging.info = print
这个问题和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
的级别是不够的!你还必须给logger添加一个处理器(handler),否则logger会把消息往上层传递。最终这些消息会到达root
logger,而这个logger默认的级别是logging.WARN
,所以会把DEBUG
级别的消息给丢掉。
但是如果你给logger
添加了一个处理器,一切就正常了:
>>> logger.addHandler(logging.StreamHandler())
>>> logger.debug('test')
test
你可以为每个logger设置多个处理器,并且每个处理器可以有不同的日志级别。
想了解更多关于logger和handler级别的信息,可以看看这个问题。我还建议你仔细阅读一下logging
模块的文档和各种指南(比如logging
使用指南,因为它有非常高级的配置)。
另外,从Python 3.2开始,有一个dictConfig
函数,可以让你用字典的方式来指定日志配置,这样就不用手动一个个创建处理器和logger了。