【问题标题】:Log data, not only string (Python) [closed]记录数据,不仅是字符串(Python)[关闭]
【发布时间】:2023-03-09 10:34:01
【问题描述】:

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

我想避免自己实现这个,因为我认为这是以前做过的。

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

这里也一样:Logging Cookbook

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

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

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

【问题讨论】:

  • 你为什么不能直接登录为"your log string" + str(whatever_value_you_have)
  • 我仍然不明白为什么这里不允许关于“使用哪个库”的问题。我将问题“移至”此页面:softwarerecs.stackexchange.com/questions/49402/…

标签: python logging


【解决方案1】:

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),则始终会调用obj__str__ 方法,但如果您执行logging.debug(obj)logging.debug("%s", obj),则只有在日志级别设置为显示调试输出时才会调用它。这样可以节省一些时间,尤其是在这种方法很昂贵的情况下。

【讨论】:

    【解决方案2】:

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

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

    我个人使用str.format 方法来完成此类任务。它在填充值时在内部调用__str__ 函数。

    首先使用您要记录的密钥创建一个dict。例如:

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

    现在将上述字典的解压版本与字符串上的string.format 函数一起使用:

    >>> 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"
    

    【讨论】:

    • 使用logging模块的内置方法的好处是,如果字符串低于日志级别,则不会被格式化。这为 __str__ 昂贵的对象节省了一些时间。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-04
    • 1970-01-01
    • 2015-03-20
    • 2017-04-05
    • 2019-06-08
    • 1970-01-01
    相关资源
    最近更新 更多