2012-03-27 9 views
6

He escrito un montón de scripts a lo largo del tiempo y estoy en el proceso de refinar los scripts para mantener el código DRY. Actualmente estoy usando algo en este sentido en los diferentes guiones:Python: forma correcta de iniciar sesión en el mismo archivo desde diferentes módulos

if __name__ == '__main__': 
    logger = logging.getLogger('dbinit') 
    hdlr = logging.FileHandler('/var/logs/tmp/foo.log') 
    formatter = logging.Formatter('%(asctime)s %(levelname)s %(message)s') 
    hdlr.setFormatter(formatter) 
    logger.addHandler(hdlr) 
    logger.setLevel(logging.WARNING) 

En lugar de repetir esto en cada guión (es decir, "módulo"), me gustaría tener esta inicialización registrador de hecho uno en alguna parte y se accede por los diversos secuencias de comandos (Hmm, tal vez envolver en una clase singleton?).

Si no puedo hacer eso (es decir, poner el código de inicialización del registrador en un módulo del núcleo), supongo que al utilizar el mismo nombre de archivo de registro en el logging.FileHandler() llamada, los diversos guiones escribirán al mismo archivo.

¿Es correcta esta suposición?

Por último, pero no menos importante, ¿cuál es la mejor forma de práctica (es decir, pitonica) para resolver este problema?

+0

relacionados: [cuestiones de registro de Python desde múltiples módulos] (http://stackoverflow.com/questions/7341538/) –

+0

Relacionado: [Python: módulo de registro - globalmente] (http://stackoverflow.com/questions/7621897/) –

Respuesta

-1

(...) addHandler() will not add a handler if the handler already exist por lo que tener ese código init en muchos lugares no hará daño.

Si no puedo hacer eso (es decir, poner el código de inicialización del registrador en un módulo núcleo)

Puede que esto y que debe hacer esto si usted quiere asegurarse de código de inicialización se ejecuta una vez.

+0

Creo que se está refiriendo a [esta respuesta] (https ://desbordamiento de pila.com/a/6334064/39396) cuando dice "addHandler() no agregará un controlador si el manejador ya existe". Lo que dices es verdadero solo si es el mismo objeto controlador ('hdlr' en esa respuesta). Lo que dices no es verdadero si los manejadores se crean cada vez. (Consulte [esta respuesta] (https://stackoverflow.com/a/31800084/39396) a la misma pregunta). En esta pregunta, donde cada archivo puede crear un nuevo controlador ('logging.FileHandler (...)') tu respuesta es incorrecta. –

1

Dado que está utilizando if __name__ == __main__, supongo que estos scripts se ejecutarán como procesos diferentes. Si ese es el caso, entonces debe usar un archivo de configuración separado.

Esta configuración se puede almacenar en un archivo en el formato especificado en los documentos. Luego, puede usar logging.config.fileConfig para cargar el archivo. También puede tener la configuración almacenada en formatos JSON/YAML, convertirla en un diccionario y cargarla usando logging.config.dictConfig. Este último es el enfoque recomendado actualmente, aunque encuentro que el primero es más directo. Lea this para obtener más información.

Las ventajas de utilizar un enfoque archivo de configuración son muchas veces:

  1. Mantiene los valores de configuración separados de su código
  2. Le permite a los no programadores realizar cambios en la configuración, ya que se almacenan en fácil para leer formatos
  3. También evita que se repita como ya ha mencionado.
0

crear una función en el módulo de Python, como a continuación:

def createLogHandler(job_name,log_file): 
    logger = logging.getLogger(job_name) 
    ## create a file handler ## 
    handler = logging.FileHandler(log_file) 
    ## create a logging format ## 
    formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s') 
    handler.setFormatter(formatter) 
    logger.addHandler(handler) 
    return logger 

Ahora llama a la función de programar la siguiente manera:

job_name = 'dbinit' 
log_file = '/var/logs/tmp/foo.log' 
logger = createLogHandler(job_name ,log_file) 
logger.info('Logger has been created') 
Cuestiones relacionadas