Scrapy 在PyCharm中输出信息为红色字体的解决办法

现象:

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.

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,269评论 19 139
  • Python版本管理:pyenv和pyenv-virtualenvScrapy爬虫入门教程一 安装和基本使用Scr...
    inke阅读 61,317评论 6 99
  • 序言第1章 Scrapy介绍第2章 理解HTML和XPath第3章 爬虫基础 第4章 从Scrapy到移动应用第5...
    SeanCheney阅读 4,364评论 5 9
  • 在应用程序中添加日志记录总的来说基于三个目的:监视代码中变量的变化情况,周期性的记录到文件中供其他应用进行统计分析...
    时待吾阅读 5,060评论 0 6
  • 我还是想念你 哪怕你只是偶尔出现在我梦里,却足够让我欢喜。 哪怕是很多次我向你张开双手,却只是拥抱了风。 哪怕是在...
    南方白烛阅读 311评论 0 1