记录数据,不仅仅是字符串(Python)

时间:2018-03-29 09:40:43

标签: python logging

我想记录数据,而不仅仅是python中的字符串。

我想避免自己实现这个,因为我认为这是在以前完成的。

我读了Logging HOWTO,但它没有涵盖这个主题

同样在这里:Logging Cookbook

我想支持这些原始数据类型:

  • 字符串
  • 整数
  • 日期时间
  • 列表
  • 字典

记录后我想再次将日志解析回数据......

2 个答案:

答案 0 :(得分:5)

logging模块已经支持此功能,正如您已链接到的documentation中所述:

import logging
import datetime

if __name__ == "__main__":
    logging.basicConfig(level=logging.DEBUG)

    s = "test"
    i = 5
    today = datetime.datetime.today()
    l = [1, 2, 3, 4, "5"]
    d = {1:2, "a": 5}

    logging.debug(s)
    logging.info(i)
    logging.warning(today)
    logging.error(l)
    logging.fatal(d)

输出:

DEBUG:root:test
INFO:root:5
WARNING:root:2018-03-29 11:54:14.408168
ERROR:root:[1, 2, 3, 4, '5']
CRITICAL:root:{1: 2, 'a': 5}

如果您需要混合字符串和对象,请使用格式设置功能(默认情况下使用%格式设置):

logging.info("i = %s; s = %s", i, s)
# INFO:root:i = 5; s = test

请注意,日志记录模块很聪明。如果您执行logging.debug("%s" % , obj),则始终会调用__str__ obj方法,但如果您执行logging.debug(obj)logging.debug("%s", obj),则只会调用view engine日志记录级别设置为显示调试输出。这节省了一些时间,特别是如果这种方法很昂贵的话。

答案 1 :(得分:3)

如果您不想使用任何显式库,您可以简单地将任何对象输入到str并将其值连接到您的日志字符串。例如:

>>> from datetime import datetime

>>> 'My String: ' + str(datetime.now())
'My String: 2018-03-29 15:32:35.487581'

我个人使用str.format方法执行此类任务。它internall在填充值时调用__str__函数。

首先使用您要记录的键创建dict。例如:

log_data = {
    'string': '**some string**',
    'dict': {'some': 'dict'},
    'list': ['some', 'list'],
    'tuple': ('some', 'tuple'),
    'int': 1234,
    'datetime': datetime.now()
}

现在使用字符串上string.format函数的上述dict的解压缩版本:

>>> my_log_string = 'My String - {string}, My Dict - {dict}, My List - {list}, My Tuple - {tuple}, My int - {int}, My Datetime - {datetime}'

>>> my_log_string.format(**log_data)
"My String - **some string**, My Dict - {'some': 'dict'}, My List - ['some', 'list'], My Tuple - ('some', 'tuple'), My int - 1234, My Datetime - 2018-03-29 15:28:37.474416"