logging.info nie pojawia się na konsoli, ale ostrzega i pojawia się błąd


99

Kiedy loguję zdarzenie za pomocą logging.info, nie pojawia się ono w terminalu Pythona.

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

Natomiast zdarzenia zarejestrowane za pomocą logging.warnnie pojawiają się w terminalu.

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

Czy istnieje zmiana poziomu środowiska, którą mogę logging.infowydrukować na konsoli? Chcę uniknąć wprowadzania zmian w każdym pliku Pythona.

Odpowiedzi:


163

Główny rejestrator zawsze domyślnie ustawia poziom OSTRZEŻENIA. Spróbuj zadzwonić

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

i powinno być dobrze.


1
Nie, wystarczy zadzwonić tylko raz. Rejestrator jest zbudowany jako hierarchia, a całe rejestrowanie sprowadza się do głównego programu rejestrującego . Nie określając żadnego argumentu getLogger(), zwraca główny program rejestrujący. Dopóki nie zmodyfikujesz innych programów rejestrujących, wystarczy zmodyfikować główny program rejestrujący.
Ztyx

18
Czy wiesz, dlaczego logging.basicConfig (level = logging.INFO) nie działa? Nie widzę tego wyraźnie w dokumentacji.
Doppelganger

1
@ P1h3r1e3d13 Jeśli masz tylko jeden główny program rejestrujący, który jest prawdopodobnie najlepszym rozwiązaniem, tak.
Ztyx

7
To nie działa w Pythonie 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, to samo ze mną 3.6.8 nie drukuje wiadomości informacyjnych, nawet gdy setLevel jest ustawiony na logowanie.INFO
Robert Lugg,

31

Tak jak @ztyx powiedział, że domyślny poziom rejestratora to OSTRZEŻENIE. Musisz ustawić go na niższy poziom

Możesz to zrobić, korzystając z logging.basicConfig i ustawiając poziom rejestratora :

logging.basicConfig(level=logging.DEBUG)

8
Zastanawiam się, dlaczego basicConfig()u mnie nie działa, chociaż logging.getLogger().setLevel()odpowiednio działa?
Shayan Amani

17

Powyższe rozwiązania nie działały u mnie, ale kod tutaj :

# 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)

(Pominąłem części kodu ze względu na czytelność)


1
To jedyna rzecz, która zadziałała dla mnie. Miałem wiersz z, logging.error("Connection timed out!")a nawet z level=logging.DEBUGin the basicConfig(), nie byłby on drukowany na konsoli. Dodanie handlera tak, wielkie dzięki !!
BruceWayne,

Pamiętaj, że przewodnik, którego używasz, odgrywa rolę. Gdyby na przykład twój kod miał NullHandler, nic nie zostałoby wydrukowane niezależnie od dźwigni logowania.
George

To samo tutaj - jeśli pominę argument level w basicConfiglub ustawię go powyżej INFO, to rejestrator konsoli nigdy niczego nie zarejestruje. Jeśli opuszczę, basicConfigmogę dzwonić setLeveldo rejestratora przez cały dzień (i widzę zmianę poziomu, dzwoniąc getEffectiveLevel), ale nigdy nie zarejestruje niczego poniżej WARNINGpoziomu. Właściwie nie jestem pewien, czy to nie jest właściwe zachowanie, ale nie tego się spodziewałem.
Hal
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.