【发布时间】:2015-05-13 16:54:53
【问题描述】:
在我的代码中,我从客户端获取了一个记录器,然后我做一些事情并将我的分析记录到记录器中。
我想将自己的前缀添加到记录器,但我不想创建自己的格式化程序,只是将我的前缀添加到现有的。
此外,我想在我的代码完成后删除我的前缀。
通过查看文档,我只能找到创建新格式化程序而不是修改现有格式化程序的方法。有办法吗?
【问题讨论】:
在我的代码中,我从客户端获取了一个记录器,然后我做一些事情并将我的分析记录到记录器中。
我想将自己的前缀添加到记录器,但我不想创建自己的格式化程序,只是将我的前缀添加到现有的。
此外,我想在我的代码完成后删除我的前缀。
通过查看文档,我只能找到创建新格式化程序而不是修改现有格式化程序的方法。有办法吗?
【问题讨论】:
这可以通过logging.LoggerAdapter实现
import logging
class CustomAdapter(logging.LoggerAdapter):
def process(self, msg, kwargs):
return f"[my prefix] {msg}", kwargs
logger = CustomAdapter(logging.getLogger(__name__))
请注意,只有邮件会受到影响。但是这种技术可以用于更复杂的情况
【讨论】:
你是对的。根据Python 3 和Python 2 文档,无法在现有格式化程序对象上重置格式,您需要创建一个新的logging.Formatter 对象。但是,在运行时查看对象有 _fmt 方法来获取现有格式,并且似乎调整它会起作用。我在 2.7 中尝试过,它可以工作。下面是例子。
python 2.7 的示例代码:
import logging
logger = logging.getLogger('something')
myFormatter = logging.Formatter('%(asctime)s - %(message)s')
handler = logging.StreamHandler()
handler.setFormatter(myFormatter)
logger.addHandler(handler)
logger.setLevel(logging.DEBUG)
logger.info("log statement here")
#Tweak the formatter
myFormatter._fmt = "My PREFIX -- " + myFormatter._fmt
logger.info("another log statement here")
输出:
2015-03-11 12:51:36,605 - log statement here
My PREFIX -- 2015-03-11 12:51:36,605 - another log statement here
【讨论】:
其实可以通过'basicConfig'来设置格式,在Python文档中有提到:https://docs.python.org/2/howto/logging-cookbook.html#context-info
logging.basicConfig(level=logging.DEBUG,
format='%(asctime)-15s %(name)-5s %(levelname)-8s IP: %(ip)-15s User: %(user)-8s %(message)s')
【讨论】: