แนวทางปฏิบัติที่ดีที่สุดของ Python ในแง่ของการบันทึก

เมื่อใช้โมดูล logging จาก python เพื่อวัตถุประสงค์ในการบันทึก แนวทางปฏิบัติที่ดีที่สุดในการกำหนดตัวบันทึกสำหรับแต่ละคลาสคืออะไร?

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


person Lucas Kauffman    schedule 02.04.2014    source แหล่งที่มา


คำตอบ (3)


ใช้การกำหนดค่าการบันทึก JSON หรือ YAML - หลังจาก Python 2.7 คุณสามารถโหลดการกำหนดค่าการบันทึกจาก dict หมายความว่าคุณสามารถโหลดการกำหนดค่าการบันทึกจากไฟล์ JSON หรือ YAML ได้

ตัวอย่าง Yaml -

version: 1
disable_existing_loggers: False
formatters:
    simple:
        format: "%(asctime)s - %(name)s - %(levelname)s - %(message)s"

handlers:
    console:
        class: logging.StreamHandler
        level: DEBUG
        formatter: simple
        stream: ext://sys.stdout

    info_file_handler:
        class: logging.handlers.RotatingFileHandler
        level: INFO            
        formatter: simple
        filename: info.log
        maxBytes: 10485760 # 10MB
        backupCount: 20
        encoding: utf8

    error_file_handler:
        class: logging.handlers.RotatingFileHandler
        level: ERROR            
        formatter: simple
        filename: errors.log
        maxBytes: 10485760 # 10MB
        backupCount: 20
        encoding: utf8

loggers:
    my_module:
        level: ERROR
        handlers: [console]
        propagate: no

root:
    level: INFO
    handlers: [console, info_file_handler, error_file_handler]

อ้างอิง - Good-logging-practice-in-python< /ก>

person onsy    schedule 02.04.2014

แนวทางปฏิบัติที่ดีที่สุดคือปฏิบัติตามกฎของ Python สำหรับองค์ประกอบของซอฟต์แวร์ (de) - โมดูลคือหน่วยของซอฟต์แวร์ Python ไม่ใช่คลาส ดังนั้นแนวทางที่แนะนำคือการใช้

logger = logging.getLogger(__name__)

ในแต่ละโมดูล และเพื่อกำหนดค่าการบันทึก (โดยใช้ basicConfig() หรือ dictConfig()) จากสคริปต์หลัก

คนตัดไม้เป็นพวกซิงเกิลตัน - ไม่มีประโยชน์ที่จะส่งต่อหรือเก็บไว้ในกรณีของชั้นเรียนของคุณ

person Vinay Sajip    schedule 02.04.2014
comment
logger = logging.getLogger(__name__) ไปที่ด้านบนของโมดูลหรือภายในแต่ละฟังก์ชัน/วิธีการที่ต้องการบันทึกหรือไม่ - person industryworker3595112; 31.10.2016
comment
@industryworker3595112 ที่ด้านบนของโมดูล (หลังคำสั่ง import) - person Vinay Sajip; 31.10.2016

ใช้ การบันทึกแบบมีโครงสร้าง สองเครื่องมือที่ยอดเยี่ยมสำหรับสิ่งนี้:

  • Eliot: การบันทึกที่บอกคุณว่าทำไมจึงเกิดขึ้น

ระบบบันทึกส่วนใหญ่จะบอกคุณว่าเกิดอะไรขึ้นในแอปพลิเคชันของคุณ ในขณะที่ Eliot จะบอกคุณด้วยว่าทำไมจึงเกิดขึ้น

eliot เป็นระบบบันทึกข้อมูลของ Python ที่ส่งสัญญาณเอาท์พุตห่วงโซ่เชิงสาเหตุของการกระทำ: การกระทำสามารถทำให้เกิดการกระทำอื่น ๆ และในที่สุดพวกเขาก็สำเร็จหรือล้มเหลว บันทึกผลลัพธ์จะบอกให้คุณทราบถึงสิ่งที่ซอฟต์แวร์ของคุณทำ: เกิดอะไรขึ้น และอะไรเป็นสาเหตุ

  • Structlog: structlog ทำให้การเข้าสู่ระบบใน Python เจ็บปวดน้อยลงและมีประสิทธิภาพมากขึ้นโดยการเพิ่มโครงสร้างให้กับรายการบันทึกของคุณ .

การบันทึกแบบมีโครงสร้างหมายความว่าคุณไม่ได้เขียนร้อยแก้วที่ยากต่อการแยกวิเคราะห์และสม่ำเสมอในบันทึกของคุณ แต่คุณบันทึกเหตุการณ์ที่เกิดขึ้นในบริบทแทน


ฉันมีประสบการณ์เชิงบวกมากกับเอเลียต

person Hatshepsut    schedule 07.12.2018