values - python logging multiple files
registro con filtros (2)
Estoy usando el registro (registro de import logging
) para registrar mensajes.
Dentro de 1 módulo individual, estoy registrando mensajes en el nivel de depuración my_logger.debug(''msg'')
;
Algunos de estos mensajes de depuración provienen de function_a()
y otros de function_b()
; Me gustaría poder habilitar / deshabilitar el registro en función de si provienen de a o de b;
Supongo que tengo que usar el mecanismo de filtrado de Logging.
¿Alguien puede mostrarme cómo debería instrumentarse el siguiente código para hacer lo que quiero?
import logging
logger= logging.getLogger( "module_name" )
def function_a( ... ):
logger.debug( "a message" )
def function_b( ... ):
logger.debug( "another message" )
if __name__ == "__main__":
logging.basicConfig( stream=sys.stderr, level=logging.DEBUG )
#don''t want function_a()''s noise -> ....
#somehow filter-out function_a''s logging
function_a()
#don''t want function_b()''s noise -> ....
#somehow filter-out function_b''s logging
function_b()
Si amplié este simple ejemplo a más módulos y más funciones por módulo, me preocuparía la existencia de muchos registradores;
¿Puedo mantenerlo en 1 logger por módulo? Tenga en cuenta que los mensajes de registro están "estructurados", es decir, si la (s) función (es) iniciar sesión están realizando algún trabajo de análisis, todos ellos contienen un prefijo logger.debug("parsing: xxx")
- ¿puedo de alguna manera con solo cerrar una línea? -off de todos los mensajes de "análisis sintáctico" (independientemente del módulo / función que emite el mensaje?)
No use global Es un accidente esperando a suceder.
Puede dar a sus registradores cualquier "." - nombres separados que sean significativos para usted.
Puede controlarlos como una jerarquía. Si tiene registradores llamados abc
y abd
, puede verificar el nivel de registro para ab
y modificar ambos registradores.
Puedes tener cualquier cantidad de registradores, son baratos.
El patrón de diseño más común es un registrador por módulo. Consulte Nombres de registradores de Python
Hacer esto.
import logging
logger= logging.getLogger( "module_name" )
logger_a = logger.getLogger( "module_name.function_a" )
logger_b = logger.getLogger( "module_name.function_b" )
def function_a( ... ):
logger_a.debug( "a message" )
def functio_b( ... ):
logger_b.debug( "another message" )
if __name__ == "__main__":
logging.basicConfig( stream=sys.stderr, level=logging.DEBUG )
logger_a.setLevel( logging.DEBUG )
logger_b.setLevel( logging.WARN )
... etc ...
Solo implemente una subclase de logging.Filter
: http://docs.python.org/library/logging.html#filter-objects . Tendrá un método, filter(record)
, que examina el registro de registro y devuelve True para registrarlo o False para descartarlo. Luego puede instalar el filtro en un Logger
o un Handler
llamando a su addFilter(filter)
.
Ejemplo:
class NoParsingFilter(logging.Filter):
def filter(self, record):
return not record.getMessage().startswith(''parsing'')
logger.addFilter(NoParsingFilter())
O algo así, de todos modos.