Python Academy · Lektion

Strukturerad loggning

Generera JSON-formaterade loggar för maskinläsbara utdata.

Lektion 3 av 413 steg

Strukturerad loggning är en gratis lektion i Python Academy på CoddyKit. Detta är lektion 3 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för Python Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i Python Academy innehåller totalt 4 lektioner.

Vad är strukturerad loggning?

Strukturerad loggning skickar loggposter som maskinläsbara data (JSON) i stället för fri text, vilket gör dem enkla att indexera, söka i och skapa aviseringar från.

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")

Anpassad JSON-formaterare

Skapa en subklass av logging.Formatter för att skicka JSON i stället för vanlig text.

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

Paketet python-json-logger tillhandahåller en färdig JSON-formaterare med standardfält och extra fält.

# 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 är ett populärt tredjepartsbibliotek som separerar insamling av kontext från formatering och stöder processor-pipelines.

# pip install structlog
import structlog

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

Binda kontext med structlog

structlog låter dig binda nyckel-värde-par till en logger, så att de följer med i alla efterföljande anrop.

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}

Lägga till tidsstämplar och anroparinformation

Processorer kan automatiskt berika poster. Lägg till TimeStamper och CallsiteParameterAdder i varje loggpost.

import structlog

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

Logga request-ID:n i webbappar

I ett webbramverk binder du ett request-ID i början av varje begäran, så att varje loggrad under begäran innehåller det.

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) är ett standardiserat JSON-loggformat som används av Elastic Stack. Använd ecs-logging för 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")

System för loggaggregering

Strukturerade JSON-loggar flödar naturligt in i aggregeringsverktyg: Elasticsearch/Kibana (ELK), Grafana Loki, Datadog och AWS CloudWatch Logs Insights.

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

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

Undvika PII i loggar

Rensa bort personligt identifierbar information innan den loggas. Använd en anpassad processor eller ett filter för att maskera e-postadresser, tokens och lösenord.

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

Avvägningar mellan strukturerade och ostrukturerade loggar

Strukturerade loggar är sökbara och kan användas för aviseringar, men är utförliga. Kombinera strukturerad loggning i produktion med människoläsbar formatering under utveckling genom miljöbaserad konfiguration.

import structlog, os

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

structlog.configure(processors=[renderer])

Snabbkontroll

Vilken är den främsta fördelen med JSON-strukturerade loggar jämfört med loggar i vanlig text?

Sammanfattning

Strukturerad loggning skickar JSON-poster med nyckel-värde-par. Använd en JSONFormatter, python-json-logger eller structlog. Bind kontext (request-ID, användare) i början av en åtgärd, så att varje loggrad under åtgärden innehåller kontexten.

Gratis att börja

Lär dig Python med en AI-lärare – gratis

Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.

Kurser
76
Lektioner
320

Vanliga frågor

Är lektionen ”Strukturerad loggning” gratis?

Ja – hela texten till ”Strukturerad loggning” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i Python Academy, kan Ni uppgradera till CoddyKit PRO. Kursen i Python Academy innehåller totalt 4 lektioner.

Vad lär jag mig i ”Strukturerad loggning”?

Generera JSON-formaterade loggar för maskinläsbara utdata. Ni övar på Python Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.

Behöver jag någon erfarenhet för att börja lära mig Python Academy?

Du behöver inga förkunskaper. Utbildningen i Python Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 3 av 4.

Hur lång tid tar lektionen ”Strukturerad loggning”?

De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.

Kan jag skriva och köra kod i den här Python Academy-lektionen?

Ja. Varje Python Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.

Alla lektioner i den här kursen

  1. Grunderna i modulen logging
  2. Handlers, formatters och filter
  3. Strukturerad loggning
  4. Felsökning med pdb
← Tillbaka till Python Academy