Python Academy · leksjon

Strukturert logging

Send ut logger formatert som JSON for maskinlesbare data.

Leksjon 3 av 413 trinn

Strukturert logging er en gratis leksjon i Python Academy på CoddyKit. Dette er leksjon 3 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i Python Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i Python Academy inneholder totalt 4 leksjoner.

Hva er strukturert logging?

Strukturert logging sender loggoppføringer som maskinlesbare data (JSON) i stedet for fri tekst, slik at de blir enkle å indeksere, søke i og bruke til varsling.

import logging, json

def log_json(level, msg, **kw):
    record = {"level": level, "msg": msg, **kw}
    print(json.dumps(record))

log_json("INFO", "Request received", path="/api/users", method="GET")

Egendefinert JSON-formaterer

Lag en underklasse av logging.Formatter for å sende JSON i stedet for ren tekst.

import logging, json

class JSONFormatter(logging.Formatter):
    def format(self, record):
        return json.dumps({
            "time": self.formatTime(record),
            "level": record.levelname,
            "name": record.name,
            "msg": record.getMessage(),
        })

handler = logging.StreamHandler()
handler.setFormatter(JSONFormatter())
logging.getLogger().addHandler(handler)

python-json-logger

Pakken python-json-logger tilbyr en ferdig JSON-formaterer med standardfelter og ekstra felter.

# pip install python-json-logger
import logging
from pythonjsonlogger import jsonlogger

logger = logging.getLogger()
handler = logging.StreamHandler()
handler.setFormatter(jsonlogger.JsonFormatter())
logger.addHandler(handler)
logger.info("User created", extra={"user_id": 42})

structlog

structlog er et populært tredjepartsbibliotek som skiller akkumulering av kontekst fra formatering og støtter prosessorpipelines.

# pip install structlog
import structlog

log = structlog.get_logger()
log = log.bind(request_id="abc123")
log.info("payment_processed", amount=49.99, currency="USD")

Knytte kontekst med structlog

structlog lar Dem knytte nøkkel-verdi-par til en logger, og disse følger med i alle etterfølgende kall.

import structlog

log = structlog.get_logger().bind(
    service="auth",
    env="prod"
)
log.warning("login_failed", user="alice", reason="bad_password")
# {service:auth, env:prod, user:alice, reason:bad_password}

Legge til tidsstempler og informasjon om kalleren

Prosessorer kan berike loggoppføringer automatisk. Legg til TimeStamper og CallsiteParameterAdder i hver loggoppføring.

import structlog

structlog.configure(
    processors=[
        structlog.processors.TimeStamper(fmt="iso"),
        structlog.processors.CallsiteParameterAdder([structlog.processors.CallsiteParameter.FILENAME]),
        structlog.processors.JSONRenderer(),
    ]
)

Logge forespørsels-ID-er i webapper

I et web-rammeverk bør De knytte en forespørsels-ID i starten av hver forespørsel, slik at hver logglinje under forespørselen inneholder den.

import structlog

def middleware(request, call_next):
    req_id = request.headers.get("X-Request-Id", generate_id())
    log = structlog.get_logger().bind(request_id=req_id)
    log.info("request_started", path=request.url.path)
    response = call_next(request)
    log.info("request_finished", status=response.status_code)
    return response

ECS-loggformat

Elastic Common Schema (ECS) er et standardisert JSON-loggformat som brukes av Elastic Stack. Bruk ecs-logging for Python.

# pip install ecs-logging
import logging
import ecs_logging

logger = logging.getLogger("app")
handler = logging.StreamHandler()
handler.setFormatter(ecs_logging.StdlibFormatter())
logger.addHandler(handler)
logger.info("Event logged in ECS format")

Systemer for loggaggregering

Strukturerte JSON-logger flyter naturlig inn i aggregeringsverktøy: Elasticsearch/Kibana (ELK), Grafana Loki, Datadog og AWS CloudWatch Logs Insights.

# Loki query example:
# {app="myservice"} | json | level="ERROR"

# CloudWatch Insights:
# fields @timestamp, level, msg
# | filter level = "ERROR"
# | sort @timestamp desc

Unngå personopplysninger i logger

Fjern personlig identifiserbar informasjon før logging. Bruk et egendefinert prosessor eller filter for å maskere e-postadresser, tokens og passord.

import re

def mask_pii(_, __, event_dict):
    msg = event_dict.get("event", "")
    event_dict["event"] = re.sub(
        r"[\w.+-]+@[\w-]+\.[\w.]+", "***@***.***", msg
    )
    return event_dict

Avveininger mellom strukturerte og ustrukturerte logger

Strukturerte logger er enkle å søke i og bruke til varsling, men de er ordrike. Kombiner strukturert logging i produksjon med menneskelesbar formatering i utvikling ved hjelp av miljøbasert konfigurasjon.

import structlog, os

if os.getenv("ENV") == "production":
    renderer = structlog.processors.JSONRenderer()
else:
    renderer = structlog.dev.ConsoleRenderer()

structlog.configure(processors=[renderer])

Hurtigsjekk

Hva er den viktigste fordelen med JSON-strukturerte logger sammenlignet med logger i ren tekst?

Oppsummering

Strukturert logging sender nøkkel-verdi-baserte JSON-loggoppføringer. Bruk en JSONFormatter, python-json-logger eller structlog. Knytt kontekst (forespørsels-ID, bruker) i starten av en operasjon, slik at hver logglinje under operasjonen inneholder konteksten.

Gratis å komme i gang

Lær deg Python med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
76
Leksjoner
320

Ofte stilte spørsmål

Er leksjonen «Strukturert logging» gratis?

Ja – hele teksten i «Strukturert logging» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av Python Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i Python Academy inneholder totalt 4 leksjoner.

Hva lærer jeg i «Strukturert logging»?

Send ut logger formatert som JSON for maskinlesbare data. Du øver på Python Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med Python Academy?

Ingen tidligere erfaring er nødvendig. Python Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 3 av 4.

Hvor lang tid tar leksjonen «Strukturert logging»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne Python Academy-leksjonen?

Ja. Alle Python Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. Grunnleggende om logging-modulen
  2. Håndterere, formatterere og filtre
  3. Strukturert logging
  4. Feilsøking med pdb
← Tilbake til Python Academy