在使用 python 日志记录 `%(funcName)s` 时,您可以缩短日志记录 headers 吗?

Can you shorten logging headers when using python logging `%(funcName)s`?

有时我使用 %(funcName)s 配置 python 日志格式器。但是当函数名很长时我不喜欢这样。

在使用 python 日志记录 %(funcName)s 时,可以缩短日志记录 headers 吗?如果是,如何?

你能说...限制字符总数为 10 个字符吗?

您可以扩展 logging.formatter class 以获得所需的格式,如下所示。

这只是一个例子。你应该根据你的要求修改它

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)

日志格式字符串中的 %(...)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