On this page
Logging (เลิก print debug)
บันทึกสิ่งที่โปรแกรมทำด้วย logging — ควบคุมระดับ เปิด/ปิด และเขียนลงไฟล์ได้ ต่างจาก print
มือใหม่ debug ด้วย print() แล้วลบทิ้งทีหลัง แต่ในงานจริงเราต้องการบันทึกถาวรที่เปิด/ปิด/กรองระดับได้ และเขียนลงไฟล์ในระบบ production — นั่นคือหน้าที่ของโมดูล logging
ทำไม print ไม่พอ
| ประเด็น | logging | |
|---|---|---|
| ระดับความสำคัญ | ไม่มี | DEBUG/INFO/WARNING/ERROR/CRITICAL |
| เปิด/ปิดได้ | ต้องลบโค้ด | ปรับ level ทีเดียว |
| เขียนลงไฟล์ | ต้องเขียนเอง | ตั้งค่าได้ |
| บอกเวลา/ที่มา | ไม่มี | ใส่ใน format ได้ |
ระดับของ log (Levels)
log มี 5 ระดับเรียงตามความรุนแรง การตั้ง level = X หมายถึงแสดงตั้งแต่ X ขึ้นไป (ต่ำกว่านั้นถูกซ่อน)
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 และเขียนลงไฟล์
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 อัตโนมัติ
import logging
logger = logging.getLogger(__name__) # logger ประจำ module นี้
def process(data):
try:
return 100 / data
except ZeroDivisionError:
logger.exception("process ล้มเหลว") # log พร้อม traceback
raiselogger.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 หายไป