Python logging: คู่มือฉบับสมบูรณ์เพื่อการบันทึกและจัดการ Log ในโปรแกรม Python

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 เมื่อไฟล์บันทึกมีขนาดเกินที่กำหนด จะเขียนบันทึกไปยังไฟล์ใหม่ และสำรองไฟล์เก่าไว้

RUNTEQ(ランテック)|超実戦型エンジニア育成スクール

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 เป็นประโยชน์อย่างยิ่งในการบันทึกสถานะการทำงานของโปรแกรมอย่างมีประสิทธิภาพ และช่วยในการดีบั๊กและการใช้งาน การตั้งค่าระดับการบันทึก ปลายทางการส่งออก รูปแบบ การหมุนเวียน ฯลฯ อย่างเหมาะสม และการทำความเข้าใจสถานะการทำงานของโปรแกรมอย่างละเอียด จะช่วยให้สามารถค้นหาและแก้ไขปัญหาได้อย่างรวดเร็ว ควรนำแนวทางปฏิบัติที่ดีไปใช้ และจัดการบันทึกอย่างเหมาะสม

侍エンジニア塾