【问题标题】:How can I log a dictionary into a log file?如何将字典记录到日志文件中?
【发布时间】:2023-03-22 06:51:01
【问题描述】:

我有一本字典:

 d = {name : "John", age: 10}. 

并将日志文件设置为:

logging.basicConfig(level = logging.DEBUG, filename = "sample.log")

是否可以将此字典记录到“sample.log”文件中?如果是,我该怎么做?

【问题讨论】:

  • 我必须登录到同一个文件...因为还有其他日志也在被记录。

标签: python python-2.7 logging


【解决方案1】:

有效的简单解决方案

日志记录函数会将'%s' 转换为字符串表示形式(如果对象恰好是一个容器,那么repr() 将用于包含的对象)

import logging
logging.basicConfig(level=logging.DEBUG, filename='sample.log')
logging.debug('Sample dict log: %s', {'name' : "John", 'age': 10})

它在日志文件中的显示方式:

DEBUG:root:Sample dict log: {'age': 10, 'name': 'John'}

如果您有自定义对象(例如您自己的类的实例),您应该为它实现一个合理的__str__ 和/或__repr__,以上内容将无需任何技巧即可工作。

更多信息在这里Difference between __str__ and __repr__ in Python

JSON 不太适合这个

对于非 JSON 对象(对象实例、日期时间等),json.dumps() 需要自定义序列化程序,例如使用datetime 获得的对象:

TypeError: datetime.datetime(...) is not JSON serializable

这适用于json.dumps() 不支持的任何类型

logging 模块会为对象找出一个很好的表示

【讨论】:

  • 您可以使用 json 挂钩强制 json.dumps() 未处理的类型,如下所示:stackoverflow.com/questions/8793448/…
  • 在 Raspberry Pi 上,这仅在字典不包含某些信息时才有效。似乎 pprint 解决方案是通用的。
【解决方案2】:

简单易用

dict_data = {"test":"data"}
logger.info("Loging dict ---> {0}".format(dict_data))

【讨论】:

  • 我不会这样做。在记录器中格式化东西是不好的做法,因为格式总是会被评估。如果您的 dict 很大并且您将 logLevel 设置为 ERROR,则该 dict 仍将被转换为字符串,尽管没有在任何地方打印。
【解决方案3】:

你可以把它转换成字符串:

string_dictionary = str(d)

然后将字符串字典变量记录到文件中

使用 JSON

import json

d = {"name":"John","age":10}
json_string = json.dumps(d)

如果你想将字符串转换回来:

d = json.loads(json_string)

【讨论】:

  • 将其转换为字符串然后存储它是不是一个好主意?
  • 日志文件是一个文本文件,所以无论你用什么方法来记录它,它都会以将字典转换为字符串结束,第二种方法是将它转换为 json 如果你想使用再次为 json 导入 json 后将是 json.dumps(d)
  • 是的...我在寻找 json.dumps 你能显示上面代码的示例吗??
  • 当然,import json d = {"name":"John","age":10} json_string = json.dumps(d) 如果你想将字符串转换回来:d = json .loads(json_string)
  • 那么我可以直接将json_string放入日志文件吗??
【解决方案4】:

str(dictionary)json.dumps(dictionary) 的问题在于输出可能对人类不友好,尤其是在字典很大且具有嵌套结构的情况下。

如果是这种情况,您可以使用 Python 的内置 pprint 在记录之前漂亮地格式化字典:

import pprint

my_complex_dict = pprint.pformat(my_complex_dict)
logger.info(f"My complex dict:\n{my_complex_dict}")

【讨论】:

  • 不确定 2016 年是否有此选项,但现在您只需将 indent 参数添加到 json.dumps 即可获得格式良好的字典。检查documentation
【解决方案5】:

当我想为 Cloudwatch 记录 JSON 行时,我提出了这个问题。

我最终使用了python-json-logger

安装它:pip install python-json-logger

使用pythonjsonlogger.jsonlogger.JsonFormatter 作为格式化程序类。

【讨论】:

    猜你喜欢
    • 2019-01-11
    • 2013-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-12
    • 2014-09-22
    相关资源
    最近更新 更多