2012-11-19 2 views
4

logging 모듈을 사용하여 내 응용 프로그램에 메시지를 기록합니다.추적 오류를 추적하는 방법은 무엇입니까?

Traceback (most recent call last): 
    File "/usr/lib64/python2.6/logging/__init__.py", line 776, in emit 
    msg = self.format(record) 
    File "/usr/lib64/python2.6/logging/__init__.py", line 654, in format 
    return fmt.format(record) 
    File "/usr/lib64/python2.6/logging/__init__.py", line 436, in format 
    record.message = record.getMessage() 
    File "/usr/lib64/python2.6/logging/__init__.py", line 306, in getMessage 
    msg = msg % self.args 
TypeError: %d format: a number is required, not str 
: 결과는 아래와 비슷한 오류가

import logging 
my_log = logging.getLogger("MyLog") 
# this is obviously wrong 
my_log.info('%d', "abc") 

:

종종 나는 형식 문자열 또는 매개 변수에 무슨 문제가 예를 들어, 오류가 발생 상황에 와서

그러나 추적 모듈은 로깅 모듈에 표시됩니다. 그것은 내 코드 내에서 오류가 발생한 곳을 말해주지 않습니다.

해결할 방법이 있습니까?

+1

http://stackoverflow.com/questions/6898674/getting-a-more-useful-logging-module-error-output-in-python은 당신과 비슷한 문제가있는 사람처럼 보입니다. 더 나은 스택 추적을 추가하는 로깅 처리기를 하위 클래스로 분류하는 코드가있는 답변이 있습니다 (어디에서 호출했는지 포함). – bouteillebleu

+0

오류를 재현하지 못했지만 추적 한계를 더 높은 값으로 설정하면 도움이됩니다. 'import sys; sys.traceback_limit = 10'입니다. –

답변

3

오류의 원인을 찾는 데 동일한 문제가 발생했습니다. 로깅 모듈은 이러한 예외를 처리하고 프로그램을 중지하지 않습니다. 이는 로그 모듈에 대해 허용 가능한 동작입니다. 그러나 예외를 억제하고 처리하는 동안 충분한 정보를 제공하지 않습니다.

나는 발견하고 지금 두꺼운 설명 here

트릭 문자열은 예외 처리 절 호출을 래핑 기능 logging.LogRecord.getMessage 서식 않는 아주 기본적인 로깅 기능을 대체하는 것입니다 사용.
로거를 사용하기 전에이 교체 작업을 수행했는지 확인하십시오. 이 대체 코드는 프로그램의 다른 모듈에서도 작동합니다.

그러면 예제가 다음과 같이 수정됩니다. 예외가 생성되도록 코드를 약간 수정했습니다.

def print_log_record_on_error(func): 
    def wrap(self, *args, **kwargs): 
     try: 
      return func(self, *args, **kwargs) 
     except: 
      import sys 
      print >>sys.stderr, "Unable to create log message msg=%r, args=%r " % (
       getattr(self, 'msg', '?'), getattr(self, 'args', '?')) 
      raise 
    return wrap 
import logging 
logging.LogRecord.getMessage = print_log_record_on_error(logging.LogRecord.getMessage) 

logging.basicConfig() 
my_log = logging.getLogger("MyLog") 
# this is obviously wrong 
my_log.error('%d' , "abc") 

그리고 지금 더 유용 예외를 생성합니다 : 당신이 많이 사용하는 응용 프로그램 로그가있는 경우

Unable to create log message msg='%d', args=('abc',) 
Traceback (most recent call last): 
    File "C:\Progs\Python262\Lib\logging\__init__.py", line 760, in emit 
    msg = self.format(record) 
    File "C:\Progs\Python262\Lib\logging\__init__.py", line 644, in format 
    return fmt.format(record) 
    File "C:\Progs\Python262\Lib\logging\__init__.py", line 432, in format 
    record.message = record.getMessage() 
    File "C:/Users/vvlad/PycharmProjects/stackoverflow/test1.py", line 6, in wrap 
    return func(self, *args, **kwargs) 
    File "C:\Progs\Python262\Lib\logging\__init__.py", line 302, in getMessage 
    msg = msg % self.args 
TypeError: %d format: a number is required, not str 

나는 loggin에 기능을 교체하거나하지 않도록 옵션을 추가하는 것이 좋습니다 것입니다. 따라서 oin 디버그 모드 코드는 오버로드 된 함수를 사용할 것입니다.하지만 프로덕션에서는 하나의 예외 처리에 대한 성능 저하를 피할 수 없습니다.

관련 문제