gpt4 book ai didi

Python 控制台日志记录和千位分隔符,同时保留结构化日志兼容性

转载 作者:行者123 更新时间:2023-12-04 12:21:55 24 4
gpt4 key购买 nike

我正在向控制台日志输出数十亿的大整数。目前,我正在使用 f 字符串格式化千位分隔符语法,以使它们可读。

logger.info("Items created %s", "{:,}".format(large_number))
因为这很笨重,有没有办法使用千位分隔符将日志格式化为本地格式化整数(如果必须,默认为美国语言环境)?
编辑:请注意 logger.info(f"Items created {large_number:,}")是一个不正确的答案。因为像 Sentry 或 Datadog 这样的日志索引服务将无法解析 structured logs .它还会导致在禁用的日志级别上不必要地执行字符串格式化操作。

最佳答案

您是否考虑过添加过滤器来更新大量数字?

import logging
import os

class Formatter(logging.Formatter):
def format(self, record):
record.pid = os.getpid()
return logging.Formatter.format(self, record)

def comma_filter(record):
new_args = []
for arg in record.args:
if not isinstance(arg, int):
new_args.append(arg)
else:
new_int = []
str_num = str(arg)
while str_num:
new_int.insert(0, str_num[-3:])
str_num = str_num[:-3]
new_args.append(','.join(new_int))
record.args = tuple(new_args)
return record


main_logger = logging.getLogger()
main_logger.setLevel(logging.INFO)
handler = logging.StreamHandler()
handler.setFormatter(Formatter('%(asctime)s %(pid)d %(name)s %(levelname)s: %(message)s'))
handler.addFilter(comma_filter)
main_logger.addHandler(handler)
并在使用中:
>>> main_logger.info('testing: %s', 1234567)
2021-07-20 15:16:17,314 592732 root INFO: testing: 1,234,567
2021-07-20 15:16:17,314 592732 root INFO: testing: 1,234,567

>>> main_logger.info('%s thingies has %s widgets', 13, 7777)
2021-07-20 15:16:17,314 592732 root INFO: 13 thingies has 7,777 widgets
2021-07-20 15:16:17,314 592732 root INFO: 13 thingies has 7,777 widgets
如果我正确理解文档,则不会调用附加到处理程序的过滤器,除非要记录记录(如果过滤器返回 None,则不会记录记录)。

关于Python 控制台日志记录和千位分隔符,同时保留结构化日志兼容性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68374801/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com