Handlery, formatery i filtry
Proszę kierować dane wyjściowe logów do plików, strumieni i niestandardowych miejsc docelowych.
Handlery, formatery i filtry to bezpłatna lekcja Python Academy na CoddyKit. To lekcja 2 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.
Handlery kierują rekordy logów
Handler wysyła rekordy logów do miejsca docelowego: konsoli, pliku, punktu końcowego HTTP itd. Jeden logger może mieć wiele handlerów.
import logging
logger = logging.getLogger("myapp")
logger.setLevel(logging.DEBUG)
sh = logging.StreamHandler()
logger.addHandler(sh)
logger.info("Goes to console")StreamHandler
StreamHandler zapisuje do strumienia (domyślnie sys.stderr). Przekaż sys.stdout, aby kierować dane wyjściowe do stdout.
import logging, sys
logger = logging.getLogger("out")
handler = logging.StreamHandler(sys.stdout)
logger.addHandler(handler)
logger.warning("printed to stdout")FileHandler
FileHandler dopisuje rekordy do pliku. Użyj mode="w", aby nadpisywać plik przy każdym uruchomieniu.
import logging
logging.basicConfig(
filename="app.log",
filemode="a",
level=logging.INFO,
format="%(asctime)s %(levelname)s %(message)s"
)
logging.info("Persisted to disk")RotatingFileHandler
Automatycznie obracaj pliki logów po przekroczeniu limitu rozmiaru, zachowując N plików kopii zapasowych.
from logging.handlers import RotatingFileHandler
import logging
handler = RotatingFileHandler(
"app.log", maxBytes=1_000_000, backupCount=5
)
logging.getLogger().addHandler(handler)TimedRotatingFileHandler
Obracaj pliki logów zgodnie z harmonogramem czasowym — codziennie, co tydzień lub co godzinę — co jest idealne w przypadku długo działających usług.
from logging.handlers import TimedRotatingFileHandler
import logging
handler = TimedRotatingFileHandler(
"app.log", when="midnight", backupCount=7
)
logging.getLogger().addHandler(handler)Formatery
Formatter kontroluje układ tekstu każdego rekordu logu. Dołącz go do handlera za pomocą handler.setFormatter().
import logging
fmt = logging.Formatter(
fmt="%(asctime)s %(levelname)-8s %(name)s — %(message)s",
datefmt="%Y-%m-%dT%H:%M:%S"
)
handler = logging.StreamHandler()
handler.setFormatter(fmt)
logging.getLogger().addHandler(handler)Filtrowanie na poziomie handlera
Każdy handler ma własny poziom. Rekord musi przejść zarówno przez poziom loggera, jak i poziom handlera, aby został wyemitowany.
import logging
logger = logging.getLogger("app")
logger.setLevel(logging.DEBUG) # logger passes DEBUG+
err_handler = logging.FileHandler("errors.log")
err_handler.setLevel(logging.ERROR) # only ERROR+
logger.addHandler(err_handler)Własne filtry
Utwórz podklasę logging.Filter i przesłoń filter(record), aby akceptować lub odrzucać rekordy według dowolnego kryterium.
import logging
class SensitiveFilter(logging.Filter):
def filter(self, record):
return "password" not in record.getMessage().lower()
handler = logging.StreamHandler()
handler.addFilter(SensitiveFilter())
logging.getLogger().addHandler(handler)Dodawanie dodatkowych pól za pomocą filtra
Filtry mogą również modyfikować rekord, aby wstrzyknąć dodatkowe pola (np. identyfikator żądania) przed sformatowaniem.
import logging
class RequestIDFilter(logging.Filter):
def __init__(self, request_id):
self.request_id = request_id
def filter(self, record):
record.request_id = self.request_id
return True
# fmt: "%(request_id)s %(message)s"Wiele handlerów jednego loggera
Dodaj kilka handlerów, aby jednocześnie wysyłać te same rekordy logów do wielu miejsc docelowych.
import logging
logger = logging.getLogger("multi")
logger.addHandler(logging.StreamHandler()) # console
logger.addHandler(logging.FileHandler("audit.log")) # file
logger.setLevel(logging.INFO)
logger.info("Both destinations receive this")Wyłączanie propagacji
Ustaw logger.propagate = False, aby zatrzymać przekazywanie rekordów do głównego loggera i zapobiec ich podwójnemu logowaniu.
import logging
logger = logging.getLogger("mylib")
logger.propagate = False # stays here, does not reach root
logger.addHandler(logging.StreamHandler())Szybkie sprawdzenie
Jaka metoda dołącza Formatter do Handler?
Podsumowanie
Handlery kierują rekordy; formatery nadają im formę; filtry wybiórczo je przepuszczają lub blokują. Używaj RotatingFileHandler do logów z limitem rozmiaru i TimedRotatingFileHandler do rotacji opartej na dacie.
Często zadawane pytania
Czy lekcja „Handlery, formatery i filtry” jest bezpłatna?
Tak — pełny tekst „Handlery, formatery i filtry” 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 „Handlery, formatery i filtry”?
Proszę kierować dane wyjściowe logów do plików, strumieni i niestandardowych miejsc docelowych. Ć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 2 z 4.
Ile czasu zajmuje lekcja „Handlery, formatery i filtry”?
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