Notes & software courses · Free to learn
Aph's Blog
On this page

Logging (เลิก print debug)

👋 อ่านฟรีทั้งหมดบน Aph's Blog — เนื้อหาภาษาไทย ทำตามทีละหน้าใน sidebar ได้เลย หากมีข้อเสนอแนะหรืออยากให้เพิ่มหัวข้อไหน บอกได้เสมอ

บันทึกสิ่งที่โปรแกรมทำด้วย logging — ควบคุมระดับ เปิด/ปิด และเขียนลงไฟล์ได้ ต่างจาก print

มือใหม่ debug ด้วย print() แล้วลบทิ้งทีหลัง แต่ในงานจริงเราต้องการบันทึกถาวรที่เปิด/ปิด/กรองระดับได้ และเขียนลงไฟล์ในระบบ production — นั่นคือหน้าที่ของโมดูล logging

ทำไม print ไม่พอ

ประเด็นprintlogging
ระดับความสำคัญไม่มีDEBUG/INFO/WARNING/ERROR/CRITICAL
เปิด/ปิดได้ต้องลบโค้ดปรับ level ทีเดียว
เขียนลงไฟล์ต้องเขียนเองตั้งค่าได้
บอกเวลา/ที่มาไม่มีใส่ใน format ได้

ระดับของ log (Levels)

log มี 5 ระดับเรียงตามความรุนแรง การตั้ง level = X หมายถึงแสดงตั้งแต่ X ขึ้นไป (ต่ำกว่านั้นถูกซ่อน)

python
import logging

logging.basicConfig(level=logging.DEBUG)  # แสดงตั้งแต่ DEBUG ขึ้นไป

logging.debug("รายละเอียดสำหรับ debug")     # ละเอียดสุด
logging.info("เหตุการณ์ปกติ เช่น เริ่มทำงาน")
logging.warning("เตือน แต่ยังทำงานต่อได้")
logging.error("เกิดข้อผิดพลาด")
logging.critical("ร้ายแรง ระบบอาจล่ม")
Levelใช้เมื่อ
DEBUGข้อมูลละเอียดตอนพัฒนา/หา bug
INFOเหตุการณ์ปกติ (เริ่ม/จบงาน)
WARNINGผิดปกติแต่ยังไปต่อได้
ERRORทำงานส่วนนั้นไม่สำเร็จ
CRITICALร้ายแรง ระบบอาจหยุด

ตั้งค่า format และเขียนลงไฟล์

python
import logging

logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s [%(levelname)s] %(name)s: %(message)s",
    filename="app.log",       # เขียนลงไฟล์ (ตัดออก = ขึ้นจอ)
)

logging.info("ระบบเริ่มทำงาน")
# 2026-06-01 10:00:00,123 [INFO] root: ระบบเริ่มทำงาน

logger ต่อ module + log exception

งานจริงสร้าง logger ต่อไฟล์ด้วย getLogger(__name__) เพื่อรู้ว่า log มาจากไหน และใช้ logging.exception ในบล็อก except เพื่อบันทึก traceback อัตโนมัติ

python
import logging
logger = logging.getLogger(__name__)   # logger ประจำ module นี้

def process(data):
    try:
        return 100 / data
    except ZeroDivisionError:
        logger.exception("process ล้มเหลว")   # log พร้อม traceback
        raise
logging.exception ใช้ในบล็อก except เท่านั้น

logger.exception() จะแนบ traceback ของ error ปัจจุบันให้อัตโนมัติ — เรียกได้เฉพาะตอนอยู่ใน except เท่านั้น นอกบล็อกใช้ logger.error() แทน

สรุปหัวข้อนี้

  • logging แทน print: ควบคุม level, เปิด/ปิด, เขียนลงไฟล์ได้
  • 5 levels: DEBUG < INFO < WARNING < ERROR < CRITICAL
  • ตั้ง level = X แสดงตั้งแต่ X ขึ้นไป; ตั้ง format ใส่เวลา/ที่มา
  • getLogger(__name__) ต่อ module; logger.exception() log traceback ใน except
แบบฝึกหัด

1) ตั้งค่า logging ให้แสดงตั้งแต่ INFO พร้อมเวลา 2) แปลงสคริปต์ที่ใช้ print debug ให้ใช้ logging แทน 3) เขียนฟังก์ชันที่ใช้ logger.exception() ในบล็อก except 4) ลองเปลี่ยน level เป็น WARNING แล้วสังเกตว่า debug/info หายไป