2011-04-11 5 views
5

Editar: Terminé respondiendo el problema de mi pregunta para poder tener un módulo de registro de trabajo. Sin embargo, todavía tengo una pregunta relacionada. Ver mi respuesta a continuación.Manejadores de registro: ¿Cómo me aseguro de no estar haciendo dos?

Estoy tratando de implementar el registro iniciando sesión siempre en el directorio temporal de cualquier sistema operativo en el que esté. Para hacerlo, he escrito la siguiente función.

import logging, tempfile, os, sys 

def getlog(logname, filename = 'python.log', directory = None): 
    '''returns a logger with logname that will print to filename and directoryname.''' 
    if directory == None: 
     fd, fname = tempfile.mkstemp() 
     directory = os.path.dirname(fname) 

    fullpath = directory + '/' + filename 

    mylog = logging.getLogger(logname) 
    hdlr = logging.FileHandler(fullpath) 

    formatter = logging.Formatter('L:%(name)s M:%(module)s T:%(asctime)s > %(levelname)s: %(message)s') 
    hdlr.setFormatter(formatter) 
    mylog.addHandler(hdlr) 
    mylog.setLevel(logging.INFO) 
    mylog.info('NEW LOGGER STARTED') 
    return mylog 

if __name__ == '__main__': 
    log = getlog('testing') 
    log.info('working?') 
    log.info('yes, seems to be working') 

    log2 = getlog('testing') 
    log2.info('still working?') 

Aquí está la salida:

L:testing M:easy_log T:2011-04-11 15:30:14,315 > INFO: NEW LOGGER STARTED 
L:testing M:easy_log T:2011-04-11 15:30:14,316 > INFO: working? 
L:testing M:easy_log T:2011-04-11 15:30:14,316 > INFO: yes, seems to be working 
L:testing M:easy_log T:2011-04-11 15:30:14,316 > INFO: NEW LOGGER STARTED 
L:testing M:easy_log T:2011-04-11 15:30:14,316 > INFO: NEW LOGGER STARTED 
L:testing M:easy_log T:2011-04-11 15:30:14,316 > INFO: still working? 
L:testing M:easy_log T:2011-04-11 15:30:14,316 > INFO: still working? 

Como se puede ver, ahora dando salida doble. Sin embargo, el módulo de registro es bastante confuso, y no sé de una forma de averiguar si un registro ya se ha instanciado, o si un objeto de registro ya tiene un controlador. Un poco de ayuda sería apreciada.

Editar: para agregar un poco más de detalle, planeo llamar esto en varios módulos, esencialmente tratando de reemplazar la llamada "logging.getLogger".

Respuesta

1

Terminé respondiendo mi propia pregunta. Aquí está el código

global IS_SETUP 
IS_SETUP = False 
def setuplogger(filename = 'python.log', directory = None, format = 'L:%(name)s M:%(module)s T:%(asctime)s > %(levelname)s: %(message)s'): 
    global IS_SETUP 
    if directory == None: 
     fd, fname = tempfile.mkstemp() 
     directory = os.path.dirname(fname) 

    logging.basicConfig(filename = directory + '/' + filename, format = format) 
    IS_SETUP = True 

def getlog(logname, level = logging.INFO): 
    '''returns a logger with logname that will print to filename and directoryname.''' 
    if IS_SETUP == False: 
     setuplogger() 

    mylog = logging.getLogger(logname) 

    mylog.setLevel(level) 
    mylog.info('NEW LOGGER STARTED') 
    return mylog 

Esto evita la doble configuración. Además, aparentemente la configuración básica funcionaría incluso si se llamara varias veces.

Si alguien sabe cómo controlar qué manejadores están en un objeto de registro, me gustaría saber. Parece absolutamente imposible.

+0

FWIW puede acceder a "mylog.handlers" para recorrer la lista de controladores instalados – amirpc

Cuestiones relacionadas