Strukturert logging
Send ut logger formatert som JSON for maskinlesbare data.
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 responseECS-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 descUnngå 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_dictAvveininger 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.
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
- Grunnleggende om logging-modulen
- Håndterere, formatterere og filtre
- Strukturert logging
- Feilsøking med pdb