2012-01-04 11 views
11

Sto configurando la mia registrazione Python da un file (vedere http://www.python.org/doc//current/library/logging.html#configuration-file-format).Registrazione Python: come rappresentare le nuove righe nella stringa di formato in un file di configurazione di registrazione?

Dall'esempio su quella pagina, ho un formattatore nel file di configurazione che assomiglia:

[formatter_form01] 
format=F1 %(asctime)s %(levelname)s %(message)s 
datefmt= 
class=logging.Formatter 

Come faccio a mettere una nuova riga nella stringa "formato" che specifica il formattatore? Né lo \n né lo \\n lavoro (ad esempio format=F1\n%(asctime)s %(levelname)s %(message)s non funziona). Grazie

+5

nuove righe nel logging? Per favore, non farlo. Il file di registro sarà molto difficile da grep. – fabrizioM

+0

@fabrizioM Vero, ma questo è irrilevante per questa domanda. –

risposta

0

La mia scommessa migliore sarebbe utilizzare un formattatore personalizzato (invece di logging.Formatter) ... Per riferimento, ecco il codice sorgente per logging.Formatter.format:

def format(self, record): 
    record.message = record.getMessage() 
    if string.find(self._fmt,"%(asctime)") >= 0: 
     record.asctime = self.formatTime(record, self.datefmt) 
    s = self._fmt % record.__dict__ 
    if record.exc_info: 
     # Cache the traceback text to avoid converting it multiple times 
     # (it's constant anyway) 
     if not record.exc_text: 
      record.exc_text = self.formatException(record.exc_info) 
    if record.exc_text: 
     if s[-1:] != "\n": 
      s = s + "\n" 
     s = s + record.exc_text 
    return s 

E 'abbastanza chiaro per me che, se self._fmt viene letto da un file di testo (riga singola), non sarebbe possibile alcun escapping di alcun tipo. Forse si può estendersi dalla logging.Formatter, ignorare questo metodo e sostituire la linea 4 per qualcosa di simile:

s = self._fmt.replace('\\n', '\n') % record.__dict__ 

o qualcosa di più generale, se volete altre cose da essere sfuggito pure.

MODIFICA: in alternativa, è possibile farlo nel metodo init una volta (invece di ogni volta che viene formattato un messaggio). Ma come già sottolineato da altri, ConfigParser supporta più righe, quindi non c'è bisogno di seguire questa strada ...

7

Il modulo logging.config legge i file di configurazione con ConfigParser, che supporta i valori multilinea.

, è possibile specificare la stringa format in questo modo:

[formatter_form01] 
format=F1 
    %(asctime)s %(levelname)s %(message)s 
datefmt= 
class=logging.Formatter 

valori multilinee sono continuato dalle rientro le seguenti linee (uno o più spazi o tabulazioni contano come un trattino).

5

Il file di configurazione della registrazione si basa sul modulo ConfigParser. Ci troverete si può risolvere in questo modo:

[formatter_form01] 
format=F1 
    %(asctime)s %(levelname)s %(message)s 
datefmt= 
class=logging.Formatter 
0

Questo potrebbe essere un modo semplice:

import logging 
logformat = """%(asctime)s ... here you get a new line 
    ... %(thread)d .... here you get another new line 
    %(message)s""" 
logging.basicConfig(format=logformat, level=logging.DEBUG) 

ho provato, l'impostazione di cui sopra dà due nuove linee per ogni messaggio di registrazione, in quanto mostrato nei codici. Nota: %(asctime)s e cose come questa sono le stringhe di formattazione della registrazione Python.

0
import logging 
logformat = "%(asctime)s %(message)s\n\r" 
logging.basicConfig(level=logging.DEBUG, format=logformat,filename='debug.log', filemode='w')   
logging.debug (Your String here) 

Il testo di debug nel file verrà scritto con una nuova riga.

Problemi correlati