Python Academy · Pelajaran

Logging Berstruktur

Keluarkan log berformat JSON untuk output yang boleh dibaca mesin.

Pelajaran 3 daripada 413 langkah

Logging Berstruktur ialah pelajaran Python Academy percuma di CoddyKit. Ini ialah pelajaran 3 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Python Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Python Academy merangkumi sejumlah 4 pelajaran.

Apakah Pengelogan Berstruktur?

Pengelogan berstruktur menghasilkan rekod pengelogan sebagai data yang boleh dibaca mesin (JSON), bukannya teks bebas, supaya mudah diindeks, dicari dan digunakan untuk amaran.

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

Pemformat JSON Tersuai

Subkelas logging.Formatter untuk menghasilkan JSON dan bukannya teks biasa.

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

Pakej python-json-logger menyediakan pemformat JSON sedia guna dengan medan standard dan tambahan.

# 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 ialah pustaka pihak ketiga yang popular, yang memisahkan pengumpulan konteks daripada pemformatan dan menyokong saluran pemprosesan.

# pip install structlog
import structlog

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

Mengikat Konteks dengan structlog

structlog membolehkan anda mengikat pasangan kunci-nilai pada pengelog supaya pasangan tersebut dibawa melalui semua panggilan seterusnya.

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}

Menambah Cap Masa dan Maklumat Pemanggil

Pemproses boleh memperkayakan rekod secara automatik. Tambahkan TimeStamper dan CallsiteParameterAdder pada setiap rekod pengelogan.

import structlog

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

Mengelog ID Permintaan dalam Aplikasi Web

Dalam rangka kerja web, ikat ID permintaan pada permulaan setiap permintaan supaya setiap baris pengelogan sepanjang permintaan itu menyertakannya.

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

Format Pengelogan ECS

Elastic Common Schema (ECS) ialah format pengelogan JSON standard yang digunakan oleh Elastic Stack. Gunakan ecs-logging untuk 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")

Sistem Pengagregatan Pengelogan

Pengelogan JSON berstruktur mengalir dengan mudah ke alat pengagregatan: Elasticsearch/Kibana (ELK), Grafana Loki, Datadog, AWS CloudWatch Logs Insights.

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

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

Mengelakkan PII dalam Pengelogan

Buang maklumat pengenalan peribadi sebelum mengelog. Gunakan pemproses atau penapis tersuai untuk menyamarkan e-mel, token dan kata laluan.

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

Pertukaran antara Pengelogan Berstruktur dan Tidak Berstruktur

Pengelogan berstruktur boleh dicari dan digunakan untuk amaran tetapi panjang. Gabungkan pengelogan berstruktur dalam pengeluaran dengan pemformatan yang boleh dibaca manusia dalam pembangunan menggunakan konfigurasi berasaskan persekitaran.

import structlog, os

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

structlog.configure(processors=[renderer])

Semakan Pantas

Apakah kelebihan utama pengelogan berstruktur JSON berbanding pengelogan teks biasa?

Imbas Kembali

Pengelogan berstruktur menghasilkan rekod JSON kunci-nilai. Gunakan JSONFormatter, python-json-logger atau structlog. Ikat konteks (ID permintaan, pengguna) pada permulaan operasi supaya setiap baris pengelogan sepanjang operasi itu membawa konteks tersebut.

Percuma untuk bermula

Pelajari Python dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
76
Pelajaran
320

Soalan Lazim

Adakah pelajaran “Logging Berstruktur” percuma?

Ya — teks penuh “Logging Berstruktur” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus Python Academy, tingkat taraf kepada CoddyKit PRO. Kursus Python Academy merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Logging Berstruktur”?

Keluarkan log berformat JSON untuk output yang boleh dibaca mesin. Anda berlatih Python Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Python Academy?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Python Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 3 daripada 4.

Berapa lamakah pelajaran “Logging Berstruktur” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Python Academy ini?

Ya. Setiap pelajaran Python Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Asas Modul logging
  2. Pengendali, Pemformat dan Penapis
  3. Logging Berstruktur
  4. Penyahpepijatan dengan pdb
← Kembali ke Python Academy