2012-04-26 26 views
26

Czy ktoś wie, czy istnieje sposób na użycie zmiennej w funkcji setlevel() modułu logowania Pythona?Python Logging setlevel

Obecnie używam to:

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

Ale chciałbym mieć to:

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) 

Ale to nie wydają się działać - po prostu nie rejestruje byle co. Robię to, aby ustawić poziom rejestrowania dla całej gamy skryptów ze zmiennej w jednym pliku konfiguracyjnym. Przepraszam, jeśli brakuje tu czegoś oczywistego!

+9

należy używać wielkich liter w swoich wartości DICT: 'błąd: logging.ERROR' itp – georg

+0

Nie mogę uwierzyć, że to było takie proste! Jestem zażenowany. – Jak

+1

dzieje się nam wszystkim;) – georg

Odpowiedz

55

Należy także być w stanie to zrobić:

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

Funkcja logging.getLevelName(lvl) działa w obie strony. Używam go, działa (powinieneś sprawdzić implementację pythona).

To oszczędza kłopotów z utrzymaniem własnego słownika i zmniejsza możliwość błędów pisowni.

Pozdrawiam!

+0

To jest naprawdę pomocne. Dzięki! – skytreader

+3

quote: "W wersjach Pythona starszych niż 3.4 funkcja ta mogłaby również zostać przekazana jako poziom tekstu i zwróciłaby odpowiednią wartość liczbową poziomu.To nieudokumentowane zachowanie zostało uznane za błąd i zostało usunięte w Pythonie 3.4, ale przywrócone w 3.4.2 z powodu zachowania kompatybilności wstecznej. " – VPfB

3

miałem problemy z Python 3 i dostałem tej pracy dla mnie: 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 Podoba mi się sposób, w jaki masz wszystkie wywołania rejestrowania w definicji funkcji. Zmniejsza to prawdopodobieństwo [problemów z blokowaniem importu z logowaniem] (https://stackoverflow.com/questions/46356672/). –

0

Co na temat korzystania getattr moduł logging?

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