Realmente extraño algo básico sobre el módulo de registro de Python.Ayúdame a comprender el módulo de registro de python y sus controladores
En el siguiente código, creo un objeto logger (log
) y le agrego dos manejadores. Uno con nivel 'INFO' y otro con nivel 'ADVERTENCIA'. Se supone que ambos deben imprimir en stdout. Espero que llamar a log.info(msg)
resultará en una copia de msg
en mi stdout y llamar a log.warn(msg)
para obtener en dos copias de msg
impresas en mi stdout. Aquí está el código:
import logging
import sys
logging.basicConfig()
log = logging.getLogger('myLogger')
log.handlers = []
h1 = logging.StreamHandler(sys.stdout)
h1.level = logging.INFO
h1.formatter = logging.Formatter('H1 H1 %(message)s ')
h2 = logging.StreamHandler(sys.stdout)
h2.level = logging.WARNING
h2.formatter = logging.Formatter('H2 H2 %(message)s')
log.addHandler(h1)
log.addHandler(h2)
print 'log.level == %s'%logging.getLevelName(log.level)
print 'log.info'
log.info('this is some info')
print 'done'
print 'log.warn'
log.warn('this is a warning')
print 'done'
La salida es realmente muy extraña para mí. La llamada .info
no produce ningún efecto visual. Sin embargo, llamar al warn
da como resultado dos copias de msg impresas en stdout (lo cual está bien), pero también una copia impresa en stderr (¿por qué?). Este es el resultado del código anterior. Tenga en cuenta el formato de la última línea en esta salida. Esta línea está impresa en stderr.
log.level == NOTSET
log.info
done
log.warn
H1 H1 this is a warning
H2 H2 this is a warning
done
WARNING:myLogger:this is a warning
Así que mis preguntas son:
- ¿Por qué mi llamada a
info
resultado en ninguna salida, a pesar de que el nivelh1
's es INFO? - ¿por qué mi llamada al
warn
da como resultado una salida adicional a stderr?
No estoy seguro, pero puede ser que funcione en problemas porque 'logging' del pitón tiene un nivel incorporadas para la advertencia y la información. – brc
@brc Esto respondería a mi primera pregunta, pero no la segunda –