2015-01-27 3 views
5

Журналы, которые я создаю в Python, предназначены для временного хранения в виде файлов, которые, в свою очередь, будут обрабатываться в базе данных журнала. Они берут формат, обозначенный трубкой, чтобы определять, как будут обрабатываться журналы, но logging.exception() нарушает мой стандарт, добавляя слишком много полей и слишком много новых строк.Как я могу форматировать стеки стека исключения в протоколе Python?

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 

Как лучше ручки или формат tracebacks с пробелами и символами новой строки? Эти сообщения являются неотъемлемой частью в logging.exception(), но мне кажется странным обойти эту функцию, когда я пытаюсь документировать экземпляры исключений. Как записывать мои трассировки и форматировать их тоже? Следует ли игнорировать трассировки?

Благодарим вас за внимание!

+0

Вы спрашиваете, что вы должны делать или как это сделать? Как вы хотите отформатировать сообщения об ошибках в файле журнала, зависит от вас. Что вы хотите, чтобы они выглядели? – BrenBarn

+0

Спасибо, что поняли. В идеале я мог бы содержать трассировки в качестве другого атрибута, разделенного на триггер, в той же строке, что и остальная часть зарегистрированного сообщения. – twoxmachine

ответ

5

Вы можете определить свои собственные Formatter методы которого вы можете переопределить для информации исключений формат, как именно вы хотите. Вот упрощенным (но работает) пример:

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)) 

Это производит только две линии:

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'| 

Конечно, вы можете построить на этом примере, чтобы делать именно то, что вы хотите, например, через модуль traceback.

0

Вы должны определить свою собственную функцию, которая использует traceback.extract_tb для форматирования отслеживающего синтаксису вы хотите, и затем вернуть его или записать его в файл:

traceback.extract_tb(traceback[, limit]) 

Возвращает список до предела «пре- обработанных "записей трассировки стека, извлеченных из трассировки объекта трассировки. Он полезен для альтернативного форматирования трасс стека. Если ограничение опущено или None, все записи извлекаются. «Предварительно обработанная» запись трассировки стека представляет собой 4-кортеж (имя файла, номер строки, имя функции, текст), представляющий информацию, которая обычно печатается для трассировки стека. Текст представляет собой строку с разделенным пробелом и пробелом; если источник недоступен, это None.

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

Смежные вопросы