2012-04-26 19 views
26

¿Alguien sabe si hay una forma de usar una variable en la función setlevel() del módulo de registro de Python?Python Logging setlevel

Por el momento estoy usando esto:

Log = logging.getLogger('myLogger') 
Log.setLevel(logging.DEBUG) 

pero me gustaría tener esto:

Log = logging.getLogger('myLogger') 
levels = {'CRITICAL' : logging.critical, 
    'ERROR' : logging.error, 
    'WARNING' : logging.warning, 
    'INFO' : logging.info, 
    'DEBUG' : logging.debug 
} 
level = levels['INFO'] 
Log.setLevel(level) 

Pero no parece trabajar - sólo no registra cualquier cosa. Estoy haciendo esto para poder establecer el nivel de registro para un conjunto de scripts de una variable en un solo archivo de configuración. ¡Mis disculpas si me falta algo obvio aquí!

+9

Debe utilizar mayúsculas en sus valores dict: 'ERROR: logging.ERROR' etc – georg

+0

no puede creer que era así de simple! Me da vergüenza. – Jak

+1

nos ocurre a todos nosotros;) – georg

Respuesta

55

También debe ser capaz de hacer esto:

Log = logging.getLogger('myLogger') 
level = logging.getLevelName('INFO') 
Log.setLevel(level) 

La función logging.getLevelName(lvl) funciona en ambos sentidos. Lo uso, funciona (aunque debes comprobar tu implementación de python).

Esto le ahorra la molestia de mantener su propio diccionario y reduce la posibilidad de errores tipográficos.

¡Salud!

+0

Esto es realmente útil. ¡Gracias! Cita – skytreader

+3

: "En versiones de Python anteriores a la 3.4, esta función también podría pasar un nivel de texto, y devolvería el valor numérico correspondiente del nivel. Este comportamiento no documentado se consideró un error, y se eliminó en Python 3.4, pero se restableció en 3.4.2 debido a la retención de compatibilidad hacia atrás ". – VPfB

3

he tenido problemas con Python 3 y tiene este trabajo para mí: https://docs.python.org/3/howto/logging.html

# myapp.py 
import logging 
import mylib 

def main(): 
    logging.basicConfig(filename='myapp.log', level=logging.INFO) 
    logging.info('Started') 
    mylib.do_something() 
    logging.info('Finished') 

if __name__ == '__main__': 
    main() 
+0

+1 Me gusta la forma en que tiene todas las llamadas de registro dentro de una definición de función. Esto reduce la probabilidad de [importar problemas de bloqueo con el registro] (https://stackoverflow.com/questions/46356672/). –

0

Qué acerca del uso getattr en logging módulo?

import logging 
str_level = 'DEBUG' 
level = getattr(logging, str_level) 
logger = logging.getLogger("my_logger") 
logger.setLevel(level) 
print(logger.getEffectiveLevel())