0Pricing
Python Academy · Lekcja

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

  1. Podstawy modułu logging
  2. Handlery, formatery i filtry
  3. Logowanie strukturalne
  4. Debugowanie za pomocą pdb
← Powrót do Python Academy