2012-10-09 4 views
1

저는 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