2015-01-27 9 views
5

I registri che sto creando in Python sono destinati ad essere temporaneamente memorizzati come file che, a loro volta, verranno elaborati in un database di log. Prendono un formato delimitato da pipe per dettare come verranno elaborati i log, ma logging.exception() sta infrangendo il mio standard aggiungendo troppi campi e troppe newline.Come posso formattare gli stacktracks delle eccezioni nella registrazione 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 

Come è il modo migliore maniglia o formato traceback con lo spazio bianco e ritorni a capo? Questi messaggi sono parte integrante di logging.exception(), ma sembra strano aggirare la funzione quando sto tentando di documentare le istanze di eccezioni. Come posso registrare i miei traceback e formattarli anch'essi? I traceback dovrebbero essere ignorati?

Grazie per il vostro tempo!

+0

Stai chiedendo cosa dovresti fare, o come farlo? Come si desidera formattare i messaggi di errore nel file di registro dipende da voi. Cosa vuoi * tu * vuoi che assomigli? – BrenBarn

+0

Grazie per averlo chiarito. Idealmente, potrei contenere i traceback come un altro attributo delimitato da pipe sulla stessa riga del resto del messaggio registrato. – twoxmachine

risposta

5

È possibile definire il proprio Formatter i cui metodi è possibile ignorare le informazioni eccezione formato esattamente come si desidera. Ecco una semplice (ma di lavoro) Esempio:

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

questo produce solo due linee:

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

Naturalmente, si può costruire su questo esempio per fare esattamente ciò che si vuole, ad esempio, tramite il modulo traceback.

0

Si dovrebbe definire una funzione che utilizza traceback.extract_tb per formattare il traceback alla sintassi che si desidera e poi restituirlo o scrivere in un file:

traceback.extract_tb(traceback[, limit]) 

restituire un elenco di fino a limitare “pre- elaborate "voci di traccia di stack estratte dal traceback dell'oggetto traceback. È utile per la formattazione alternativa delle tracce dello stack. Se il limite è omesso o Nessuno, vengono estratte tutte le voci. Una voce di traccia stack "preelaborata" è una tupla di 4 elementi (nome file, numero di riga, nome funzione, testo) che rappresenta l'informazione che viene solitamente stampata per una traccia stack. Il testo è una stringa con spaziatura iniziale e finale spogliata; se la fonte non è disponibile è None.

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

Problemi correlati