2017-02-07 97 views
3

我想讓Scrapy輸出彩色日誌。我不太熟悉Python日誌記錄,但我的理解是我必須製作自己的格式化程序並讓Scrapy使用它。我成功地使用Clint爲Formatter着色輸出。Scrapy框架 - 着色日誌記錄

我的問題是,我不能讓它在Scrapy中正確工作。我會期待我的蜘蛛中的記錄器對象有一個處理程序,然後我會切換該處理程序的格式化程序。當我看到spider.logger.logger裏面的內容時,我看到handler是一個空列表。我試圖將我的格式化程序添加到新的流處理程序中。

crawler.spider.logger.logger.addHandler(sh) 其中sh是使用我的顏色格式化程序的處理程序。

這個添加效果使每個消息的拼寫輸出兩次。第一條消息是彩色的,但沒有Scrapy格式。第二個是沒有顏色的Scrapy格式。

我怎樣才能讓Scrapy輸出着色日誌保存,可以在settings.py

感謝

回答

2

如果你的意思是上色LogRecord而已,你可以在settings.py與ANSI轉義代碼定製LOG_FORMAT設置爲相同的格式。

例子:

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' 

如果你也想上色用不同的顏色不同的日誌級別,可以覆蓋scrapy.utils.log._get_handlersource code)。

將這個靠近頂部的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後,然後將其重新連接到scrapy.utils.log。 這是一個拙劣的解決方案,可能不是最好的做法,但它只是起作用。

實現此目的更正確的方法是覆蓋logging.StreamHandler。 SO上有a bunch of discussion,這可以引導你走向正確的方向。

在這裏,我提供了我在項目中使用的完整工作代碼(第三方包colorlog正在使用中)。

settings.py

import copy 

from colorlog import ColoredFormatter 
import scrapy.utils.log 

color_formatter = ColoredFormatter(
    (
     '%(log_color)s%(levelname)-5s%(reset)s ' 
     '%(yellow)s[%(asctime)s]%(reset)s' 
     '%(white)s %(name)s %(funcName)s %(bold_purple)s:%(lineno)d%(reset)s ' 
     '%(log_color)s%(message)s%(reset)s' 
    ), 
    datefmt='%y-%m-%d %H:%M:%S', 
    log_colors={ 
     'DEBUG': 'blue', 
     'INFO': 'bold_cyan', 
     'WARNING': 'red', 
     'ERROR': 'bg_bold_red', 
     'CRITICAL': 'red,bg_white', 
    } 
) 

_get_handler = copy.copy(scrapy.utils.log._get_handler) 

def _get_handler_custom(*args, **kwargs): 
    handler = _get_handler(*args, **kwargs) 
    handler.setFormatter(color_formatter) 
    return handler 

scrapy.utils.log._get_handler = _get_handler_custom