如何更改Python应用引擎中日志消息的默认格式?

16 投票
2 回答
16587 浏览
提问于 2025-04-15 21:06

我想在我的请求处理程序中,默认情况下在日志消息里记录模块和类名。

通常的做法是通过调用 logging.basicConfig 来设置一个自定义的格式字符串,但这个方法只能调用一次,而在我的代码运行时,这个方法已经被调用过了。

还有一种方法是创建一个新的日志 Handler,然后给它传递一个新的日志 Formatter,但我觉得这样不太对,因为我想使用 App Engine 已经安装的现有日志处理器。

那么,在 Python App Engine 中,怎样才能在所有日志消息中添加额外的信息,同时又能使用现有的日志格式和输出方式呢?

2 个回答

6

我发现这个方法在Python 3.6中有效,它会为后续的所有日志记录设置日志级别和格式,即使之前的导入中已经调用过logging

logging_level = logging.INFO
logging_fmt = "%(levelname)s:%(name)s:%(message)s"   # the default
try:
    root_logger = logging.getLogger()
    root_logger.setLevel(logging_level)
    root_handler = root_logger.handlers[0]
    root_handler.setFormatter(logging.Formatter(logging_fmt))
except IndexError:
    logging.basicConfig(level=logging_level, format=logging_fmt)
31

我通过阅读 logging 模块的 __init__.py 文件想出了这个方法。我不知道这样做是否正确,但看起来是有效的:

import logging

logging.basicConfig(level=logging.DEBUG,
                    format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s',
                    datefmt='%m-%d %H:%M',
                    )

logging.info('Danger Will Robinson!')
# 03-31 20:00 root         INFO     Danger Will Robinson!
root = logging.getLogger()
hdlr = root.handlers[0]
fmt = logging.Formatter('%(name)-12s: %(levelname)-8s %(message)s')
hdlr.setFormatter(fmt)
logging.info('Danger Will Robinson!')
# root        : INFO     Danger Will Robinson!

撰写回答