Per trovare la posizione del file di registro, prova a istanziare il tuo log
oggetto in una shell Python nel tuo ambiente e osservando il valore di:
log.handlers[0].stream
Il logging
Il modulo utilizza i gestori collegati ai logger per decidere come, dove o anche se i messaggi alla fine vengono archiviati o visualizzati. Puoi configurare logging
per impostazione predefinita, scrive anche su un file. Dovresti davvero leggere i documenti, ma se chiami logging.basicConfig(filename=log_file_name)
dove log_file_name
è il nome del file in cui vuoi scrivere i messaggi (nota che devi farlo prima di qualsiasi altra cosa in logging
viene chiamato), tutti i messaggi registrati in tutti i logger (a meno che non avvenga un'ulteriore riconfigurazione in seguito) verranno scritti lì. Prestare attenzione a quale livello è impostato il logger; se la memoria serve, info
è al di sotto del livello di registro predefinito, quindi dovresti includere level=logging.INFO
negli argomenti di basicConfig
così che il tuo messaggio finisca nel file.
Per quanto riguarda l'altra parte della tua domanda, logging.getLogger(some_string)
restituisce un Logger
oggetto, inserito nella posizione corretta nella gerarchia dal root logger, con il nome che è il valore di some_string
. Chiamato senza argomenti, restituisce il root logger. __name__
restituisce il nome del modulo corrente, quindi logging.getLogger(__name__)
restituisce un Logger
oggetto con il nome impostato sul nome del modulo corrente. Questo è un modello comune utilizzato con logging
, poiché fa sì che la struttura del logger rispecchi la struttura del modulo del tuo codice, il che spesso rende i messaggi di registrazione molto più utili durante il debug.
Alcune buone risposte su questo, ma la risposta migliore non ha funzionato per me perché stavo usando un diverso tipo di gestore di file e handler.stream non fornisce il percorso, ma l'handle del file e ottenere il percorso da quello è alquanto non ovvio. Ecco la mia soluzione:
import logging
from logging import FileHandler
# note, this will create a new logger if the name doesn't exist,
# which will have no handlers attached (yet)
logger = logging.getLogger('<name>')
for h in logger.handlers:
# check the handler is a file handler
# (rotating handler etc. inherit from this, so it will still work)
# stream handlers write to stderr, so their filename is not useful to us
if isinstance(h, FileHandler):
# h.stream should be an open file handle, it's name is the path
print(h.stream.name)
Per ottenere la posizione del registro di un semplice file logger, prova
logging.getLoggerClass().root.handlers[0].baseFilename