我想记录数据,而不仅仅是python中的字符串。
我想避免自己实现这个,因为我认为这是在以前完成的。
我读了Logging HOWTO,但它没有涵盖这个主题
同样在这里:Logging Cookbook
我想支持这些原始数据类型:
记录后我想再次将日志解析回数据......
答案 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"