【问题标题】:Formatting the message in Python logging在 Python 日志记录中格式化消息
【发布时间】:2021-10-21 12:22:43
【问题描述】:

我想了解使用 Python 日志记录模块修改日志消息的消息部分是否可能以及如何可能。

所以基本上,您可以将完整的日志格式化为:

format = '{"timestamp": "%(asctime)s", "logger_level": "%(levelname)s", "log_message": %(message)s}'

但是,我想确保消息部分始终为 json 格式。有什么办法可以只修改消息部分的格式,也许是自定义logging.Formatter

谢谢。

【问题讨论】:

  • 它被转换为 json 与 json.dumps() 我希望
  • 这还不够吗? - github.com/madzak/python-json-logger 或者我没有正确理解你的问题
  • 问题是,如果消息是字典,它会将其格式化为一个完整的字符串,而我希望整个日志是一个 json 项
  • 您能否提供一个包含实际输出和预期输出的简单示例? stackoverflow.com/help/minimal-reproducible-example
  • @daniel,您是说您希望log["log_message"] 成为字典,而不是字符串? (当然是在将日志字符串解析为json之后。)

标签: python logging


【解决方案1】:

格式规范%(message)s 告诉Python 你想要格式化一个字符串。用%(message)r 试试,它应该可以完成这项工作:

>>> logging.error('{"log_message": %r}', {"a": 55})
ERROR:root:{"log_message": {'a': 55}}

【讨论】:

    【解决方案2】:

    an example in the Logging Cookbook 显示了这样做的一种方法。基本上:

    import json
    import logging
    
    class StructuredMessage:
        def __init__(self, message, /, **kwargs):
            self.message = message
            self.kwargs = kwargs
    
        def __str__(self):
            return '%s >>> %s' % (self.message, json.dumps(self.kwargs))
    
    _ = StructuredMessage   # optional, to improve readability
    
    logging.basicConfig(level=logging.INFO, format='%(message)s')
    logging.info(_('message 1', foo='bar', bar='baz', num=123, fnum=123.456))
    

    当然,您可以调整这个基本想法来做一些更接近您想要/需要的事情。

    更新:只有在实际输出消息时才会进行格式化。此外,它不适用于来自第三方库的日志记录。在导入 import logging 的任何其他模块之前,您需要对 Logger 进行子类化,但它是 documented approach

    【讨论】:

    • 但是,这要求您在将每条消息传递给日志记录模块之前对其进行隐式格式化。这种格式是否有可能适用于所有消息而无需特别说明?
    猜你喜欢
    • 2020-04-15
    • 2016-02-20
    • 2013-12-15
    • 1970-01-01
    • 1970-01-01
    • 2020-06-26
    • 2015-08-01
    • 1970-01-01
    • 2019-07-11
    相关资源
    最近更新 更多