Scrapy 在PyCharm中输出信息为红色字体的解决办法
2017-03 from--https://www.jianshu.com/p/62f41ec59071

现象:

pycharm_logging.png

原因:

在PyCharm的设置中, 运行窗口会把stderr的信息输出为红色:

pycharm_error.png

只要把Foreground取消掉就可以了

本质:

那么现在的问题是, 为什么Scrapy的的log信息会出现在stderr中?

首先我们看一下Scrapy log的配置:

def configure_logging(settings=None, install_root_handler=True):
# 删除不必要的信息
if install_root_handler:
logging.root.setLevel(logging.NOTSET)
handler = _get_handler(settings)
logging.root.addHandler(handler)
def _get_handler(settings):
""" Return a log handler object according to settings """
filename = settings.get('LOG_FILE')
if filename:
encoding = settings.get('LOG_ENCODING')
handler = logging.FileHandler(filename, encoding=encoding)
elif settings.getbool('LOG_ENABLED'):
handler = logging.StreamHandler()
else:
handler = logging.NullHandler()
formatter = logging.Formatter(
fmt=settings.get('LOG_FORMAT'),
datefmt=settings.get('LOG_DATEFORMAT')
)
handler.setFormatter(formatter)
handler.setLevel(settings.get('LOG_LEVEL'))
if settings.getbool('LOG_SHORT_NAMES'):
handler.addFilter(TopLevelFormatter(['scrapy']))
return handler

Scrapy的默认设置是给root logger根据配置信息添加一个Handler, 默认为

handler = logging.StreamHandler()

StreamHandler的默认设置是:

def __init__(self, stream=None):
"""
Initialize the handler.
If stream is not specified, sys.stderr is used.
"""
Handler.__init__(self)
if stream is None:
stream = sys.stderr
self.stream = stream

所以我们的log信息都跑到stderr中去了.

现在知道原理之后, 我们可以用更加Pythonic的方法解决这个问题:

import sys
sys.stderr = sys.stdout

这样, stdoutstderr 都指向同一个file descriptor, 所有的log 也都会写入这个file descriptor.

作者:李宏杰0209
链接:https://www.jianshu.com/p/62f41ec59071
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

上一篇
下一篇