Python Academy · Oppitunti

Rakenteinen lokitus

Tuottakaa JSON-muotoisia lokeja koneellisesti luettavaa tulostetta varten.

Oppitunti 3/413 vaihetta

Rakenteinen lokitus on ilmainen Python Academy-oppitunti CoddyKitissä. Tämä on oppitunti 3/4. Voit lukea koko oppitunnin alta ilmaiseksi ja harjoitella sen jälkeen käytännössä selaimessa sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla. Oppitunti kuuluu Python Academy-oppimispolkuun, ja edistymisesi synkronoituu verkon ja CoddyKit-sovelluksen välillä. Python Academy-kurssilla on yhteensä 4 oppituntia.

Mitä jäsennelty lokitus on?

Jäsennelty lokitus tuottaa lokitietueet koneellisesti luettavina tietoina, kuten JSON-muodossa, vapaamuotoisen tekstin sijaan. Näin niitä on helppo indeksoida, hakea ja käyttää hälytysten perustana.

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

Mukautettu JSON-muotoilija

Perikää logging.Formatter, jotta tuloste tuotetaan JSON-muodossa tavallisen tekstin sijaan.

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

python-json-logger-paketti tarjoaa valmiin JSON-muotoilijan vakiokentillä ja lisäkentillä.

# 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 on suosittu kolmannen osapuolen kirjasto, joka erottaa kontekstin keräämisen muotoilusta ja tukee prosessoriputkia.

# pip install structlog
import structlog

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

Kontekstin sitominen structlogilla

structlogin avulla voitte sitoa avain–arvo-pareja lokittimeen, jolloin ne kulkevat mukana kaikissa seuraavissa kutsuissa.

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}

Aikaleimojen ja kutsujan tietojen lisääminen

Prosessorit voivat rikastaa tietueita automaattisesti. Lisätkää TimeStamper ja CallsiteParameterAdder jokaiseen lokitietueeseen.

import structlog

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

Pyyntötunnisteiden lokitus verkkosovelluksissa

Verkkokehyksessä sitokaa pyyntötunniste jokaisen pyynnön alussa, jotta jokainen pyynnön aikana kirjattu lokirivi sisältää sen.

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-lokimuoto

Elastic Common Schema (ECS) on Elastic Stackin käyttämä vakiomuotoinen JSON-lokimuoto. Käyttäkää Pythonissa ecs-logging-pakettia.

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

Lokien koontijärjestelmät

Jäsennellyt JSON-lokit siirtyvät luontevasti koontityökaluihin, kuten Elasticsearch/Kibana (ELK), Grafana Loki, Datadog ja AWS CloudWatch Logs Insights.

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

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

Henkilötietojen välttäminen lokeissa

Poistakaa henkilötiedot ennen lokitusta. Käyttäkää mukautettua prosessoria tai suodatinta sähköpostiosoitteiden, tunnusten ja salasanojen peittämiseen.

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

Jäsennellyn ja jäsentämättömän lokituksen kompromissit

Jäsennellyistä lokeista on helppo hakea tietoja ja luoda hälytyksiä, mutta ne ovat runsassanaisia. Yhdistäkää tuotannossa jäsennelty lokitus ja kehityksessä ihmisille luettava muoto ympäristöön perustuvalla määrityksellä.

import structlog, os

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

structlog.configure(processors=[renderer])

Pikatarkistus

Mikä on JSON-muotoisten jäsenneltyjen lokien tärkein etu tavalliseen tekstimuotoon verrattuna?

Kertaus

Jäsennelty lokitus tuottaa avain–arvo-pareja sisältäviä JSON-tietueita. Käyttäkää JSONFormatter-muotoilijaa, python-json-logger-pakettia tai structlog-kirjastoa. Sitokaa konteksti, kuten pyyntötunniste tai käyttäjä, toiminnon alussa, jotta jokainen sen aikana kirjattu lokirivi sisältää kontekstin.

Aloita maksutta

Opi Python tekoälytuutorin avulla — ilmaiseksi

Kirjoita ja suorita oikeaa koodia selaimessa, saa välitöntä apua tekoälytuutorilta ympäri vuorokauden ja jatka siitä, mihin jäit, verkossa tai sovelluksessa.

Kurssit
76
Oppitunnit
320

Usein kysytyt kysymykset

Onko oppitunti ”Rakenteinen lokitus” ilmainen?

Kyllä – oppitunnin ”Rakenteinen lokitus” koko tekstin voi lukea täällä verkossa ilmaiseksi. Jos haluat harjoitella interaktiivisesti sisäänrakennetulla koodieditorilla ja ympäri vuorokauden käytettävissä olevan tekoälytuutorin avulla sekä avata koko Python Academy-kurssin, päivitä CoddyKit PROhon. Python Academy-kurssilla on yhteensä 4 oppituntia.

Mitä opin oppitunnilla ”Rakenteinen lokitus”?

Tuottakaa JSON-muotoisia lokeja koneellisesti luettavaa tulostetta varten. Harjoittelet Python Academy-aihetta koodilla, jonka suoritat suoraan selaimessa. Ympäri vuorokauden käytettävissä oleva tekoälytuutori vastaa kysymyksiisi oppitunnin aikana.

Tarvitsenko kokemusta aloittaakseni Python Academy-opiskelun?

Aiempi kokemus ei ole tarpeen. CoddyKitin Python Academy-oppimispolku sopii vasta-alkajista edistyneisiin, joten voit aloittaa tästä tai alusta ja edetä omaan tahtiisi. Tämä on oppitunti 3/4.

Kuinka kauan ”Rakenteinen lokitus”-oppitunnin suorittaminen kestää?

Useimmat CoddyKitin oppitunnit kestävät noin 5–10 minuuttia. Jokainen oppitunti on lyhyt ja interaktiivinen, joten edistyt tasaisesti ja voit jatkaa siitä, mihin jäit – sekä verkossa että sovelluksessa.

Voinko kirjoittaa ja suorittaa koodia tällä Python Academy-oppitunnilla?

Kyllä. Jokainen Python Academy-oppitunti sisältää sisäänrakennetun koodieditorin, joten voit kirjoittaa ja suorittaa oikeaa koodia suoraan selaimessa ja saada välitöntä palautetta tekoälyltä – paikallista asennusta ei tarvita.

Kaikki tämän kurssin oppitunnit

  1. logging-moduulin perusteet
  2. Käsittelijät, muotoilijat ja suodattimet
  3. Rakenteinen lokitus
  4. Virheenkorjaus pdb:llä
← Takaisin: Python Academy