2014-02-12 1 views
1

내가있는 메시지 로그 형식을 로깅 모듈을 구성했습니다다중 행 출력용 포맷터를 사용하기 위해 파이썬의 로깅 모듈을 구성하는 방법은 무엇입니까?

2014-02-12 14:16:20,454 [ERROR] (app:pid=1930) main(105): Catchall exception at top level. 
Traceback (most recent call last): 
    File "build/bdist.linux-x86_64/egg/argh/dispatching.py", line 228, in dispatch_command 
    dispatch(parser, *args, **kwargs) 
    File "build/bdist.linux-x86_64/egg/argh/dispatching.py", line 124, in dispatch 
    for line in lines: 
    File "build/bdist.linux-x86_64/egg/argh/dispatching.py", line 200, in _execute_command 
    for line in result: 
    ..., 
NameError: global name 'sftp' is not defined 

그것은 각을 실행하는 것이 가능하다 : 예외를 인쇄 그러나

... 
    'formatters': { 
     'verbose': { 
      'format': '%(asctime)s [%(levelname)s] ' 
         '(%(name)s:pid=%(process)d) %(module)s(%(lineno)d): ' 
         '%(message)s' 
     }, 
    }, 
... 

를, 그것은처럼 보여 포맷터를 통해 라인? 예 : 그래서 같은 출력 뭔가 것 :

2014-02-12 14:16:20,454 [ERROR] (app:pid=1930) main(105): Catchall exception at top level. 
2014-02-12 14:16:20,454 [ERROR] (app:pid=1930) main(105): Traceback (most recent call last): 
2014-02-12 14:16:20,454 [ERROR] (app:pid=1930) main(105): File "build/bdist.linux-x86_64/egg/argh/dispatching.py", line 228, in dispatch_command 
2014-02-12 14:16:20,454 [ERROR] (app:pid=1930) main(105):  dispatch(parser, *args, **kwargs) 
2014-02-12 14:16:20,454 [ERROR] (app:pid=1930) main(105): File "build/bdist.linux-x86_64/egg/argh/dispatching.py", line 124, in dispatch 
2014-02-12 14:16:20,454 [ERROR] (app:pid=1930) main(105):  for line in lines: 
2014-02-12 14:16:20,454 [ERROR] (app:pid=1930) main(105): File "build/bdist.linux-x86_64/egg/argh/dispatching.py", line 200, in _execute_command 
2014-02-12 14:16:20,454 [ERROR] (app:pid=1930) main(105):  for line in result: 
2014-02-12 14:16:20,454 [ERROR] (app:pid=1930) main(105): ..., 
2014-02-12 14:16:20,454 [ERROR] (app:pid=1930) main(105): NameError: global name 'sftp' is not defined 
+1

종류 및 로거를 사용하여 각 행을 기록하십시오. 그러나 이것은 일반적인 관행이 아닙니다. – Rishi

답변

0

. traceback.format_exec을 사용하여 스택 추적을 문자열로 얻은 다음 줄을 분할하고 각 줄을 개별적으로 기록하십시오.

import logging 
import traceback 

logger = logging.Logger(__name__) # or whatever namespace you so please 
# do any other Logger configuration you want 

try: 
    do_some_stuff() 
except Exception as e: 
    for line in traceback.format_exec().split('\n'): 
     logger.error(line) 

그러나 이는 일반적인 관행은 아닙니다. Logger.exception()을 사용하는 경우 예외를 기록 할 수 있습니다. 하나의 로깅 라인에 있지만, Logger이 쓰는 파일과 같은 객체에 여러 행으로 작성됩니다.

(이자의이 logging.Formatter 클래스의 방법, formatException이 기본 구현을위한 traceback.print_exception를 사용한다는 사실이다.) ... 당신은 예외 문자열을 캡처 새로운 라인에 분할해야의

+0

현재 logger.exception()을 사용하고 있는데 문제가 있습니다 - 형식이 지정되지 않은 여러 줄. – jbrown

+0

@jbrown 그래서 이것을 어떻게 할 수 있었는지 말했지만 오류 로그는 항상 사람이 읽을 수있는 것은 아님을 알아야합니다. 일반적으로 각 로깅 메시지에는 일종의 이벤트가 발생한 시간을 나타내는 타임 스탬프가 포함되어 있습니다. 네가이 일을 할 때, 너는이 사건 하나를 여러 사건으로 분리하고있다. 내가 말하는 것을 얻을 수 있니? – 2rs2ts

+0

알겠습니다. 감사 – jbrown

-3

나는 당신이

import json 

a = {"a": 1, "b": 2} 

print json.dumps(a, indent=4) 

출력 JSON 모듈을 사용할 수 있다고 생각 : 당신은 구성하지 않고이 작업을 수행 할 수 있습니다

{ 
    "a": 1, 
    "b": 2 
} 
+1

로깅 모듈을 사용하고 있지 않습니다. – 2rs2ts

+0

네,하지만 로깅 할 때 그런 옵션이 없다는 것을 기억하십시오. –

+1

사실 OP가 원하는 모든 것을 수행하지 못하기 때문에 라인별로 예외가 기록되기를 원합니다. JSON이 실제로'Logger'를 위해'Formatter'를 구성하는 YAML이었습니다. – 2rs2ts

관련 문제