Podstawy modułu logging
Proszę konfigurować rejestratory, ustawiać poziomy i prawidłowo emitować komunikaty.
Podstawy modułu logging to bezpłatna lekcja Python Academy na CoddyKit. To lekcja 1 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Python Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Python Academy zawiera 4 lekcji w sumie.
Dlaczego logging zamiast print
Moduł logging udostępnia poziomy ważności, konfigurowalne miejsca docelowe danych wyjściowych, znaczniki czasu oraz możliwość wyciszania danych wyjściowych bez zmian w kodzie.
import logging
logging.basicConfig(level=logging.DEBUG)
logging.debug("debug message")
logging.info("info message")
logging.warning("warning message")
logging.error("error message")
logging.critical("critical message")Poziomy logowania
Python definiuje pięć standardowych poziomów o rosnącej ważności: DEBUG, INFO, WARNING, ERROR, CRITICAL. Emitowane są tylko komunikaty na skonfigurowanym poziomie lub wyższym.
import logging
# Numeric values:
# DEBUG = 10
# INFO = 20
# WARNING = 30
# ERROR = 40
# CRITICAL = 50
logging.basicConfig(level=logging.WARNING)
logging.debug("hidden") # not shown
logging.warning("shown") # shownPobieranie loggera
W każdym module używaj logging.getLogger(__name__). Tworzy to hierarchię odpowiadającą strukturze modułów.
import logging
logger = logging.getLogger(__name__)
def process(data):
logger.info("Processing %d items", len(data))
return [x * 2 for x in data]Opcje basicConfig
basicConfig szybko konfiguruje główny logger. Typowe argumenty nazwane to: level, format, filename, filemode.
import logging
logging.basicConfig(
level=logging.DEBUG,
format="%(asctime)s %(levelname)s %(name)s — %(message)s",
datefmt="%Y-%m-%d %H:%M:%S",
)Pola formatu logów
Najważniejsze pola formatu to: %(levelname)s, %(name)s, %(message)s, %(asctime)s, %(filename)s, %(lineno)d.
import logging
fmt = "%(asctime)s | %(levelname)-8s | %(name)s:%(lineno)d | %(message)s"
logging.basicConfig(level=logging.DEBUG, format=fmt)
logging.info("Server started on port 8080")Logowanie wyjątków
Użyj logger.exception() wewnątrz bloku except, aby zapisać komunikat ORAZ pełny traceback.
import logging
logger = logging.getLogger(__name__)
try:
1 / 0
except ZeroDivisionError:
logger.exception("Division failed")
# Logs message + traceback automaticallyDodatkowy kontekst za pomocą extra=
Przekaż słownik jako extra=, aby dodać własne pola do rekordu logu.
import logging
logger = logging.getLogger(__name__)
logging.basicConfig(
format="%(asctime)s %(levelname)s [%(user)s] %(message)s"
)
logger.info("Login successful", extra={"user": "alice"})Leniwe formatowanie ciągów znaków
Przekazuj argumenty formatu osobno — nie formatuj ciągów z wyprzedzeniem. Pozwala to uniknąć kosztu tworzenia ciągu, gdy komunikat zostanie odfiltrowany.
import logging
logger = logging.getLogger(__name__)
# BAD (always builds the string):
logger.debug(f"Processing {len(data)} items")
# GOOD (only builds if DEBUG is enabled):
logger.debug("Processing %d items", len(data))Wyłączanie logowania
Wywołaj logging.disable(level), aby globalnie pominąć wszystkie komunikaty do danego poziomu włącznie — jest to przydatne w testach.
import logging
logging.disable(logging.CRITICAL) # suppress everything
# All log calls now silently do nothing
logging.disable(logging.NOTSET) # re-enableHierarchia loggerów
Nazwy loggerów używają kropek jako separatorów. Loggery potomne przekazują rekordy do loggerów nadrzędnych, chyba że ustawiono propagate=False.
import logging
parent = logging.getLogger("myapp")
child = logging.getLogger("myapp.database")
# child propagates to parent by default
child.warning("DB slow") # also appears in myapp's handlersGłówny logger
Główny logger (używany przez logging.warning() itd.) jest przodkiem wszystkich loggerów. Należy go skonfigurować za pomocą basicConfig lub bezpośrednio przez dodanie handlerów.
import logging
root = logging.getLogger() # root logger
root.setLevel(logging.DEBUG)
handler = logging.StreamHandler()
root.addHandler(handler)Szybkie sprawdzenie
Jakiej metody logowania należy użyć wewnątrz bloku except, aby automatycznie dołączyć pełny traceback?
Podsumowanie
Używaj nazwanych loggerów z getLogger(__name__), konfiguruj je za pomocą basicConfig, przekazuj argumenty formatu w sposób leniwy i używaj logger.exception() do zapisywania tracebacków błędów. Loggery tworzą hierarchię zakorzenioną w głównym loggerze.
Często zadawane pytania
Czy lekcja „Podstawy modułu logging” jest bezpłatna?
Tak — pełny tekst „Podstawy modułu logging” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Python Academy, przejdź na CoddyKit PRO. Kurs Python Academy zawiera 4 lekcji w sumie.
Co nauczysz się w „Podstawy modułu logging”?
Proszę konfigurować rejestratory, ustawiać poziomy i prawidłowo emitować komunikaty. Ćwiczysz Python Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.
Czy potrzebuję doświadczenia, aby zacząć Python Academy?
Nie wymagamy żadnego doświadczenia. Python Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 1 z 4.
Ile czasu zajmuje lekcja „Podstawy modułu logging”?
Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.
Czy mogę pisać i uruchamiać kod w tej lekcji Python Academy?
Tak. Każda lekcja Python Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.
Wszystkie lekcje w tym kursie
- Podstawy modułu logging
- Handlery, formatery i filtry
- Logowanie strukturalne
- Debugowanie za pomocą pdb