1. Pythonのloggingモジュールとは
โมดูล logging
ของ Python เป็นเครื่องมือมาตรฐานสำหรับบันทึกสถานะการทำงานของโปรแกรมและข้อมูลข้อผิดพลาด เพื่อใช้ในการดีบั๊กและการตรวจสอบระหว่างการใช้งาน ความแตกต่างจากคำสั่ง print
คือ โมดูล logging
มีฟังก์ชันที่หลากหลายกว่า สามารถควบคุมระดับการบันทึก ปลายทางการส่งออก และรูปแบบได้อย่างละเอียด สิ่งนี้ช่วยให้นักพัฒนาสามารถเข้าใจความผิดปกติหรือสถานะของโปรแกรมได้อย่างมีประสิทธิภาพ
ประเภทและการใช้งานของระดับการบันทึก (Log Level)
- DEBUG: ข้อมูลดีบั๊กโดยละเอียด ส่วนใหญ่ใช้ในขั้นตอนการพัฒนา
- INFO: ข้อมูลการทำงานทั่วไป ใช้เพื่อยืนยันการทำงานที่ปกติ
- WARNING: ปัญหาเล็กน้อยหรือข้อควรระวัง ไม่ส่งผลกระทบต่อการทำงานของโปรแกรม แต่บ่งชี้ถึงปัญหาที่อาจเกิดขึ้น
- ERROR: ข้อความแสดงข้อผิดพลาดเมื่อฟังก์ชันบางส่วนทำงานไม่ถูกต้อง บ่งชี้ถึงสถานการณ์ที่การทำงานของโปรแกรมมีปัญหา
- CRITICAL: ข้อผิดพลาดร้ายแรง บ่งชี้ถึงปัญหาที่ทำให้โปรแกรมทั้งหมดไม่สามารถทำงานต่อไปได้
การใช้ระดับการบันทึกแต่ละระดับอย่างเหมาะสมจะช่วยปรับปรุงคุณภาพของข้อมูลที่ได้รับจากบันทึก ทำให้การดีบั๊กและการตรวจสอบมีประสิทธิภาพมากขึ้น
2. วิธีใช้งาน logging เบื้องต้น
มาดูวิธีการพื้นฐานในการส่งออกบันทึกโดยใช้โมดูล logging
กันครับ/ค่ะ
import logging
# ログレベルとフォーマットを設定
logging.basicConfig(level=logging.DEBUG, format='%(asctime)s - %(levelname)s - %(message)s')
# 各レベルでのログ出力
logging.debug('デバッグ情報: 詳細な診断情報')
logging.info('情報メッセージ: 正常な動作の確認')
logging.warning('警告メッセージ: 注意が必要な状態')
logging.error('エラーメッセージ: 問題が発生')
logging.critical('クリティカルメッセージ: システムの停止')
ด้วย logging.basicConfig()
เราสามารถตั้งค่าปลายทางการส่งออกบันทึก (ค่าเริ่มต้นคือ standard output), ระดับการบันทึก, และรูปแบบ ในตัวอย่างข้างต้น เนื่องจากตั้งค่า level=logging.DEBUG
ไว้ บันทึกทั้งหมดที่มีระดับตั้งแต่ DEBUG ขึ้นไปจะถูกส่งออก
3. การปรับแต่งปลายทางการส่งออกและรูปแบบของบันทึก
เรายังสามารถเปลี่ยนปลายทางการส่งออกเริ่มต้น หรือปรับแต่งรูปแบบของบันทึกได้ ตัวอย่างเช่น หากต้องการส่งออกบันทึกไปยังไฟล์ สามารถใช้ FileHandler
ได้
การส่งออกไปยังไฟล์และรูปแบบ
import logging
# ファイルハンドラの設定
file_handler = logging.FileHandler('app.log')
formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
file_handler.setFormatter(formatter)
# ロガーの設定
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
logger.addHandler(file_handler)
# ログの出力
logger.debug('ファイルへのデバッグ情報')
logger.info('ファイルへの情報メッセージ')
ในโค้ดข้างต้น ใช้ FileHandler
เพื่อส่งออกบันทึกไปยัง app.log
ข้อความบันทึกจะถูกเขียนลงไปตามรูปแบบที่ระบุโดย Formatter
4. การหมุนเวียนไฟล์บันทึก (Log File Rotation)
สำหรับการใช้งานในระยะยาว การหมุนเวียนไฟล์บันทึกเป็นสิ่งสำคัญเพื่อให้ไฟล์บันทึกไม่ใหญ่เกินไป การใช้ RotatingFileHandler
ช่วยให้สามารถควบคุมขนาดและจำนวนไฟล์บันทึกได้
ตัวอย่างการใช้ RotatingFileHandler
import logging
from logging.handlers import RotatingFileHandler
# ローテーションハンドラの設定
handler = RotatingFileHandler('app.log', maxBytes=5000, backupCount=3)
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
# ロガーの設定
logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
logger.addHandler(handler)
# ログの出力
for i in range(100):
logger.debug(f'ローテーションテスト {i}')
ในโค้ดนี้ ตั้งค่าขนาดสูงสุดของไฟล์บันทึกเป็น 5000 ไบต์ด้วย maxBytes
และตั้งค่าจำนวนไฟล์สำรองเป็น 3 ไฟล์ด้วย backupCount
เมื่อไฟล์บันทึกมีขนาดเกินที่กำหนด จะเขียนบันทึกไปยังไฟล์ใหม่ และสำรองไฟล์เก่าไว้

5. การส่งออกไฟล์ตามระดับการบันทึก
การส่งออกบันทึกตามระดับการบันทึกที่แตกต่างกันไปยังไฟล์คนละไฟล์ จะช่วยปรับปรุงความสามารถในการอ่านและการวิเคราะห์บันทึกให้มีประสิทธิภาพมากขึ้น สามารถทำได้โดยใช้ตัวกรองแบบกำหนดเอง (custom filter) และ FileHandler
หลายตัว
ตัวอย่างการส่งออกไฟล์ตามระดับการบันทึก
import logging
class ErrorFilter(logging.Filter):
def filter(self, record):
return record.levelno == logging.ERROR
# ERRORレベルのログを別ファイルに出力
error_handler = logging.FileHandler('error.log')
error_handler.setLevel(logging.ERROR)
error_handler.addFilter(ErrorFilter())
error_handler.setFormatter(formatter)
# ロガーの設定
logger.addHandler(error_handler)
# ログの出力
logger.error('ERRORレベルのログがファイルに出力されます')
ในตัวอย่างนี้ สร้างคลาส ErrorFilter
เพื่อกรองเฉพาะบันทึกระดับ ERROR และส่งออกไปยัง error.log
ด้วยวิธีนี้ เราสามารถแยกบันทึกข้อผิดพลาดไปยังไฟล์อื่นได้
6. แนวทางปฏิบัติที่ดีและข้อควรระวัง
เพื่อให้ใช้งานบันทึกได้อย่างเหมาะสม ควรพิจารณาแนวทางปฏิบัติที่ดีและข้อควรระวังดังต่อไปนี้
การใช้ระดับการบันทึกอย่างเหมาะสม
- ในระหว่างการพัฒนา ควรใช้ระดับ
DEBUG
เพื่อบันทึกข้อมูลโดยละเอียด และเมื่อนำไปใช้งานจริง ควรเปลี่ยนไปใช้ระดับINFO
หรือWARNING
เพื่อบันทึกเฉพาะข้อมูลที่สำคัญ - การส่งออกบันทึกที่มากเกินไปอาจทำให้ประสิทธิภาพลดลงได้ ดังนั้น ควรบันทึกเฉพาะข้อมูลที่จำเป็นเท่านั้น
ความปลอดภัยและความเป็นส่วนตัวของบันทึก
- ควรระมัดระวังไม่ให้บันทึกข้อมูลส่วนบุคคลหรือข้อมูลที่เป็นความลับลงในบันทึก หากจำเป็นต้องบันทึก ควรมีมาตรการเช่น การปกปิดข้อมูล (masking)
- ไฟล์บันทึกควรมีการตั้งค่าสิทธิ์ที่เหมาะสม เพื่อป้องกันการเข้าถึงโดยไม่ได้รับอนุญาต
7. สรุป
โมดูล logging
เป็นประโยชน์อย่างยิ่งในการบันทึกสถานะการทำงานของโปรแกรมอย่างมีประสิทธิภาพ และช่วยในการดีบั๊กและการใช้งาน การตั้งค่าระดับการบันทึก ปลายทางการส่งออก รูปแบบ การหมุนเวียน ฯลฯ อย่างเหมาะสม และการทำความเข้าใจสถานะการทำงานของโปรแกรมอย่างละเอียด จะช่วยให้สามารถค้นหาและแก้ไขปัญหาได้อย่างรวดเร็ว ควรนำแนวทางปฏิบัติที่ดีไปใช้ และจัดการบันทึกอย่างเหมาะสม