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
这样, stdout
和 stderr
都指向同一个file descriptor
, 所有的log 也都会写入这个file descriptor
.
作者:李宏杰0209
链接:https://www.jianshu.com/p/62f41ec59071
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。