La risposta di cui sopra non è veramente corretto - sarà sufficiente impostare la barra più in alto per i messaggi da altri moduli da mostrare.
Un approccio molto veloce sarebbe quella di utilizzare questo pezzo di codice:
import logging.config
logging.config.dictConfig({
'version': 1,
'disable_existing_loggers': True,
})
È necessario impostare questo dopo l'importazione di tutti i moduli - che verrà disattivare tutti i logger che sono stati creati fino a questo punto. Ciò funzionerà la maggior parte del tempo, ma alcuni moduli creano il loro logger quando si crea un'istanza di classe per esempio (cosa che succederebbe più avanti nel codice).
Quando si imposta logger secondo il tutorial di pitone base ti dicono di usare logging.basicConfig(...)
. Questo è un problema in quanto ciò imposterà il gestore (al quale verrà indirizzato il log) su logging.lastResort
che è stderr che inizia con Python 3.2 per logger a livello globale nel processo. Ciò significa che ora hai abilitato la registrazione completa per tutti i moduli.
Quindi un approccio migliore è quello di creare un logger diverso solo per i moduli e dargli alcuni gestori proprio invece di utilizzare basicConfig()
.
Ci sono due modi per farlo:
1) Tutte le funzioni:
import logging
log = logging.getLogger(__name__)
log.setLevel(logging.DEBUG)
formatter = logging.Formatter(fmt="%(asctime)s %(levelname)s: %(message)s",
datefmt="%Y-%m-%d - %H:%M:%S")
ch = logging.StreamHandler(sys.stdout)
ch.setLevel(logging.DEBUG)
ch.setFormatter(formatter)
fh = logging.FileHandler("mylog.log", "w")
fh.setLevel(logging.DEBUG)
fh.setFormatter(formatter)
log.addHandler(ch)
log.addHandler(fh)
Questo vi darà il logger log
che è possibile utilizzare come log.error("Error found")
. Scriverà in un nuovo file chiamato mylog.log e registrerà anche sys.stdout. Puoi cambiarlo come vuoi, ovviamente.
2) Con un dict:
import logging
import logging.config
DEFAULT_LOGGING = {
'version': 1,
'formatters': {
'standard': {
'format': '%(asctime)s %(levelname)s: %(message)s',
'datefmt': '%Y-%m-%d - %H:%M:%S' },
},
'handlers': {
'console': {'class': 'logging.StreamHandler',
'formatter': "standard",
'level': 'DEBUG',
'stream': sys.stdout},
'file': {'class': 'logging.FileHandler',
'formatter': "standard",
'level': 'DEBUG',
'filename': 'live_detector.log','mode': 'w'}
},
'loggers': {
__name__: {'level': 'INFO',
'handlers': ['console', 'file'],
'propagate': False },
}
}
logging.config.dictConfig(DEFAULT_LOGGING)
log = logging.getLogger(__name__)
Questo vi darà lo stesso risultato di cui sopra, un po 'più a lungo, ma forse più facile da leggere. Questo imposta automaticamente anche 'disable_existing_loggers': True
. Se non lo vuoi, devi aggiungerlo e impostarlo su False.