2017-09-25 9 views
2

形式のログメッセージを処理することができない私は、ルートロガーに追加した私のpythonフラスコアプリケーション、カスタムフォーマッタを持っている:私がしたいときカスタムフォーマッタは

logger = logging.getLogger() 
logger.setLevel(logging.INFO) 

handler = logging.StreamHandler() 
handler.setLevel(logging.INFO) 

formatter = CustomLoggingFormatter() 
handler.setFormatter(formatter) 

logger.addHandler(handler) 

これは完全に正常に動作します何かをログに記録する(logger.info()...)が、ライブラリのログに問題があります。 uwsgi。ここ

は、ログメッセージの例である:

{ "@timestamp": "2017-09-25T06:57:45.373Z"、 "レベル": "INFO"、 "メッセージ" : は "*%sの上で実行://%sの:%D /%sの"}

私は何かが私のフォーマッタと間違っていたかもしれないと思ったが、私はLogRecordのをログインしたときに見えた私のCustomLoggingFormatterのreceivs、上記の行のように:

たLogRecord: "://%sは%D /%S%Sに*実行" WERKZEUG、20、< ...>/libに/ python3.5 /のsite-packages/WERKZEUG/_internal.py、87、ここで

は私CustomLoggingFormatterです:仕事に私のフォーマッタについては

class CustomLoggingFormatter(Formatter): 
    data = {} 

    def __init__(self): 
     super(CustomLoggingFormatter, self).__init__() 

    def format(self, record): 
     print(record) 
     input_data = {} 
     input_data['@timestamp'] = datetime.utcnow().isoformat()[:-3] + 'Z' 
     input_data['level'] = record.levelname 
     if record.msg: 
      input_data['message'] = record.msg 

     input_data.update(self.data) 
     return json.dumps(input_data) 

、しかし起こらないいくつかのライブラリのため、文字列の書式は、最初に解決しなければならないようです。この問題を解決する方法を知っている人は誰ですか?

+0

カスタムコードを表示してください。 'Formatter.format()'は常に 'LogRecord'インスタンスを扱わなければなりません。デフォルトの実装では、 '(一般的に辞書として' VARS(レコード)を使用しています ')実際の書式設定を処理するために)' Formatter.formatMessage(呼び出します。フォーマッタの実装は、あなたは、Pythonのバージョンを実行している、Pythonのバージョン間のビットを変更したので –

+0

は私のCustomLoggingFormatter :) – user16655

+0

を追加しましたか? –

答えて

1

あなたはいつもrecord.getMessage()を呼び出す必要があります。それはrecord.msgの値をとり、それにフォーマットを適用します。 default implementation of Formatter.format()は、最終的な文字列に補間のためrecord.messageに結果を割り当てます。

def format(self, record): 
    print(record) 
    record.message = record.getMessage() 
    input_data = {} 
    input_data['@timestamp'] = datetime.utcnow().isoformat()[:-3] + 'Z' 
    input_data['level'] = record.levelname 

    if record.message: 
     input_data['message'] = record.message 

    input_data.update(self.data) 
    return json.dumps(input_data) 
+0

を使用していますが魅力のように働きました!どうもありがとう :) – user16655

関連する問題