2015-01-15 8 views
1
나는 간단한 로거를 사용하려고했습니다

를 던지고, 비정상적으로 작동하고, 내가 잘못 여기에 무슨 일이 일어나고 있는지 확인할 수 없습니다 : 그것은 실행하면 위의 코드는이 오류가 발생로거 이상한 오류

dlogger = logging.getLogger('Logger') 
dlogger.setLevel(logging.DEBUG) 
handler = logging.handlers.RotatingFileHandler(
    LOG_FILENAME, maxBytes=50000, backupCount=5) 
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s') 
handler.setFormatter(formatter) 
dlogger.addHandler(handler) 

# ... 

dlogger.info('%d successes. %d errors.', counter, error) 

:

Traceback (most recent call last): 
    File "/usr/lib/python2.7/logging/__init__.py", line 851, in emit 
    msg = self.format(record) 
File "/usr/lib/python2.7/logging/__init__.py", line 724, in format 
    return fmt.format(record) 
    File "/usr/lib/python2.7/logging/__init__.py", line 467, in format 
    s = self._fmt % record.__dict__ 
ValueError: unsupported format character '(' (0x28) at index 3 

이 동일한 ValueError와 다른 질문은 내 경우를 설명하지 못합니다. 무슨 일 이니? 나는이 로깅 메시지가있는 스크립트를 실행 한 후

뿐만 아니라이 있지만,이 동작을 표시

8 successes. 0 errors. 
8 successes. 0 errors. 
8 successes. 0 errors. 
2015-01-15 16:30:07,539 - INFO - 8 successes. 0 errors. 

로거 한 번만 트리거 될 수 있지만, 모든 생산, 어떤 이유에서이다 이 메시지들.

추가됨 : 문자열에 메시지를 간단하게 만들었지 만 서식이없는 문자열로도 5,6 개의 반복 행을 사용하여 내 로그를 계속 스팸합니다.

올린 날짜 : 알았어요, 내가 여러 로깅을 설명 할 수 있다고 생각합니다. 디버깅하는 동안 모듈을 다시로드하고 있었는데, 이전 로딩 중 하나를 덮어 썼다 고 생각했지만 계속해서 작동하는 다중 로거를 생성했다고 생각합니다. 다시로드하십시오.

+1

. 로거에 여러 핸들러가 있으면 해당 로거로 기록 된 메시지는 그에 연결된 모든 핸들러에 의해 처리됩니다. –

+0

내가 설명 할 수있는 유일한 방법은 형식 문자열에서'%'와'('사이에 외모가 있거나 보이지 않는 비 ASCII 문자가있는 것입니다. 예외는 인덱스 3을 언급합니다. 그러나 인덱스 1에서.이 질문에서 형식 문자열 *을 복사하여 붙여 넣으면 다시 확인할 수 있습니까? 현재 코드의 행을 완전히 대체 하시겠습니까? –

+0

:'# - * - encoding : '파일 상단에있는 preamble로 소스 코드 인코딩을 선언하십시오. 지금 당장 제거하십시오 - 파이썬이 파일의 비 ASCII 문자에 대해 불평 할 것입니다 –

답변

0

여기 봐 :

formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s') 

비어 :이 라인에서 변수 중 하나가 같은데요 https://docs.python.org/2/library/logging.html#logging.Logger.debug

. 형식 문자열을 %()로 지정하면 오류를 설명 할 수 있습니다.

그 변수를 인쇄 해보십시오

귀하의 (같은 이름을 가진 사람이 이미 존재하는 경우, 그것은 다시 사용됩니다) 여러 로거를 작성하지 않은 재로드하지만 여러 핸들러가 등록 된 것
+1

이들은 모두 내장 된 [LogRecord 속성] (https://docs.python.org/2/library/logging.html#logrecord-attributes)이며 비워 둘 수 없습니다. 그것들은 파이썬의 로깅 시스템 자체에 의해 제공됩니다. –

+0

흠, 괜찮아. 하지만 위에서 사용하는 코드는 [Logging cookbook] (https://docs.python.org/2/howto/logging-cookbook.html#using-file-rotation)에서 곧바로 나온 것입니다. asctime, levelname 및 메시지는 로깅 모듈의 내부 이름 이었기 때문에 levelname과 asctime이 항상 제공되며 "message"를 제공해야했습니다. – rschwieb

+0

@LukasGraf Ah : 알았어요. 그러면 그게 .. – rschwieb