【问题标题】:Custom formatter in Python can't handle formatted log messagesPython 中的自定义格式化程序无法处理格式化的日志消息
【发布时间】:2017-09-25 07:09:20
【问题描述】:

我的 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/ %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)

为了使我的格式化程序正常工作,似乎必须首先解决字符串格式化问题,但对于几个库来说,这不会发生。有谁知道如何解决这个问题?

【问题讨论】:

  • 请务必出示您的自定义代码。 Formatter.format() 总是必须处理 LogRecord 实例;默认实现调用Formatter.formatMessage() 来处理实际的格式化(通常使用vars(record) 作为字典)。
  • 添加了我的 CustomLoggingFormatter :)
  • 由于格式化程序实现在 Python 版本之间发生了一些变化,您运行的是哪个版本的 Python?
  • 它使用 python 3.5 :)

标签: python python-3.x logging formatter


【解决方案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)

【讨论】:

  • 工作就像一个魅力!非常感谢:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-02
  • 2022-07-04
相关资源
最近更新 更多