2017-02-07 2 views
3

私はScrapy出力カラー化ログを作成しようとしています。私はPythonのロギングに慣れていませんが、自分のFormatterを作成してScrapyで使用する必要があることを理解しています。私はClintを使用して出力をカラー化するためにFormatterを作成することに成功しました。Scrapy framework - ロギングのカラー化

私の問題は、Scrapy内で正しく動作させることができないことです。私はスパイダーのロガーオブジェクトにハンドラを持たせることを期待していましたが、そのハンドラのフォーマッタを切り替えることになりました。内部にあるものがspider.logger.loggerのように見えるときは、handlerが空のリストであることがわかります。私は新しいストリームハンドラで自分のフォーマッタを追加しようとしました。

crawler.spider.logger.logger.addHandler(sh) ここで、shは自分のカラーフォーマッタを使用するハンドラです。

このメッセージは、各メッセージを2回出力するためのエフェクトです。最初のメッセージは色付きですが、Scrapyの書式はありません。 2つ目は色のないScrapyの書式設定です。

どのように私はScrapy出力色付けログはsettings.py

で設定することができるのと同じ形式を維持することができますおかげ

答えて

2

だけLogRecordを色付けすることを意味する場合は、ANSIエスケープコードでsettings.pyLOG_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