lenguaje - solo nivel específico de registro de Python
python wikipedia (2)
Estoy registrando eventos en mi código de Python en el módulo de registro de Python. Tengo 2 archivos de registro que deseo registrar también, uno para contener información del usuario y el otro un archivo de registro más detallado para los desarrolladores. He establecido los dos archivos de registro en los niveles que quiero (usr.log = INFO y dev.log = ERROR) pero no puedo resolver cómo restringir el registro al archivo usr.log para que solo se escriban los registros de nivel INFO al archivo de registro en lugar de INFO más todo lo demás por encima de él, por ejemplo, INFO, ADVERTENCIA, ERROR y CRÍTICO.
Este es básicamente mi código:
import logging
logger1 = logging.getLogger('''')
logger1.addHandler(logging.FileHandler(''/home/tmp/usr.log'')
logger1.setLevel(logging.INFO)
logger2 = logging.getLogger('''')
logger2.addHandler(logging.FileHandler(''/home/tmp/dev.log'')
logger2.setLevel(logging.ERROR)
logging.critical(''this to be logged in dev.log only'')
logging.info(''this to be logged to usr.log and dev.log'')
logging.warning(''this to be logged to dev.log only'')
Cualquier ayuda seria genial gracias.
En general estoy de acuerdo con David, pero creo que hay que decir más. Parafraseando a la princesa prometida : no creo que este código signifique lo que usted cree que significa. Tu código tiene:
logger1 = logging.getLogger('''')
...
logger2 = logging.getLogger('''')
lo que significa que logger1
y logger2
son el mismo registrador, de modo que cuando configura el nivel de logger2
en ERROR, en realidad termina configurando el nivel de logger1
al mismo tiempo. Para obtener dos registradores diferentes, deberá proporcionar dos nombres de registrador diferentes. Por ejemplo:
logger1 = logging.getLogger(''user'')
...
logger2 = logging.getLogger(''dev'')
Peor aún, está llamando a los métodos critical()
, info()
y warning()
del módulo de registro y espera que ambos registradores reciban los mensajes. Esto solo funciona porque usó la cadena vacía como nombre tanto para logger1
como para logger2
y, por lo tanto, no son solo el mismo registrador, sino que también son el registrador raíz. Si usa nombres diferentes para los dos registradores, como he sugerido, deberá llamar los métodos critical()
, info()
y warning()
en cada registrador individualmente (es decir, necesitará dos llamadas en lugar de una ).
Lo que creo que realmente quieres es tener dos handlers diferentes en un solo registrador. Por ejemplo:
import logging
mylogger = logging.getLogger(''mylogger'')
handler1 = logging.FileHandler(''usr.log'')
handler1.setLevel(logging.INFO)
mylogger.addHandler(handler1)
handler2 = logging.FileHandler(''dev.log'')
handler2.setLevel(logging.ERROR)
mylogger.addHandler(handler2)
mylogger.setLevel(logging.INFO)
mylogger.critical(''A critical message'')
mylogger.info(''An info message'')
Una vez que haya hecho este cambio, puede usar los filters como David ya ha mencionado. Aquí hay un filtro de muestra rápida:
class MyFilter(object):
def __init__(self, level):
self.__level = level
def filter(self, logRecord):
return logRecord.levelno <= self.__level
Puede aplicar el filtro a cada uno de los dos manejadores de esta manera:
handler1.addFilter(MyFilter(logging.INFO))
...
handler2.addFilter(MyFilter(logging.ERROR))
Esto restringirá a cada controlador para que solo escriba los mensajes de registro en el nivel especificado.
Primero: esta es una cosa bastante extraña para querer hacer, y me parece un ligero mal uso del sistema de registro. No puedo imaginar ninguna situación en la que tenga sentido notificar al usuario sobre el funcionamiento normal del programa, pero no sobre las cosas que son más importantes. Los niveles de registro se deben utilizar para indicar la importancia; Si tiene mensajes que solo son de interés para los desarrolladores, debe usar algún otro mecanismo para distinguirlos (como a qué registrador los envía).
Dicho esto, puede implementar un filtrado arbitrario de registros al crear una subclase de filter
cuyo método de filter
implemente los criterios deseados e instalarlo en el controlador apropiado.