0Pricing
Python Academy · บทเรียน

การบันทึกแบบมีโครงสร้าง

ส่งบันทึกที่จัดรูปแบบเป็น JSON เพื่อให้เครื่องอ่านผลลัพธ์ได้

การบันทึกแบบมีโครงสร้าง เป็นบทเรียน Python Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Python Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Python Academy มีบทเรียนทั้งหมด 4 บทเรียน

การบันทึกแบบมีโครงสร้างคืออะไร

การบันทึกแบบมีโครงสร้างจะส่งออกระเบียนบันทึกเป็นข้อมูลที่เครื่องอ่านได้ (JSON) แทนข้อความรูปแบบอิสระ ทำให้จัดทำดัชนี ค้นหา และตั้งการแจ้งเตือนได้ง่าย

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

ตัวจัดรูปแบบ JSON แบบกำหนดเอง

สร้างคลาสย่อยของ logging.Formatter เพื่อส่งออก JSON แทนข้อความธรรมดา

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 มีตัวจัดรูปแบบ JSON สำเร็จรูปพร้อมฟิลด์มาตรฐานและฟิลด์เพิ่มเติม

# 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 เป็นไลบรารีจากภายนอกที่ได้รับความนิยม โดยแยกการสะสมบริบทออกจากการจัดรูปแบบ และรองรับไปป์ไลน์ของตัวประมวลผล

# pip install structlog
import structlog

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

การผูกบริบทด้วย structlog

structlog ช่วยให้คุณผูกคู่คีย์-ค่ากับตัวบันทึก ซึ่งจะติดตามไปกับการเรียกใช้ครั้งต่อ ๆ ไปทั้งหมด

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}

การเพิ่มการประทับเวลาและข้อมูลผู้เรียก

ตัวประมวลผลสามารถเพิ่มข้อมูลให้ระเบียนโดยอัตโนมัติ เพิ่ม TimeStamper และ CallsiteParameterAdder ลงในระเบียนบันทึกทุกรายการ

import structlog

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

การบันทึกรหัสคำขอในแอปเว็บ

ในเฟรมเวิร์กเว็บ ให้ผูกรหัสคำขอเมื่อเริ่มต้นคำขอแต่ละรายการ เพื่อให้ทุกบรรทัดบันทึกข้อมูลระหว่างคำขอนั้นมีรหัสดังกล่าว

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

Elastic Common Schema (ECS) เป็นรูปแบบบันทึก JSON มาตรฐานที่ใช้โดย Elastic Stack ใช้ ecs-logging สำหรับ 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")

ระบบรวมบันทึกข้อมูล

บันทึก JSON แบบมีโครงสร้างจะไหลเข้าสู่เครื่องมือรวมข้อมูลได้โดยตรง ได้แก่ 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

การหลีกเลี่ยง PII ในบันทึกข้อมูล

ลบข้อมูลที่ระบุตัวบุคคลได้ก่อนบันทึกข้อมูล ใช้ตัวประมวลผลหรือตัวกรองแบบกำหนดเองเพื่อปกปิดอีเมล โทเค็น และรหัสผ่าน

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

ข้อแลกเปลี่ยนระหว่างบันทึกแบบมีโครงสร้างและไม่มีโครงสร้าง

บันทึกแบบมีโครงสร้างค้นหาและตั้งการแจ้งเตือนได้ง่าย แต่มีรายละเอียดมาก ใช้การบันทึกแบบมีโครงสร้างในสภาพแวดล้อมจริงควบคู่กับการจัดรูปแบบที่มนุษย์อ่านได้ในระหว่างการพัฒนา โดยใช้การกำหนดค่าตามสภาพแวดล้อม

import structlog, os

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

structlog.configure(processors=[renderer])

ตรวจสอบอย่างรวดเร็ว

ข้อได้เปรียบหลักของบันทึกแบบมีโครงสร้าง JSON เหนือบันทึกข้อความธรรมดาคืออะไร

สรุปทบทวน

การบันทึกแบบมีโครงสร้างจะส่งออกระเบียน JSON แบบคีย์-ค่า ใช้ JSONFormatter, python-json-logger หรือ structlog ผูกบริบท เช่น รหัสคำขอและผู้ใช้ เมื่อเริ่มต้นการทำงาน เพื่อให้ทุกบรรทัดบันทึกข้อมูลระหว่างการทำงานนั้นมีบริบทดังกล่าว

คำถามที่พบบ่อย

บทเรียน “การบันทึกแบบมีโครงสร้าง” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การบันทึกแบบมีโครงสร้าง” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Python Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Python Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การบันทึกแบบมีโครงสร้าง”

ส่งบันทึกที่จัดรูปแบบเป็น JSON เพื่อให้เครื่องอ่านผลลัพธ์ได้ คุณปฏิบัติ Python Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Python Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Python Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน

บทเรียน “การบันทึกแบบมีโครงสร้าง” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Python Academy นี้ได้ไหม

ได้ บทเรียน Python Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. พื้นฐานโมดูล logging
  2. ตัวจัดการ ตัวจัดรูปแบบ และตัวกรอง
  3. การบันทึกแบบมีโครงสร้าง
  4. การแก้จุดบกพร่องด้วย pdb
← กลับไปที่ Python Academy