Rakenteinen lokitus
Tuottakaa JSON-muotoisia lokeja koneellisesti luettavaa tulostetta varten.
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 responseECS-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 descHenkilö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_dictJä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.
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
- logging-moduulin perusteet
- Käsittelijät, muotoilijat ja suodattimet
- Rakenteinen lokitus
- Virheenkorjaus pdb:llä