Python 中的自定义格式化程序无法处理格式化的日志消息
Custom formatter in Python can't handle formatted log messages
我的 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":
" * Running on %s://%s:%d/ %s"}
我认为我的格式化程序可能有问题,但是当我记录我的 CustomLoggingFormatter 收到的 LogRecord 时,上面的行看起来像这样:
LogRecord: werkzeug, 20, <...>/lib/python3.5/site-packages/werkzeug/_internal.py, 87, " * Running on %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)
要使我的格式化程序正常工作,似乎必须先解决字符串格式问题,但对于几个库来说,这并没有发生。谁知道如何解决这个问题?
您需要随时拨打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)
我的 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": " * Running on %s://%s:%d/ %s"}
我认为我的格式化程序可能有问题,但是当我记录我的 CustomLoggingFormatter 收到的 LogRecord 时,上面的行看起来像这样:
LogRecord: werkzeug, 20, <...>/lib/python3.5/site-packages/werkzeug/_internal.py, 87, " * Running on %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)
要使我的格式化程序正常工作,似乎必须先解决字符串格式问题,但对于几个库来说,这并没有发生。谁知道如何解决这个问题?
您需要随时拨打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)