0Pricing
Python Academy · บทเรียน

ตัวจัดการ ตัวจัดรูปแบบ และตัวกรอง

กำหนดเส้นทางผลลัพธ์การบันทึกไปยังไฟล์ สตรีม และปลายทางแบบกำหนดเอง

ตัวจัดการ ตัวจัดรูปแบบ และตัวกรอง เป็นบทเรียน Python Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Python Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Python Academy มีบทเรียนทั้งหมด 4 บทเรียน

ตัวจัดการกำหนดเส้นทางระเบียนบันทึก

ตัวจัดการจะส่งระเบียนบันทึกไปยังปลายทาง เช่น คอนโซล ไฟล์ จุดปลายทาง HTTP และอื่น ๆ ตัวบันทึกหนึ่งตัวสามารถมีตัวจัดการหลายตัวได้

import logging

logger = logging.getLogger("myapp")
logger.setLevel(logging.DEBUG)

sh = logging.StreamHandler()
logger.addHandler(sh)

logger.info("Goes to console")

StreamHandler

StreamHandler จะเขียนลงในสตรีม (ค่าเริ่มต้นคือ sys.stderr) ส่ง sys.stdout เพื่อส่งเอาต์พุตไปยัง stdout

import logging, sys

logger = logging.getLogger("out")
handler = logging.StreamHandler(sys.stdout)
logger.addHandler(handler)
logger.warning("printed to stdout")

FileHandler

FileHandler จะเพิ่มระเบียนต่อท้ายไฟล์ ใช้ mode="w" เพื่อเขียนทับทุกครั้งที่เรียกใช้

import logging

logging.basicConfig(
    filename="app.log",
    filemode="a",
    level=logging.INFO,
    format="%(asctime)s %(levelname)s %(message)s"
)
logging.info("Persisted to disk")

RotatingFileHandler

หมุนเวียนไฟล์บันทึกโดยอัตโนมัติเมื่อมีขนาดเกินขีดจำกัด พร้อมเก็บไฟล์สำรองไว้ N ไฟล์

from logging.handlers import RotatingFileHandler
import logging

handler = RotatingFileHandler(
    "app.log", maxBytes=1_000_000, backupCount=5
)
logging.getLogger().addHandler(handler)

TimedRotatingFileHandler

หมุนเวียนไฟล์บันทึกตามกำหนดเวลา — รายวัน รายสัปดาห์ หรือรายชั่วโมง — เหมาะสำหรับบริการที่ทำงานต่อเนื่องเป็นเวลานาน

from logging.handlers import TimedRotatingFileHandler
import logging

handler = TimedRotatingFileHandler(
    "app.log", when="midnight", backupCount=7
)
logging.getLogger().addHandler(handler)

ตัวจัดรูปแบบ

Formatter ควบคุมเค้าโครงข้อความของระเบียนบันทึกแต่ละรายการ แนบเข้ากับตัวจัดการด้วย handler.setFormatter()

import logging

fmt = logging.Formatter(
    fmt="%(asctime)s %(levelname)-8s %(name)s — %(message)s",
    datefmt="%Y-%m-%dT%H:%M:%S"
)
handler = logging.StreamHandler()
handler.setFormatter(fmt)
logging.getLogger().addHandler(handler)

การกรองระดับตัวจัดการ

ตัวจัดการแต่ละตัวมีระดับของตนเอง ระเบียนจะถูกส่งออกได้ก็ต่อเมื่อผ่านทั้งระดับของตัวบันทึกและระดับของตัวจัดการ

import logging

logger = logging.getLogger("app")
logger.setLevel(logging.DEBUG)   # logger passes DEBUG+

err_handler = logging.FileHandler("errors.log")
err_handler.setLevel(logging.ERROR)  # only ERROR+
logger.addHandler(err_handler)

ตัวกรองแบบกำหนดเอง

สร้างคลาสย่อยของ logging.Filter และเขียนทับ filter(record) เพื่อยอมรับหรือปฏิเสธระเบียนตามเกณฑ์ใดก็ได้

import logging

class SensitiveFilter(logging.Filter):
    def filter(self, record):
        return "password" not in record.getMessage().lower()

handler = logging.StreamHandler()
handler.addFilter(SensitiveFilter())
logging.getLogger().addHandler(handler)

การเพิ่มฟิลด์พิเศษด้วยตัวกรอง

ตัวกรองยังสามารถเปลี่ยนแปลงระเบียนเพื่อแทรกฟิลด์เพิ่มเติมได้ เช่น รหัสคำขอ ก่อนการจัดรูปแบบ

import logging

class RequestIDFilter(logging.Filter):
    def __init__(self, request_id):
        self.request_id = request_id
    def filter(self, record):
        record.request_id = self.request_id
        return True

# fmt: "%(request_id)s %(message)s"

ตัวจัดการหลายตัวในตัวบันทึกเดียว

เพิ่มตัวจัดการหลายตัวเพื่อส่งระเบียนบันทึกเดียวกันไปยังปลายทางหลายแห่งพร้อมกัน

import logging

logger = logging.getLogger("multi")
logger.addHandler(logging.StreamHandler())             # console
logger.addHandler(logging.FileHandler("audit.log"))   # file
logger.setLevel(logging.INFO)
logger.info("Both destinations receive this")

การปิดการส่งต่อ

ตั้งค่า logger.propagate = False เพื่อหยุดไม่ให้ระเบียนไหลขึ้นไปยังตัวบันทึกรากและถูกบันทึกซ้ำ

import logging

logger = logging.getLogger("mylib")
logger.propagate = False   # stays here, does not reach root
logger.addHandler(logging.StreamHandler())

ตรวจสอบอย่างรวดเร็ว

เมธอดใดใช้แนบ Formatter เข้ากับ Handler

สรุปทบทวน

ตัวจัดการกำหนดเส้นทางระเบียน ตัวจัดรูปแบบกำหนดรูปแบบ และตัวกรองคัดเลือกว่าจะส่งผ่านหรือบล็อกระเบียน ใช้ RotatingFileHandler สำหรับบันทึกที่จำกัดด้วยขนาด และ TimedRotatingFileHandler สำหรับการหมุนเวียนตามวันที่

คำถามที่พบบ่อย

บทเรียน “ตัวจัดการ ตัวจัดรูปแบบ และตัวกรอง” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “ตัวจัดการ ตัวจัดรูปแบบ และตัวกรอง” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Python Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Python Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “ตัวจัดการ ตัวจัดรูปแบบ และตัวกรอง”

กำหนดเส้นทางผลลัพธ์การบันทึกไปยังไฟล์ สตรีม และปลายทางแบบกำหนดเอง คุณปฏิบัติ Python Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Python Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Python Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน

บทเรียน “ตัวจัดการ ตัวจัดรูปแบบ และตัวกรอง” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Python Academy นี้ได้ไหม

ได้ บทเรียน Python Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. พื้นฐานโมดูล logging
  2. ตัวจัดการ ตัวจัดรูปแบบ และตัวกรอง
  3. การบันทึกแบบมีโครงสร้าง
  4. การแก้จุดบกพร่องด้วย pdb
← กลับไปที่ Python Academy