python中的LoggerAdapter
类用于为记录的消息提供上下文信息。在对其进行子类化之后,可以使用子类代替记录器,子类可以拦截并修改/扩充记录的消息。
是否可以让logging.getLogger(name)
返回自定义LoggerAdapter类而不是通用记录器?如果LoggerAdapter
类必须在它所使用的每个单独的文件中单独实例化,似乎它是无用的,并且它似乎不应该导入它,因为{{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