2017-09-25 99 views
2

我在蟒蛇瓶的應用程序,我已經加入到根logger有一個自定義格式:自定義格式不能處理格式化的日誌消息

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」, 「水平」: 「信息」, 「消息」 : 「*運行在%s://%S:%d /%S」}

我想也許是出事了與我的格式,但是當我登錄了的LogRecord這我CustomLoggingFormatter receivs,它看起來對於上面的行來說就像這樣:

LogRecord:werkzeug,20,< ...>/lib/python3.5/site-packages/werkzeug/_internal.py,87,「*%s://%s:%d /%s上運行」

這裏是我的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實例;默認實現調用'Formatter.formatMessage()'來處理實際的格式(通常使用'vars(record)'作爲字典)。 –

+0

添加了我的CustomLoggingFormatter :) – user16655

+0

由於格式化程序實現在Python版本之間有所改變,因此您運行的是哪個版本的Python? –

回答

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