logging.info no aparece en la consola, pero la advertencia y el error sí

94

Cuando registro un evento con logging.info, no aparece en la terminal de Python.

import logging
logging.info('I am info')  # no output

Por el contrario, los eventos registrados con logging.warnaparecen en la terminal.

import logging
logging.warn('I am warning')  # outputs "I am warning"

¿Hay algún cambio de nivel de entorno que pueda realizar logging.infopara imprimir en la consola? Quiero evitar hacer cambios en cada archivo de Python.

soñador
fuente

Respuestas:

157

El registrador raíz siempre tiene como valor predeterminado el nivel de ADVERTENCIA. Intenta llamar

logging.getLogger().setLevel(logging.INFO)

y deberías estar bien.

Ztyx
fuente
1
No, solo necesitas llamarlo una vez. El registrador se construye como una jerarquía y todo el registro se reduce a un registrador raíz . Al no especificar ningún argumento getLogger(), le devuelve el registrador raíz. Siempre que no modifique los otros registradores, solo necesita modificar el registrador raíz.
Ztyx
18
¿Sabes por qué logging.basicConfig (level = logging.INFO) no funciona? No puedo verlo claramente en la documentación.
Doppelganger
1
@ P1h3r1e3d13 Si solo tiene un registrador raíz que probablemente sea la mejor práctica, sí.
Ztyx
7
Esto no funciona en Python 3.5:Python 3.5.2 (default, Nov 12 2018, 13:43:14) [GCC 5.4.0 20160609] on linux >>> import logging >>> rootLog = logging.getLogger() >>> rootLog.setLevel(logging.INFO) >>> rootLog.info('all the kings horses') >>> rootLog.warning('all the kings men') all the kings men
Jeff K
6
@jeffk, lo mismo conmigo 3.6.8 no imprime mensajes de información incluso cuando setLevel está configurado en logging.INFO
Robert Lugg
28

Como dijo @ztyx, el nivel de registrador predeterminado es ADVERTENCIA. Tienes que ponerlo en un nivel más bajo

Puede hacerlo usando logging.basicConfig y configurando el nivel de registrador :

logging.basicConfig(level=logging.DEBUG)
Vlad Bezden
fuente
7
Me pregunto por qué basicConfig()no funciona para mí, aunque logging.getLogger().setLevel()funciona adecuadamente.
Shayan Amani
17

Las soluciones anteriores no funcionaron para mí, pero el código aquí sí lo hizo:

# set up logging to file
logging.basicConfig(level=logging.DEBUG,
                    format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s',
                    datefmt='%m-%d %H:%M',
                    filename='/temp/myapp.log',
                    filemode='w')
# define a Handler which writes INFO messages or higher to the sys.stderr
console = logging.StreamHandler()
console.setLevel(logging.INFO)
# add the handler to the root logger
logging.getLogger('').addHandler(console)

(Omití partes del código en aras de la legibilidad)

Orly
fuente
1
Esto es lo único que funcionó para mí. Tenía una línea con logging.error("Connection timed out!")e incluso con el level=logging.DEBUGen el basicConfig(), no se imprimía en la consola. Agregar el controlador lo hizo, muchas gracias !!
BruceWayne
Tenga en cuenta que el controlador que está utilizando está desempeñando un papel. Si, por ejemplo, su código tuviera NullHandler, no se imprimirá nada independientemente de la palanca de registro.
George
Lo mismo aquí: si omito el argumento de nivel basicConfigo lo configuro por encima de INFO, el registrador de la consola nunca registrará nada. Si dejo fuera basicConfig, puedo llamar setLevela un registrador todo el día (y puedo ver el cambio de nivel llamando getEffectiveLevel) pero nunca registrará nada por debajo del WARNINGnivel. En realidad, no estoy seguro de que ese no sea el comportamiento correcto, pero no es lo que esperaba.
Hal