【发布时间】:2017-01-31 08:02:52
【问题描述】:
有时我使用%(funcName)s 配置python 日志格式化程序。但是当函数名很长时我不喜欢这样。
在使用 python logging %(funcName)s 时可以缩短日志记录头吗?如果是,如何?
你能说...将字符总数限制为 10 个字符吗?
【问题讨论】:
-
你能发布一些你想要改进的代码吗?
标签: python logging instrumentation
有时我使用%(funcName)s 配置python 日志格式化程序。但是当函数名很长时我不喜欢这样。
在使用 python logging %(funcName)s 时可以缩短日志记录头吗?如果是,如何?
你能说...将字符总数限制为 10 个字符吗?
【问题讨论】:
标签: python logging instrumentation
日志格式字符串中的%(...)s 项是% 替换,您可以通过执行%(funcName).10s 之类的操作来限制字符串替换的长度
例如
import logging
logging.basicConfig(
format='%(funcName).10s %(message)s',
level=logging.INFO,
)
logger = logging.getLogger()
def short():
logger.info("I'm only little!")
def really_really_really_really_long():
logger.info("I'm really long")
short()
really_really_really_really_long()
给予
andy@batman[17:54:01]:~$ p tmp_x.py
short I'm only little!
really_rea I'm really long
【讨论】:
%f 字符串格式化时使用过该字符串格式功能) .一个补充:如果您将%.10s 更改为%10.10s,那么当函数太短时(使您的日志标头长度恒定),您会得到一个常量大小 10。
%s 完成的全部内容的体面文档?我真的很想链接到一些文档,但我发现的页面只提到%s 在对象上调用str(),而没有太多关于修饰符的内容。
您可以扩展 logging.formatter 类以获得所需的格式,如下所示。
这只是一个例子。你应该根据你的要求修改它
class MyFormatter(logging.Formatter):
in_console = False
def __init__(self):
self.mod_width = 30
self.datefmt = '%H:%M:%S'
def format(self, record):
s = []
cmodule = record.module + ":" + str(record.lineno)
cmodule = cmodule[-self.mod_width:].ljust(self.mod_width)
format_str = ("%-7s %s %s" % (record.levelname, self.formatTime(record, self.datefmt), cmodule))
pad_len = len(format_str)
for line in record_msg[1:]:
line = " " * pad_len + " : " + line
s.append(line)
s = "%s : %s" % (format_str, "\n".join(s))
return s
my_formatter = MyFormatter()
log.setFormatter(my_formatter)
【讨论】: