我可以让python的logging.getLogger返回一个LoggerAdapter吗?

时间:2016-03-13 18:41:46

标签: python logging

python中的LoggerAdapter类用于为记录的消息提供上下文信息。在对其进行子类化之后,可以使用子类代替记录器,子类可以拦截并修改/扩充记录的消息。

是否可以让logging.getLogger(name)返回自定义LoggerAdapter类而不是通用记录器?如果LoggerAdapter类必须在它所使用的每个单独的文件中单独实例化,似乎它是无用的,并且它似乎不应该导入它,因为{{1}模块似乎让你使用它的方法来访问各地的记录器。

1 个答案:

答案 0 :(得分:0)

我认为不可能让logging.getLogger(name)返回自定义LoggerAdapter类。实现logging.getLogger以返回通用记录器。
确实LoggerAdapter在您描述的场景中没用。

虽然每个单独的文件都会调用logging.getLogger(name)来获取记录器,但您仍然有机会向消息提供上下文信息。

试试这个:

import logging
class ContextFilter(logging.Filter):
    def filter(self, record):
        # suppose one of your contextual info is ip
        record.ip = custom_function_to_set_ip()
        return True

# this will be the parent logger of individual file logger
logger = logging.getLogger()
fh = logging.FileHandler('test.log')
fh.addFilter(ContextFilter())
logger.addHandler(fh)

由于fh安装在单个文件记录器的父节点上,因此由单个文件记录器创建的日志消息将由fh处理。在处理程序流程中, 消息可以通过过滤器进一步处理。

请参阅https://docs.python.org/2/howto/logging.html#logging-flow