Agregar parámetro de codificación a logging.basicConfig

¿Cómo agrego un encoding parámetro para logging.basicConfig?

He encontrado este informe de error que establece que esto ahora es posible para Python 3.3. Necesito esto para Python 2.7 y el informe de error dice que use un personalizado logging.FileHandler objeto, pero no puedo hacer que funcione.

preguntado el 22 de mayo de 12 a las 17:05

3 Respuestas

Será más fácil evitar el uso basicConfig() en su caso, simplemente cree el controlador y agréguelo mediante programación (asegurándose de que el código se ejecute solo una vez), por ejemplo:

root_logger= logging.getLogger()
root_logger.setLevel(logging.DEBUG) # or whatever
handler = logging.FileHandler('test.log', 'w', 'utf-8') # or whatever
handler.setFormatter(logging.Formatter('%(name)s %(message)s')) # or whatever
root_logger.addHandler(handler)

eso es mas o menos lo que basicConfig() hace.

Actualizar: En Python 3.9 y versiones posteriores, basicConfig() tiene encoding y errors parámetros de palabras clave disponibles.

Respondido el 14 de enero de 22 a las 15:01

No seria handler.setFormatter(logging.Formatter('%(name)s %(message)s')) ? - joaocarvalho

Puede pasar una lista de controladores de archivos específicos:

import logging

logging.basicConfig(handlers=[logging.FileHandler(filename="./log_records.txt", 
                                                 encoding='utf-8', mode='a+')],
                    format="%(asctime)s %(name)s:%(levelname)s:%(message)s", 
                    datefmt="%F %A %T", 
                    level=logging.INFO)

y funciona bastante bien (versión de Python == Python 3.6.8 :: Anaconda, Inc.)

contestado el 21 de mayo de 20 a las 03:05

La respuesta de Vinay fue muy útil, pero para que funcionara tuve que modificar la sintaxis:

root_logger= logging.getLogger()
root_logger.setLevel(logging.DEBUG) # or whatever
handler = logging.FileHandler('test.log', 'w', 'utf-8') # or whatever
formatter = logging.Formatter('%(name)s %(message)s') # or whatever
handler.setFormatter(formatter) # Pass handler as a parameter, not assign
root_logger.addHandler(handler)

contestado el 16 de mayo de 15 a las 13:05

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.