2015-01-27 3 views
5

파이썬에서 작성중인 로그는 일시적으로 파일로 저장되어 로그 데이터베이스로 처리됩니다. 그들은 로그를 처리하는 방법을 지시하기 위해 파이프로 구분 된 형식을 취하지 만 logging.exception()은 너무 많은 필드와 너무 많은 개행을 추가하여 표준을 위반하고 있습니다.파이썬 로깅에서 예외 스택 트레이를 포맷 할 수 있습니까?

import logging 
logging.basicConfig(filename='output.txt', 
        format='%(asctime)s|%(levelname)s|%(message)s|', 
        datefmt='%m/%d/%Y %I:%M:%S %p', 
        level=logging.DEBUG) 
logging.info('Sample message') 

try: 
    x = 1/0 
except ZeroDivisionError as e: 
    logging.exception('ZeroDivisionError: {0}'.format(e)) 

# output.txt 
01/27/2015 02:09:01 PM|INFO|Sample message| 
01/27/2015 02:09:01 PM|ERROR|ZeroDivisionError: integer division or modulo by zero| 
Traceback (most recent call last): 
    File "C:\Users\matr06586\Desktop\ETLstage\Python\blahblah.py", line 90, in <module> 
    x = 1/0 
ZeroDivisionError: integer division or modulo by zero 

어떻게 공백과 줄 바꿈과 함께 할 수있는 내가 가장 핸들 또는 형식 역 추적?이 메시지는 logging.exception()의 일부이며 소포이지만 예외 인스턴스를 문서화하려고 시도 할 때 기능을 우회하는 것이 이상하게 느껴집니다. 내 추적 기록을 기록하고 포맷하는 방법은 무엇입니까? 추적을 무시해야합니까?

감사합니다.

traceback.extract_tb(traceback[, limit]) 

돌아 한계까지의 목록 "사전 :

+0

수행해야 할 작업 또는 수행 방법을 묻는 중입니까? 로그 파일에 오류 메시지의 형식을 지정하는 방법은 사용자가 결정합니다. 당신이 * 그 (것)들을 어떻게 보이게하고 싶습니까? – BrenBarn

+0

삭제 해 주셔서 감사합니다. 이상적으로는 추적 된 메시지의 나머지 부분과 동일한 줄에 다른 파이프 구분 된 특성으로 추적을 포함 할 수 있습니다. – twoxmachine

답변

5

사용자가 정의 할 수 있습니다 그 방법 당신은 당신이 원하는 방법을 정확하게 형식의 예외 정보를 덮어 쓸 수 있습니다 자신의 Formatter. 당신은 당신이 원하는 것을 정확하게 수행이 예에 예를 구축 할 수 있습니다, 물론

01/28/2015 07:28:27 AM|INFO|Sample message| 
01/28/2015 07:28:27 AM|ERROR|ZeroDivisionError: integer division or modulo by zero|'Traceback (most recent call last):\n File "logtest2.py", line 23, in <module>\n x = 1/0\nZeroDivisionError: integer division or modulo by zero'| 

:

import logging 

class OneLineExceptionFormatter(logging.Formatter): 
    def formatException(self, exc_info): 
     result = super(OneLineExceptionFormatter, self).formatException(exc_info) 
     return repr(result) # or format into one line however you want to 

    def format(self, record): 
     s = super(OneLineExceptionFormatter, self).format(record) 
     if record.exc_text: 
      s = s.replace('\n', '') + '|' 
     return s 

fh = logging.FileHandler('output.txt', 'w') 
f = OneLineExceptionFormatter('%(asctime)s|%(levelname)s|%(message)s|', '%m/%d/%Y %I:%M:%S %p') 
fh.setFormatter(f) 
root = logging.getLogger() 
root.setLevel(logging.DEBUG) 
root.addHandler(fh) 
logging.info('Sample message') 

try: 
    x = 1/0 
except ZeroDivisionError as e: 
    logging.exception('ZeroDivisionError: {0}'.format(e)) 

이 두 라인을 생산 : 여기에 간단한 (하지만 작업) 예입니다 traceback 모듈을 통해

0

당신은 당신이 원하는 구문 역 추적을 포맷하고 다음을 반환하거나 파일에 기록 traceback.extract_tb를 사용하여 자신의 함수를 정의한다 처리 된 "스택 추적 항목을 추적합니다. 스택 추적의 대체 서식을에 유용합니다. limit가 생략되거나 None이면 모든 항목이 추출됩니다. "사전 처리 된"스택 추적 항목은 일반적으로 스택 추적을 위해 인쇄되는 정보를 나타내는 4- 튜플 (파일 이름, 행 번호, 함수 이름, 텍스트)입니다. 텍스트는 선행 및 후행 공백이 제거 된 문자열입니다. 소스를 사용할 수없는 경우 None입니다.

https://docs.python.org/2/library/traceback.html