使用 python logging 将记录器名称缩写或缩短为首字母

abbreviate or shorten the logger name to initials with python logging

我正在尝试实现 log4j 中可用的行为,this SO Q&A

中对此进行了描述

而不是记录器产生以下输出(注意完整的模块名称)

DEBUG    aproject.bpackage.cclass:filename.py:79 log message 1

我只想记录器的首字母 name:

DEBUG    a.b.c:filename.py:79 log message 1

试图用 the manual 找出正确的格式字符串,但没有提到记录器的首字母 name

请注意,记录器使用模块名称作为约定进行初始化:
logger = logging.getLogger(__name__)

没有 out-of-the-box 功能,但您可以使用类似这样的方法获得所需的结果:

import logging

class CustomFormatter(logging.Formatter):
    def format(self, record):
        saved_name = record.name  # save and restore for other formatters if desired
        parts = saved_name.split('.')
        # import pdb; pdb.set_trace()
        record.name = '.'.join(p[0] for p in parts)
        result = super().format(record)
        record.name = saved_name
        return result

h = logging.StreamHandler()
f = CustomFormatter('%(name)-6s %(message)s')
h.setFormatter(f)
root = logging.getLogger()
root.addHandler(h)
root.setLevel(logging.DEBUG)
logging.getLogger('alpha.beta.gamma').debug('foo')
logging.getLogger('delta.epsilon.zeta').debug('bar')
logging.getLogger('eta.theta').debug('baz')

当运行时,上面的脚本输出

a.b.g  foo
d.e.z  bar
e.t    baz