2012-10-09 29 views
1

我对Python相当陌生。我一直在修改我们现有的Python模块以改进日志记录。我遇到了一个需要标记每个方法调用(和退出)与一个特定的键(上下文)需要记录和进入和退出点。该密钥应该在根方法生成并传递给进一步的方法调用。带上下文的Python日志记录 - 传递密钥

我很困惑我应该遵循的方法。有没有办法在现有的方法接口中动态插入额外的参数可能会使用AOP或注释?

或者我改写这个问题短期 -

如何传递一个额外的参数传递给后续的方法调用?

感谢 Panks

回答

0

如果您对所有这些方法的一个记录器实例,也许你可以有根法设定的范围内对条目记录并删除它退出。

@contextlib.contextmanager 
def setup_login(logger, context): 
    old_name = logger.name 
    logger.name = context 
    yield 
    logger.name = old_name 

和根方法变为:

def root(): 
    context = compute_context() 
    with setup_login(logger, context): 
     # call other methods 

我用logger.name,但你可以使用记录仪的任何其他属性,或使用任何其他单身共享全局状态。

+0

谢谢Madjar。我有一个记录器,但每次一个方法被不同的线程调用时,它应该创建一个新的上下文。所以我认为我不能依靠记录器属性。如果我可以在运行时重载选定的方法并添加额外的参数,我可以在记录器格式化程序中定义我的上下文关键字并记录上下文关键字。只是一个想法。 – Panks

+0

的确,这在多线程环境中不起作用,除非使用线程本地全局变量(glocals)。添加额外参数的问题是我想不到一种简单的方法将它添加到方法的调用中,而无需修改调用方法的代码。另一种方式(但越来越多的黑客攻击)将是使用'inspect'并上传堆栈直到找到上下文关键字。 – madjar