Python Academy · Lektion

Struktureret logging

Udsend JSON-formaterede logs, der kan læses af maskiner.

Lektion 3 af 413 trin

Struktureret logging er en gratis Python Academy-lektion på CoddyKit. Dette er lektion 3 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i Python Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Python Academy-kurset indeholder 4 lektioner i alt.

Hvad er struktureret logning?

Struktureret logning udsender logposter som maskinlæsbare data (JSON) i stedet for frit tekstformat, så de er nemme at indeksere, søge i og oprette alarmer på.

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

Brugerdefineret JSON-formatering

Opret en underklasse af logging.Formatter for at udsende JSON i stedet for almindelig 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 leverer en færdig JSON-formatering 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, der adskiller akkumulering af kontekst fra formateringen og understøtter kæder af processorer.

# pip install structlog
import structlog

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

Binding af kontekst med structlog

structlog lader dig knytte nøgleværdipar til en logger, så de følger med i alle efterfølgende kald.

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}

Tilføjelse af tidsstempler og oplysninger om kaldere

Processorer kan automatisk berige poster. Tilføj TimeStamper og CallsiteParameterAdder til hver logpost.

import structlog

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

Logning af anmodnings-id'er i webapps

I en webapplikation skal du knytte et anmodnings-id ved starten af hver anmodning, så hver loglinje under anmodningen indeholder 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-logformat

Elastic Common Schema (ECS) er et standardiseret JSON-logformat, der bruges af Elastic Stack. Brug ecs-logging til 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 til logaggregering

Strukturerede JSON-logfiler flyder naturligt ind i værktøjer til aggregering: 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

Undgå personhenførbare oplysninger i logfiler

Fjern personhenførbare oplysninger før logning. Brug en brugerdefineret processor eller et filter til at maskere e-mailadresser, tokens og adgangskoder.

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

Afvejning mellem strukturerede og ustrukturerede logfiler

Strukturerede logfiler er søgbare og kan bruges til alarmer, men de er ordrige. Kombinér struktureret logning i produktion med menneskeligt læsbar formatering under udvikling ved hjælp af miljøbaseret konfiguration.

import structlog, os

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

structlog.configure(processors=[renderer])

Hurtigt tjek

Hvad er den største fordel ved JSON-strukturerede logfiler frem for logfiler i almindelig tekst?

Opsummering

Struktureret logning udsender JSON-poster med nøgleværdier. Brug en JSONFormatter, python-json-logger eller structlog. Knyt kontekst (anmodnings-id, bruger) ved starten af en handling, så hver loglinje under handlingen indeholder konteksten.

Gratis at komme i gang

Lær Python med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
76
Lektioner
320

Ofte stillede spørgsmål

Er lektionen “Struktureret logging” gratis?

Ja — hele teksten til “Struktureret logging” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af Python Academy-kurset, skal du opgradere til CoddyKit PRO. Python Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “Struktureret logging”?

Udsend JSON-formaterede logs, der kan læses af maskiner. Du øver dig i Python Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på Python Academy?

Der kræves ingen tidligere erfaring. Python Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 3 af 4.

Hvor lang tid tager lektionen “Struktureret logging”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne Python Academy-lektion?

Ja. Alle Python Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Grundlæggende om logging-modulet
  2. Handlers, formatters og filtre
  3. Struktureret logging
  4. Fejlfinding med pdb
← Tilbage til Python Academy