Estoy usando el módulo de registro de Python y quiero deshabilitar el registro de la consola durante algún tiempo, pero no funciona.
#!/usr/bin/python
import logging
logger = logging.getLogger() # this gets the root logger
# ... here I add my own handlers
#logger.removeHandler(sys.stdout)
#logger.removeHandler(sys.stderr)
print logger.handlers
# this will print [<logging.StreamHandler instance at ...>]
# but I may have other handlers there that I want to keep
logger.debug("bla bla")
El código anterior muestra el bla bla
stdout activado y no sé cómo puedo desactivar de forma segura el controlador de la consola. ¿Cómo puedo estar seguro de que elimino temporalmente la consola StreamHandler y no otra?
logger.handlers
debe estar vacío (como precede a lalogger.debug()
llamada). El código en cuestión solo se muestra[]
(lista vacía de controladores). Verificado con Python 2.7.15 y Python 3.6.6.Respuestas:
Encontré una solución para esto:
Esto evitará que el registro se envíe al registrador superior que incluye el registro de la consola.
fuente
INFO
mensajes), puede cambiar la segunda línea a algo así comologger.setLevel(logging.WARNING)
logging.lastResort
controlador seguirá registrando mensajes de gravedadlogging.WARNING
y mayorsys.stderr
en ausencia de otros controladores. Mira mi respuesta .Yo suelo:
fuente
logging
nivel de módulo para deshabilitar el registro por completo , por ejemploimport logging; logging.disable(logging.CRITICAL);
:: docs.python.org/2/library/logging.html#logging.disabledisabled
atributo no es parte de la API pública. Ver bugs.python.org/issue36318 .Puedes usar:
donde your_level es uno de esos:
Entonces, si configura your_level en logging.CRITICAL , solo recibirá mensajes críticos enviados por:
Establecer your_level en logging.DEBUG mostrará todos los niveles de registro.
Para obtener más detalles, eche un vistazo a los ejemplos de registro.
De la misma manera, para cambiar el nivel de cada controlador, use la función Handler.setLevel () .
fuente
(pregunta largamente muerta, pero para futuros buscadores)
Más cerca del código / intención del póster original, esto funciona para mí en Python 2.6
El problema que tuve que resolver fue eliminar el controlador estándar después de agregar uno nuevo; el código del registrador parece volver a agregar automáticamente el stdout si no hay controladores disponibles.
fuente
logger = logging.getLogger(); lhStdout = logger.handlers[0]
es incorrecta ya que el registrador raíz inicialmente no tiene controladores -python -c "import logging; assert not logging.getLogger().handlers"
. Verificado con Python 2.7.15 y Python 3.6.6.Gestor de contexto
Ejemplo de uso:
fuente
Para deshabilitar completamente el registro :
Para habilitar el registro :
Otras respuestas proporcionan soluciones alternativas que no resuelven completamente el problema, como
y, para algunos
n
mayores de 50,El problema con la primera solución es que solo funciona para el registrador raíz. Otros registradores creados usando, por ejemplo,
logging.getLogger(__name__)
no están deshabilitados por este método.La segunda solución afecta a todos los registros. Pero limita la salida a niveles superiores a los dados, por lo que uno podría anularlo iniciando sesión con un nivel superior a 50.
Eso puede ser prevenido por
que por lo que puedo decir (después de revisar la fuente ) es la única forma de deshabilitar completamente el registro.
fuente
Aquí hay algunas respuestas realmente buenas, pero aparentemente la más simple no se toma demasiado en consideración (solo desde infinito).
Esto desactiva el registrador raíz y, por lo tanto, todos los demás registradores. Realmente no lo he probado, pero también debería ser el más rápido.
Del código de registro en Python 2.7 veo esto
Lo que significa que cuando está deshabilitado no se llama a ningún controlador, y debería ser más eficiente que filtrar a un valor muy alto o establecer un controlador no operativo, por ejemplo.
fuente
log = logging.getLogger(__name__)
disabled
atributo no es parte de la API pública. Ver bugs.python.org/issue36318 .No es necesario desviar stdout. Aquí hay una mejor manera de hacerlo:
Una forma aún más simple es:
fuente
logging.basicConfig()
función (énfasis mío): realiza la configuración básica para el sistema de registro al crear un StreamHandler con un formateador predeterminado y agregarlo al registrador raíz. Las funciones debug (), info (), warning (), error () y critical () llamarán a basicConfig () automáticamente si no hay controladores definidos para el registrador raíz . - docs.python.org/3/library/logging.html#logging.basicConfigNo conozco muy bien el módulo de registro, pero lo estoy usando de la forma en que generalmente quiero deshabilitar solo los mensajes de depuración (o información). Puede usar
Handler.setLevel()
para establecer el nivel de registro en CRÍTICO o superior.Además, puede reemplazar sys.stderr y sys.stdout por un archivo abierto para escritura. Ver http://docs.python.org/library/sys.html#sys. la salida estándar . Pero no lo recomendaría.
fuente
[]
.También podrías:
fuente
app.logger
lo que ni siquiera especifica en lugar del registrador raíz mencionado explícitamente en la pregunta (logging.getLogger()
) y la mayoría de las respuestas? ¿Cómo sabe que puede modificar de forma segura lahandlers
propiedad en lugar de llamar alLogger.addHandler
método?Salida de consola:
contenido del archivo test.log:
fuente
Al cambiar un nivel en "logging.config.dictConfig", podrá llevar todo el nivel de registro a un nuevo nivel.
})
fuente
Encontré una solución elegante usando decoradores , que aborda el siguiente problema: ¿qué sucede si está escribiendo un módulo con varias funciones, cada una de ellas con varios mensajes de depuración, y desea deshabilitar el registro en todas las funciones excepto en la que se está enfocando actualmente?
Puedes hacerlo usando decoradores:
Entonces, puedes hacer:
Incluso si llama
function_already_debugged
desde dentrofunction_being_focused
,function_already_debugged
no se mostrarán los mensajes de depuración de . Esto garantiza que solo verá los mensajes de depuración de la función en la que se está enfocando.¡Espero eso ayude!
fuente
Si desea deshabilitar un determinado registrador temporalmente, esto es lo que hizo.
Registro de ejemplo
Código
fuente
En la biblioteca Logging Python, se puede deshabilitar por completo el registro (para todos los niveles) para un registrador en particular haciendo lo siguiente:
Agregar al registrador un
logging.NullHandler()
controlador (para evitar que ellogging.lastResort
controlador registre eventos de gravedadlogging.WARNING
y mayor asys.stderr
) y establecer elpropagate
atributo de ese registrador enFalse
(para evitar que el registrador pase los eventos a los controladores de sus registradores ancestrales).Usando la API principal:
Usando la API de configuración:
Agregar al registrador un
lambda record: False
filtro.Usando la API principal:
Usando la API de configuración:
Advertencia. - Contrariamente a la primera solución, la segunda solución no desactiva el registro de los registradores secundarios (por ejemplo
logging.getLogger("foo.bar")
), por lo que se debe usar solo para desactivar el registro de un único registrador.Nota. - Establecer el
disabled
atributo del registrador enTrue
no es una tercera solución, ya que no es parte de la API pública. Ver https://bugs.python.org/issue36318 :fuente
Subclase el controlador que desea desactivar temporalmente:
encontrar el controlador por nombre es bastante fácil:
una vez encontrado:
fuente