我的python Flask应用程序中有一个自定义格式化程序,我已将其添加到根记录器中:
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”,“level”:“INFO”,“message”: “*在%s上运行://%s:%d /%s”}
我想也许我的格式化程序出了问题,但是当我记录我的CustomLoggingFormatter接收到的LogRecord时,它对于上面的行看起来像这样:
LogRecord:werkzeug,20,< ...> /lib/python3.5/site-packages/werkzeug/_internal.py,87,“*在%s上运行://%s:%d / %的“
这是我的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 :(得分: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)