2017-09-25 74 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