我正在尝试制作Scrapy输出彩色日志。我对Python日志记录并不熟悉,但我的理解是我必须创建自己的Formatter并让它由Scrapy使用。我成功地使用Clint将Formatter设置为着色输出。
我的问题是我不能正确地在Scrapy中使用它。我本来希望我的蜘蛛中的logger对象有一个处理程序,然后我会切换该处理程序的格式化程序。当我查看spider.logger.logger
内的内容时,我看到handler
是一个空列表。我尝试在新的流处理程序中添加格式化程序。
crawler.spider.logger.logger.addHandler(sh)
其中sh是使用我的颜色格式化程序的处理程序。
这个添加效果可以使每个消息两次输出。第一条消息是彩色的,但没有Scrapy格式。第二个是没有颜色的Scrapy格式。
如何使Scrapy输出彩色日志保持与settings.py
由于
答案 0 :(得分:5)
如果您只想着色LogRecord
,则可以使用ANSI转义码在 foreach ($i = 0; $i <= $List; $i++)
{
foreach($ii = 0; $ii2 <= $List 2; ii++)
{
}
// something
}
中自定义LOG_FORMAT
。
示例:
settings.py
如果您还想使用不同颜色为不同的日志级别着色,则可以覆盖LOG_FORMAT = '\x1b[0;0;34m%(asctime)s\x1b[0;0m \x1b[0;0;36m[%(name)s]\x1b[0;0m \x1b[0;0;31m%(levelname)s\x1b[0;0m: %(message)s'
(source code)。
将它放在scrapy.utils.log._get_handler
settings.py
它的作用是在调用原始import scrapy.utils.log
_get_handler = copy.copy(scrapy.utils.log._get_handler)
def _get_handler_custom(*args, **kwargs):
handler = _get_handler(*args, **kwargs)
handler.setFormatter(your_custom_formatter)
return handler
scrapy.utils.log._get_handler = _get_handler_custom
后重置格式化程序,然后将其重新附加到_get_handler
。
这是一个hacky解决方案,可能不是最好的做法,但它只是有效。
更实际的方法是覆盖scrapy.utils.log
。 SO上有a bunch of discussion可以引导您走向正确的方向。
在这里,我提供了我的项目中使用的完整工作代码(正在使用第三方软件包colorlog
。)
logging.StreamHandler
settings.py