Korzystam z modułu rejestrującego Pythona, aby zalogować niektóre ciągi debugowania do pliku, który działa całkiem dobrze. Teraz dodatkowo chciałbym użyć tego modułu do wydrukowania ciągów na standardowe wyjście. Jak mam to zrobic? Aby zalogować moje ciągi do pliku, używam następującego kodu:
import logging
import logging.handlers
logger = logging.getLogger("")
logger.setLevel(logging.DEBUG)
handler = logging.handlers.RotatingFileHandler(
LOGFILE, maxBytes=(1048576*5), backupCount=7
)
formatter = logging.Formatter("%(asctime)s - %(name)s - %(levelname)s - %(message)s")
handler.setFormatter(formatter)
logger.addHandler(handler)
a następnie wywołać funkcję rejestratora, np
logger.debug("I am written to the file")
Dziękuję za pomoc tutaj!
StreamHandler
pomocąsys.stdout
, a następnie zaloguje się do tego zamiast stderr.import sys
najpierw. I faktycznie zainicjuj moduł obsługi, tj.consoleHandler = logging.StreamHandler(sys.stdout)
rootLogger.setLevel(logging.DEBUG)
jeśli próbujesz zobaczyć informacje lub wiadomości debugowanialogging.basicConfig()
może wziąć argument słowa kluczowegohandlers
od Pythona 3.3, co znacznie upraszcza konfigurację rejestrowania, szczególnie przy konfigurowaniu wielu programów obsługi z tym samym formatyzatorem:Całą konfigurację można zatem wykonać za pomocą jednego połączenia takiego jak to:
(Lub z
import sys
+StreamHandler(sys.stdout)
dla oryginalnych wymagań pytania - domyślnie StreamHandler zapisuje do stderr. Spójrz na atrybuty LogRecord, jeśli chcesz dostosować format dziennika i dodać takie rzeczy, jak nazwa pliku / linii, informacje o wątku itp.)Powyższą konfigurację należy wykonać tylko raz w pobliżu początku skryptu. Możesz użyć rejestrowania ze wszystkich innych miejsc w bazie kodu później w następujący sposób:
Uwaga: jeśli to nie zadziała, prawdopodobnie ktoś już zainicjował system rejestrowania inaczej. Komentarze sugerują zrobienie tego
logging.root.handlers = []
przed wezwaniem dobasicConfig()
.źródło
FileHandler
:logging.FileHandler(filename, mode='a', encoding=None, delay=False)
. Oznacza to, że jeśli chcesz zalogować się do tego samego folderu, możesz po prostu użyćFileHandler("mylog.log")
. Jeśli chcesz zastępować dziennik za każdym razem, ustaw „w” jako drugi argument.logging.root.handlers = []
przed wezwaniembasicConfig
, spójrz na funkcję - to denerwujące.Dodanie StreamHandler bez argumentów przechodzi do stderr zamiast stdout. Jeśli jakiś inny proces jest zależny od zrzutu standardowego (np. Podczas pisania wtyczki NRPE), upewnij się, że określono standardowe wyjście standardowe, ponieważ możesz napotkać nieoczekiwane problemy.
Oto szybki przykład ponownego wykorzystania przyjętych wartości i pliku LOGFILE z pytania:
źródło
Uruchom
basicConfig
zstream=sys.stdout
jako argument przed konfigurowania innych ładowarki lub zalogowaniu żadnych wiadomości lub ręcznie dodaćStreamHandler
, że popycha wiadomości na standardowe wyjście do rejestratora root (lub dowolnego innego rejestratora chcesz, o to chodzi).źródło
Po wielokrotnym używaniu kodu Waterboya w wielu pakietach Python, w końcu wrzuciłem go do małego samodzielnego pakietu Python, który można znaleźć tutaj:
https://github.com/acschaefer/duallog
Kod jest dobrze udokumentowany i łatwy w użyciu. Wystarczy pobrać
.py
plik i dołączyć go do projektu lub zainstalować cały pakiet za pośrednictwempip install duallog
.źródło
Zalogowaniu do
stdout
irotating file
z różnych poziomów i formatów:źródło
Oto kompletne, ładnie opakowane rozwiązanie oparte na odpowiedzi Waterboya i różnych innych źródłach. Obsługuje logowanie zarówno do pliku konsoli, jak i pliku dziennika, pozwala na różne ustawienia poziomu dziennika, zapewnia kolorowe wyjście i jest łatwo konfigurowalny (dostępny również jako Gist ):
źródło
W przypadku wersji 2.7 spróbuj wykonać następujące czynności:
źródło