logging --- การบันทึกเหตุการณ์

โมดูลนี้ให้ชุดย่อยที่มีน้ำหนักเบาของแพ็กเกจ logging มาตรฐานของ Python ที่ปรับแต่งสำหรับ MicroPython รองรับการบันทึกแบบมีระดับผ่านออบเจ็กต์ Logger ที่ตั้งชื่อตามลำดับชั้น ตัวจัดการขนาดเล็กจำนวนหนึ่ง (StreamHandler, FileHandler) การจัดรูปแบบสไตล์ printf ผ่าน Formatter และฟังก์ชันอำนวยความสะดวกระดับโมดูลที่เทียบเท่ากับฟังก์ชันที่ทำงานบน root logger

โมดูลนี้ปฏิบัติตาม API ของ CPython ที่คุ้นเคยอย่างใกล้ชิดพอที่แอปพลิเคชันอย่างง่ายที่เขียนสำหรับไลบรารีมาตรฐานควรทำงานได้โดยไม่ต้องเปลี่ยนแปลง ไม่มีการให้บริการ Filters การล็อกหลายกระบวนการ รูปแบบไฟล์การกำหนดค่า และคลาสตัวจัดการส่วนใหญ่

ค่าคงที่ระดับ

logging.CRITICAL: int

ค่าตัวเลข 50 ใช้สำหรับข้อผิดพลาดที่ไม่สามารถกู้คืนได้

logging.ERROR: int

ค่าตัวเลข 40 ใช้สำหรับปัญหาร้ายแรง

logging.WARNING: int

ค่าตัวเลข 30 ระดับเริ่มต้นสำหรับ root logger ที่เพิ่งกำหนดค่า

logging.INFO: int

ค่าตัวเลข 20 ใช้สำหรับข้อความยืนยัน

logging.DEBUG: int

ค่าตัวเลข 10 ใช้สำหรับผลลัพธ์การวิเคราะห์ปัญหาแบบละเอียด

logging.NOTSET: int

ค่าตัวเลข 0 ระบุว่า logger ไม่มีการกำหนดระดับ (จะสืบทอดระดับที่มีผลจาก root logger หรือ WARNING)

ฟังก์ชัน

logging.getLogger(name: str | None = None) Logger

คืนค่า Logger ที่ลงทะเบียนไว้ภายใต้ name โดยสร้างขึ้นในการใช้งานครั้งแรก หาก name เป็น None จะคืนค่า root logger การเรียกครั้งแรกด้วย name="root" (หรือโดยไม่ตั้ง name) จะเรียก basicConfig โดยอัตโนมัติเพื่อแนบ StreamHandler เริ่มต้นที่เขียนไปยัง sys.stderr

logging.log(level: int, msg: str, *args) None

บันทึกข้อความที่ระดับ level บน root logger args จะถูกแทรกเข้าไปใน msg โดยใช้การจัดรูปแบบ % แบบ printf; อาร์กิวเมนต์ dict เดียวจะถูกใช้เป็น mapping

logging.debug(msg: str, *args) None

เทียบเท่ากับ getLogger().debug(msg, *args)

logging.info(msg: str, *args) None

เทียบเท่ากับ getLogger().info(msg, *args)

logging.warning(msg: str, *args) None

เทียบเท่ากับ getLogger().warning(msg, *args)

logging.error(msg: str, *args) None

เทียบเท่ากับ getLogger().error(msg, *args)

logging.critical(msg: str, *args) None

เทียบเท่ากับ getLogger().critical(msg, *args)

logging.exception(msg: str, *args, exc_info: bool | BaseException = True) None

เทียบเท่ากับ getLogger().exception(msg, *args, exc_info=exc_info) บันทึกข้อความที่ ERROR และจัดรูปแบบ traceback ของข้อยกเว้นที่ใช้งานอยู่เพิ่มเติมเมื่อ exc_info มีค่าเป็นจริง หาก exc_info เป็นอินสแตนซ์ BaseException จะใช้ traceback ของข้อยกเว้นนั้น มิฉะนั้นจะอ้างอิง sys.exc_info() เมื่อใช้งานได้

logging.shutdown() None

ปิด handler ทุกตัวที่แนบอยู่กับ logger ทุกตัวที่รู้จักและลืม logger เหล่านั้น ลงทะเบียนโดยอัตโนมัติผ่าน sys.atexit เมื่อมี hook นั้นพร้อมใช้งาน

logging.addLevelName(level: int, name: str) None

เชื่อมโยง name ที่เป็นข้อความกับ level ที่เป็นตัวเลข เพื่อให้ Formatter แสดงผลผ่าน %(levelname)s

logging.basicConfig(filename: str | None = None, filemode: str = 'a', format: str | None = None, datefmt: str | None = None, level: int = WARNING, stream=None, encoding: str = 'UTF-8', force: bool = False) None

กำหนดค่า root logger ด้วย handler เดียว

หาก filename ถูกกำหนด จะสร้าง FileHandler โดยใช้ filemode และ encoding; มิฉะนั้นจะใช้ StreamHandler ที่เขียนไปยัง stream (ค่าเริ่มต้นคือ sys.stderr)

format และ datefmt จะถูกส่งผ่านไปยัง Formatter ใหม่

level กำหนดทั้งระดับของ handler และระดับของ root logger

หาก root logger มี handler อยู่แล้ว ฟังก์ชันนี้จะไม่ทำอะไร เว้นแต่ force จะเป็น True ซึ่งในกรณีนี้ handler ที่มีอยู่จะถูกปิดและแทนที่

คลาส

class logging.Logger(name: str, level: int = NOTSET)

Logger ที่มีชื่อ สร้าง logger ผ่าน getLogger แทนที่จะสร้างโดยตรง เพื่อให้ getLogger สามารถคืนค่าอินสแตนซ์เดียวกันสำหรับชื่อเดียวกัน

name: str

ชื่อที่คั่นด้วยจุดของ logger

level: int

ระดับตัวเลขที่กำหนดค่าไว้ 0 (NOTSET) หมายถึง "สืบทอด"

handlers: list

รายการอินสแตนซ์ Handler ที่แนบอยู่กับ logger นี้ เมื่อว่างเปล่า ข้อความจะถูกส่งไปยัง handler ของ root logger

setLevel(level: int) None

กำหนดระดับ threshold ของ logger

isEnabledFor(level: int) bool

คืนค่า True หากข้อความที่มีระดับ level จะถูกประมวลผลโดย logger นี้

getEffectiveLevel() int

คืนค่าแรกที่ไม่ใช่ศูนย์จาก: ระดับของ logger นี้, ระดับของ root logger หรือ WARNING

log(level: int, msg: str, *args) None

บันทึก msg ที่ระดับ level args จะถูกแทรกเข้าไปใน msg ด้วยตัวดำเนินการ %; หากอาร์กิวเมนต์ตำแหน่งแรกเป็น dict จะถูกใช้เป็น mapping

debug(msg: str, *args) None

บันทึก msg ที่ DEBUG

info(msg: str, *args) None

บันทึก msg ที่ INFO

warning(msg: str, *args) None

บันทึก msg ที่ WARNING

error(msg: str, *args) None

บันทึก msg ที่ ERROR

critical(msg: str, *args) None

บันทึก msg ที่ CRITICAL

exception(msg: str, *args, exc_info: bool | BaseException = True) None

บันทึก msg ที่ ERROR และเมื่อ exc_info มีค่าเป็นจริง จะต่อท้าย traceback ที่จัดรูปแบบแล้ว หาก exc_info เป็นอินสแตนซ์ BaseException traceback ของข้อยกเว้นนั้นจะถูกแสดงผล มิฉะนั้นจะอ้างอิงข้อยกเว้นที่ใช้งานอยู่ผ่าน sys.exc_info()

addHandler(handler: Handler) None

แนบ handler กับ logger นี้

hasHandlers() bool

คืนค่า True หาก handler ใดถูกแนบอยู่กับ logger นี้

class logging.Handler(level: int = NOTSET)

คลาสฐานสำหรับ handler ทุกตัว คลาสย่อยต้องสร้าง emit()

level: int

ระดับ threshold ของ handler

formatter: 'Formatter | None'

Formatter ที่ใช้งานอยู่ หรือ None

setLevel(level: int) None

กำหนดระดับ threshold ของ handler

setFormatter(formatter: Formatter) None

แนบ formatter กับ handler นี้

format(record: LogRecord) str

แสดงผล record โดยใช้ formatter ที่กำหนดค่าไว้

close() None

ปลดปล่อยทรัพยากรที่ handler ถือครอง เรียกโดย shutdown และโดย FileHandler เมื่อถูกปิด

class logging.StreamHandler(stream=None)

Handler ที่เขียนระเบียนที่จัดรูปแบบแล้ว ตามด้วย self.terminator (ค่าเริ่มต้นคือ "\n") ไปยัง stream stream ค่าเริ่มต้นคือ sys.stderr

stream

ออบเจ็กต์ stream ปลายทาง

terminator: str

สตริงที่ต่อท้ายหลังจากระเบียนที่จัดรูปแบบแล้วทุกรายการ ค่าเริ่มต้นคือ "\n"

emit(record: LogRecord) None

เขียน record ไปยัง stream หากระดับของมันตรงตามเกณฑ์ threshold ของ handler

close() None

Flush stream ที่อยู่ด้านล่างเมื่อมันเปิดเผยเมธอด flush

class logging.FileHandler(filename: str, mode: str = 'a', encoding: str = 'UTF-8')

คลาสย่อยของ StreamHandler ที่เปิด filename ด้วย mode และ encoding ที่กำหนดและเขียนระเบียนที่จัดรูปแบบแล้วลงไป ไฟล์ที่อยู่ด้านล่างจะถูกปิดเมื่อ close()

class logging.Formatter(fmt: str | None = None, datefmt: str | None = None)

แสดงผลอินสแตนซ์ LogRecord เป็นสตริง

fmt คือเทมเพลตสไตล์ printf คีย์ที่รับรู้ได้คือ %(name)s, %(message)s, %(msecs)d, %(asctime)s และ %(levelname)s เมื่อไม่ได้กำหนดจะค่าเริ่มต้นเป็น "%(levelname)s:%(name)s:%(message)s"

datefmt คือเทมเพลต time.strftime ที่ใช้แสดงผล %(asctime)s ค่าเริ่มต้นคือ "%Y-%m-%d %H:%M:%S"

usesTime() bool

คืนค่า True หากเทมเพลตรูปแบบอ้างอิงถึง asctime

formatTime(datefmt: str, record: LogRecord) str | None

จัดรูปแบบ record.ct โดยใช้ time.strftime และ datefmt คืนค่า None บนแพลตฟอร์มที่ time.strftime ไม่พร้อมใช้งาน

format(record: LogRecord) str

แสดงผล record หากเทมเพลตใช้ asctime จะเรียก formatTime() ก่อนเพื่อเติมข้อมูลใน record.asctime

class logging.LogRecord

คอนเทนเนอร์สำหรับข้อมูลที่ส่งจาก Logger ไปยัง handler ของมัน อินสแตนซ์จะถูกเติมข้อมูลผ่าน set(); การสร้าง logger จะนำระเบียนเดียวกลับมาใช้ต่อ logger เพื่อลดการจัดสรรหน่วยความจำ

name: str

ชื่อของ logger ต้นทาง

levelno: int

ระดับตัวเลขของระเบียนนี้

levelname: str

ชื่อระดับที่เป็นข้อความ

message: str

ข้อความ log ที่จัดรูปแบบเต็มรูปแบบ

ct: float

เวลาที่สร้างตามที่คืนค่าโดย time.time()

msecs: int

ส่วนประกอบมิลลิวินาทีของ ct

asctime: str | None

timestamp ที่อ่านได้โดยมนุษย์ เติมข้อมูลแบบ lazy โดย Formatter

set(name: str, level: int, message: str) None

เริ่มต้นระเบียนด้วยค่าที่กำหนดและบันทึกเวลาปัจจุบัน