2012-01-04 15 views
11

Estoy configurando mi registro de Python desde un archivo (vea http://www.python.org/doc//current/library/logging.html#configuration-file-format).Registro de Python: ¿cómo representar nuevas líneas en la cadena de formato en un archivo de configuración de registro?

A partir del ejemplo de esa página, tengo un formateador en el archivo de configuración que se parece a:

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

¿Cómo puedo poner una nueva línea en la cadena "formato" que especifica el formateador? Ni el trabajo \n ni \\n (por ejemplo, format=F1\n%(asctime)s %(levelname)s %(message)s no funciona). Gracias

+5

nuevas líneas en el registro? Por favor no lo hagas El archivo de registro será muy difícil de grep. – fabrizioM

+0

@fabrizioM Cierto, pero eso es irrelevante para esta pregunta. –

Respuesta

0

Mi mejor opción sería utilizar un formateador personalizado (en lugar de logging.Formatter) ... Como referencia, aquí está el código fuente de 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 

Es bastante claro para mí que, si self._fmt se lee de un archivo de texto (una sola línea), no sería posible escaparse de ningún tipo. Tal vez se puede extender desde logging.Formatter, reemplazar este método y sustituir la cuarta línea para algo como:

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

o algo más general, si quieres otras cosas que se escaparon también.

EDITAR: alternativamente, puede hacerlo en el método init, una vez (en lugar de cada vez que se formatea un mensaje). Pero como otros ya lo señalaron, ConfigParser es compatible con varias líneas, por lo que no es necesario ir por esta ruta ...

7

El módulo logging.config lee los archivos de configuración con ConfigParser, que admite valores de líneas múltiples.

para que pueda especificar la cadena de format así:

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

valores de líneas múltiples se continúan por corrugado las siguientes líneas (uno o más espacios o tabuladores cuentan como un guión).

5

El archivo de configuración de registro se basa en el módulo ConfigParser. Allí encontrará se puede resolver de esta manera:

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

Esto podría ser una manera fácil:

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) 

probé, el ajuste anterior da dos nuevas líneas para cada registro de mensajes, ya que mostrado en los códigos. Nota: %(asctime)s y cosas como esta son cadenas de formato de registro de 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) 

El texto de depuración en el archivo se escribirá con una nueva línea.

Cuestiones relacionadas