การบันทึกแบบมีโครงสร้าง
ส่งบันทึกที่จัดรูปแบบเป็น 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- พื้นฐานโมดูล logging
- ตัวจัดการ ตัวจัดรูปแบบ และตัวกรอง
- การบันทึกแบบมีโครงสร้าง
- การแก้จุดบกพร่องด้วย pdb