【问题标题】:Can you shorten logging headers when using python logging `%(funcName)s`?使用 python 日志记录 `%(funcName)s` 时可以缩短日志记录头吗?
【发布时间】:2017-01-31 08:02:52
【问题描述】:

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

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

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

【问题讨论】:

  • 你能发布一些你想要改进的代码吗?

标签: python logging instrumentation


【解决方案1】:

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

【讨论】:

  • props 用于优雅的解决方案(我没想过使用字符串格式的“.”...我只在进行浮点 %f 字符串格式化时使用过该字符串格式功能) .一个补充:如果您将%.10s 更改为%10.10s,那么当函数太短时(使您的日志标头长度恒定),您会得到一个常量大小 10。
  • @TrevorBoydSmith 这很容易知道。您是否能够找到一些关于您可以使用%s 完成的全部内容的体面文档?我真的很想链接到一些文档,但我发现的页面只提到%s 在对象上调用str(),而没有太多关于修饰符的内容。
  • 我相信the official python docs you are looking for are here。 (如果您知道 c 风格的 printf,那么通常同样适用,但 C 是一种不同的语言,因此语法可能不完全相同(比较语法是另一次讨论)。)
【解决方案2】:

您可以扩展 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-12
    • 1970-01-01
    • 1970-01-01
    • 2020-11-07
    • 2013-10-22
    • 1970-01-01
    相关资源
    最近更新 更多