Python日志记录模块中字段组合的固定长度格式

时间:2018-03-14 10:43:02

标签: python python-3.x python-2.7 logging flask

我在我的应用程序中使用Python日志记录模块。这是我目前的格式。

LOGGER_FORMAT = '%(asctime)s %(levelname)-5s [%(threadName)-10s] %(name)s.%(module)s.%(funcName)s : %(message)s'
logging.basicConfig(level=logging.INFO, format=LOGGER_FORMAT)

示例输出:

2018-03-14 11:35:27,257 INFO  [Thread-2  ] my_app.util.get_login_info : Log line 1
2018-03-14 11:35:27,257 INFO  [Thread-2  ] my_app.cache.call : Log line 2
2018-03-14 11:35:27,257 INFO  [Thread-2  ] my_app.web.parse_response : Log line 3

我正在寻找的是我从固定位置显示消息而不是改变起点。

我可以为每个单独的属性配置固定长度,但我想为整个name.module.funcName部分配置固定长度,以便我的输出如下所示:

2018-03-14 11:35:27,257 INFO  [Thread-2  ] my_app.util.get_login_info : Log line 1
2018-03-14 11:35:27,257 INFO  [Thread-2  ] my_app.cache.call          : Log line 2
2018-03-14 11:35:27,257 INFO  [Thread-2  ] my_app.web.parse_response  : Log line 3

是否可以,我该如何配置?

1 个答案:

答案 0 :(得分:0)

您最好的选择是使用logging.Filter,例如:

class MyFilter(logging.Filter):
    def filter(self, record):
        record.expandedFuncName = '%s.%s.%s' % (record.name, record.module, record.funcName)
        return True

然后使用类似

的格式字符串
%(asctime)s %(levelname)-5s [%(threadName)-10s] %(expandedFuncName)-20.20s : %(message)s

您需要确保将此过滤器的实例应用于在格式字符串中使用格式化程序expandedFuncName的每个处理程序。您无法使用basicConfig执行此操作,因此我建议您使用dictConfig日志记录配置API。

请注意,如果您使用日志文档中建议的约定logger = logging.getLogger(__name__),则记录器名称通常会包含模块名称,但这不适用于__main__模块的情况。