Używam modułu logowania Pythona i chcę wyłączyć rejestrowanie konsoli na jakiś czas, ale to nie działa.
#!/usr/bin/python
import logging
logger = logging.getLogger() # this gets the root logger
# ... here I add my own handlers
#logger.removeHandler(sys.stdout)
#logger.removeHandler(sys.stderr)
print logger.handlers
# this will print [<logging.StreamHandler instance at ...>]
# but I may have other handlers there that I want to keep
logger.debug("bla bla")
Powyższy kod wyświetla bla bla
na stdout i nie wiem, jak bezpiecznie wyłączyć obsługę konsoli. Jak mogę się upewnić, że tymczasowo usunę konsolę StreamHandler, a nie inną?
logger.handlers
powinien być pusty (tak jak poprzedzalogger.debug()
wywołanie). Kod, o którym mowa, jest wyświetlany tylko[]
(pusta lista programów obsługi). Zweryfikowano w Pythonie 2.7.15 i Pythonie 3.6.6.Odpowiedzi:
Znalazłem na to rozwiązanie:
Zapobiegnie to wysyłaniu rejestrowania do wyższego programu rejestrującego, który obejmuje rejestrowanie konsoli.
źródło
INFO
wiadomości), możesz zmienić drugą linię na coś w rodzajulogger.setLevel(logging.WARNING)
logging.lastResort
handler będzie jeszcze wiadomości nasilenia zalogowaćlogging.WARNING
i większej dosys.stderr
w braku innych koparki. Zobacz moją odpowiedź .Używam:
źródło
logging
poziomie modułu, aby całkowicie wyłączyć logowanie , na przykładimport logging; logging.disable(logging.CRITICAL);
:: docs.python.org/2/library/logging.html#logging.disabledisabled
Atrybut nie jest częścią publicznych API. Zobacz bugs.python.org/issue36318 .Możesz użyć:
gdzie twój_poziom jest jednym z tych:
Więc jeśli ustawisz your_level na logging.CRITICAL , dostaniesz tylko krytyczne komunikaty wysyłane przez:
Oprawa your_level na logging.DEBUG pokaże wszystkie poziomy logowania.
Aby uzyskać więcej informacji, zapoznaj się z przykładami rejestrowania.
W ten sam sposób, aby zmienić poziom dla każdego programu obsługi, użyj funkcji Handler.setLevel () .
źródło
(od dawna martwe pytanie, ale dla przyszłych poszukiwaczy)
Bliżej kodu / intencji oryginalnego postera, działa to dla mnie pod Pythonem 2.6
Problem, który musiałem rozwiązać, polegał na usunięciu programu obsługi standardowego wyjścia po dodaniu nowego; wydaje się, że kod rejestratora automatycznie dodaje ponownie standardowe wyjście, jeśli nie ma żadnych programów obsługi.
źródło
logger = logging.getLogger(); lhStdout = logger.handlers[0]
jest nieprawidłowa, ponieważ główny program rejestrujący początkowo nie ma programów obsługi -python -c "import logging; assert not logging.getLogger().handlers"
. Zweryfikowano w Pythonie 2.7.15 i Pythonie 3.6.6.Menedżer kontekstu
Przykład użycia:
źródło
Aby całkowicie wyłączyć rejestrowanie :
Aby włączyć rejestrowanie :
Inne odpowiedzi zawierają obejścia, które nie rozwiązują w pełni problemu, na przykład
a dla niektórych
n
powyżej 50 latProblem z pierwszym rozwiązaniem polega na tym, że działa tylko dla głównego programu rejestrującego. Inne loggery utworzone za pomocą, powiedzmy,
logging.getLogger(__name__)
nie są wyłączane przez tę metodę.Drugie rozwiązanie ma wpływ na wszystkie dzienniki. Ale ogranicza wyjście do poziomów powyżej podanego, więc można je zastąpić, logując się z poziomem większym niż 50.
Można temu zapobiec
co, o ile wiem (po przejrzeniu źródła ), jest jedynym sposobem na całkowite wyłączenie logowania.
źródło
Jest tu kilka naprawdę fajnych odpowiedzi, ale najwyraźniej nie bierze się zbytnio pod uwagę najprostszych (tylko z infinito).
Spowoduje to wyłączenie głównego programu rejestrującego, a tym samym wszystkich innych programów rejestrujących. Tak naprawdę nie testowałem, ale powinien być też najszybszy.
Widzę to z kodu logowania w Pythonie 2.7
Co oznacza, że gdy jest wyłączona, żaden program obsługi nie jest wywoływany i powinno być bardziej wydajne niż na przykład filtrowanie do bardzo wysokiej wartości lub ustawianie funkcji obsługi nieobsługiwanej.
źródło
log = logging.getLogger(__name__)
disabled
Atrybut nie jest częścią publicznych API. Zobacz bugs.python.org/issue36318 .Nie ma potrzeby przekierowywania wyjścia standardowego. Oto lepszy sposób na zrobienie tego:
Jeszcze prostszym sposobem jest:
źródło
logging.basicConfig()
funkcji (moje podkreślenie): Czy podstawowa konfiguracja systemu logowania polega na utworzeniu StreamHandler z domyślnym formaterem i dodaniu go do głównego rejestratora. Funkcje debug (), info (), warning (), error () i krytyczne () będą automatycznie wywoływać basicConfig (), jeśli dla głównego programu rejestrującego nie są zdefiniowane żadne funkcje obsługi . - docs.python.org/3/library/logging.html#logging.basicConfigNie znam zbyt dobrze modułu logowania, ale używam go w sposób, w jaki zwykle chcę wyłączyć tylko komunikaty debugowania (lub informacje). Możesz użyć
Handler.setLevel()
aby ustawić poziom rejestrowania na KRYTYCZNY lub wyższy.Można również zastąpić sys.stderr i sys.stdout plikiem otwartym do zapisu. Zobacz http://docs.python.org/library/sys.html#sys. stdout . Ale nie polecałbym tego.
źródło
[]
.Możesz również:
źródło
app.logger
którego nawet nie określasz, zamiast głównego programu rejestrującego wyraźnie wymienionego w pytaniu (logging.getLogger()
) i większości odpowiedzi? Skąd wiesz, że możesz bezpiecznie modyfikowaćhandlers
właściwość zamiast wywoływaćLogger.addHandler
metodę?Wyjście konsoli:
Zawartość pliku test.log:
źródło
Zmieniając jeden poziom w pliku „logging.config.dictConfig”, można przenieść cały poziom rejestrowania na nowy poziom.
})
źródło
Znalazłem eleganckie rozwiązanie przy użyciu dekoratorów , które rozwiązuje następujący problem: co jeśli piszesz moduł z kilkoma funkcjami, z których każda zawiera kilka komunikatów debugowania, i chcesz wyłączyć logowanie wszystkich funkcji oprócz tej, na której się obecnie koncentrujesz?
Możesz to zrobić za pomocą dekoratorów:
Następnie możesz:
Nawet jeśli dzwonisz
function_already_debugged
z wewnątrzfunction_being_focused
, debuguj wiadomości odfunction_already_debugged
adresu nie będą wyświetlane. Gwarantuje to, że zobaczysz tylko komunikaty debugowania z funkcji, na której się koncentrujesz.Mam nadzieję, że to pomoże!
źródło
Jeśli chcesz tymczasowo wyłączyć określony rejestrator, oto co zostało zrobione.
Przykładowy dziennik
Kod
źródło
W bibliotece Logging Python można całkowicie wyłączyć rejestrowanie (na wszystkich poziomach) dla określonego programu rejestrującego, wykonując jedną z następujących czynności:
Dodanie do programu rejestrującego programu
logging.NullHandler()
obsługi (aby zapobieclogging.lastResort
rejestrowaniu przez program obsługi zdarzeń o istotnościlogging.WARNING
i wyższymsys.stderr
) i ustawieniepropagate
atrybutu tego programu rejestrującego naFalse
(aby uniemożliwić rejestratorowi przekazywanie zdarzeń do programów obsługi jego nadrzędnych rejestratorów).Korzystanie z głównego interfejsu API:
Korzystanie z config API:
Dodanie do loggera
lambda record: False
filtra.Korzystanie z głównego interfejsu API:
Korzystanie z config API:
Ostrzeżenie. - W przeciwieństwie do rozwiązania pierwszego, rozwiązanie drugie nie wyłącza logowania z loggerów podrzędnych (np
logging.getLogger("foo.bar")
loggerów ), Więc należy go używać tylko do wyłączania logowania dla pojedynczego loggera.Uwaga. - Ustawienie
disabled
atrybutu loggera naTrue
nie jest trzecim rozwiązaniem, ponieważ nie jest częścią publicznego API. Zobacz https://bugs.python.org/issue36318 :źródło
podklasę moduł obsługi, który chcesz tymczasowo wyłączyć:
znalezienie programu obsługi po imieniu jest dość łatwe:
raz znaleziony:
źródło