提供跨模块的上下文信息,而无需在记录器中传递参数

时间:2018-08-09 13:51:06

标签: python logging flask

我正在通过python Web flask应用程序实现日志记录。下面是一个示例结构

controller-com.org.python.MainController

的路由说/ login,/ doSomething,/ logout

每条路由都在单独的模块中调用单独的方法,

com.org.python.login.begin()
com.org.python.dosomething.execute()
com.org.python.logout.end()

我的主控制器路由有权访问已调用事务的用户ID和生成的唯一事务ID。我可以使用记录器轻松记录此信息。

用例:我还需要在较低级别的模块中记录用户ID和事务ID,而无需将详细信息作为参数传递

我怎么能做到相同?

到目前为止的解决方案

 class CustomFilter(logger.Filter):


    def __init__(self, username, trid):
         self.username = username
         self.trid = trid

    def filter(record):
        record.username = self.username
        record.trid = self.trid

我已按照上述说明将过滤器添加到记录器

maincontroller.py

def login(username):

    trid = ....
    log = logger.getLogger("something")
    log.addFilter(CustomFilter(username, trid))
    #handlers, formatters added as used
    log.info("inside login method")
    #import login module
    login.begin()

login.py

def begin():
    log = logger.getLogger("something")
    log.info("im inside begin method in login module")
    ### something something

上面的方法很好,即使在模块之间,用户名和Trid也可以打印在任何地方。 但是,到处都使用相同的Trid和用户名。甚至不是同一用户发起的交易。我们需要清除过滤器吗?如何在所需的用户名和差异试算中实现差异交易

P.S:出于某种原因,loggerAdaptors无法正常工作。适配器中的信息不会在模块调用之间转移

请帮助。

0 个答案:

没有答案