Python 日志格式:如何仅打印记录器名称的最后一部分?

jjm*_*tes 3 python logging python-2.7

我正在使用具有以下格式字符串的 python 日志记录:

'format': '%(asctime)s %(levelname)s %(name)s - %(message)s'
Run Code Online (Sandbox Code Playgroud)

%(name)s部分打印记录器名称:

2017-10-26 13:17:58,019 信息 device_gps.comm。协议- GPSProtocol(port=COM13) - 启动 GPS 串行通信(端口:COM13)
2017-10-26 13:17:58,022 信息 scs_control。上下文- 启动组件:DeviceGPS
2017-10-26 13:17:58,033 信息 scs_elevation。海拔- 初始化 ElevationModel 引擎实例。

与其他日志记录工具(如log4j)一样,为了简洁起见,我只想打印记录器名称的最后一部分(在上面的示例中以粗体显示)。

这个另一个答案建议更改记录器名称,但这样做会破坏父子记录器关系,这对于为一组记录器配置日志记录非常有用。

我怎样才能让 python 日志打印记录器名称的最后一部分?

Vin*_*jip 5

您可以设置过滤器以将LogRecord属性设置为记录器名称的最后一部分,并在格式字符串中使用该属性。例如,运行这个脚本:

import logging

class LastPartFilter(logging.Filter):
    def filter(self, record):
        record.name_last = record.name.rsplit('.', 1)[-1]
        return True

logger = logging.getLogger()
handler = logging.StreamHandler()
formatter = logging.Formatter('%(name_last)s %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)
handler.addFilter(LastPartFilter())

logging.getLogger('foo').warning('Watch out - foo!')
logging.getLogger('foo.bar').warning('Watch out - foo.bar!')
logging.getLogger('foo.bar.baz').warning('Watch out - foo.bar.baz!')
Run Code Online (Sandbox Code Playgroud)

产生这个:

foo 当心 - foo!
酒吧当心 - foo.bar!
baz 当心 - foo.bar.baz!