2012-08-05 11 views
22

Tengo el siguiente código que se ejecuta en cada solicitud de un wsgi (web2py) aplicación:Reemplazar controlador predeterminado de Python registrador

import logging, logging.handlers 
from logging import StreamHandler, Formatter 

def get_configured_logger(name): 

    logger = logging.getLogger(name) 

    if (len(logger.handlers) == 0): 
     # This logger has no handlers, so we can assume it hasn't yet been configured (Django uses similiar trick) 

     # === Configure logger === 

     # Create Formatted StreamHandler: 
     FORMAT = "%(process)s %(thread)s: %(message)s" 
     formatter = logging.Formatter(fmt=FORMAT) 
     handler = logging.StreamHandler() 
     handler.setFormatter(formatter) 
     logger.addHandler(handler) 
     logger.setLevel(logging.DEBUG) 
     logger.debug('CONFIGURING LOGGER') 

    return logger 

# Get app specific logger: 
logger = get_configured_logger(request.application) 
logger.debug("TEST") 

Es la intención de configurar el registrador de una vez, con el controlador de formato que quiero. Funciona, excepto que estoy recibiendo entradas dobles en mi salida estándar:

81893 4329050112: CONFIGURING LOGGER 
DEBUG:dummy:CONFIGURING LOGGER 
81893 4329050112: TEST 
DEBUG:dummy:TEST 

¿Cómo utilizo mi nuevo controlador de formateado y deshacerse de/ocultar el defecto?

+0

Nunca he usado esta clase antes, pero ¿no cree que logger.setLevel (logging.DEBUG) y logger.debug es algo redundante? – MiJyn

+1

lkjoel- No, son dos cosas diferentes. llamar '.debug (..)' crea entradas de registro en el nivel de depuración, mientras que al establecer el nivel de registro, se le indica al controlador que * maneje * las entradas de registro en ese nivel. – Yarin

+0

¿Está llamando 'logging.basicConfig' en cualquier lugar? Si es así, coméntelo. – unutbu

Respuesta

35

Quizás el siguiente ejemplo ayude. Básicamente, puede eliminar los controladores del registrador que desea desactivar o no propagar con el registrador desde el que está iniciando sesión.

$ cat testlog.py 
import logging 
logging.basicConfig(filename='foo', level=logging.DEBUG) 
root_logger = logging.getLogger() 
root_logger.debug('bar') 

my_logger = logging.getLogger('my_logger') 
FORMAT = "%(process)s %(thread)s: %(message)s" 
formatter = logging.Formatter(fmt=FORMAT) 
handler = logging.StreamHandler() 
handler.setFormatter(formatter) 

my_logger.addHandler(handler) 
my_logger.setLevel(logging.DEBUG) 
my_logger.info('baz') 

my_logger.propagate = False 
my_logger.info('foobar') 

my_logger.propagate = True 
my_logger.info('foobaz') 
root_logger.handlers = [] 
my_logger.info('barbaz') 

$ python testlog.py 
5927 140735224465760: baz 
5927 140735224465760: foobar 
5927 140735224465760: foobaz 
5927 140735224465760: barbaz 

$ cat foo 
DEBUG:root:bar 
INFO:my_logger:baz 
INFO:my_logger:foobaz 
+7

Derek- setting 'logger.propagate = False' era todo lo que necesitaba, ¡gracias! – Yarin

Cuestiones relacionadas