การกำหนดว่า root logger ถูกตั้งค่าเป็นระดับ DEBUG ใน Python หรือไม่?


93

หากฉันตั้งค่าโมดูลการบันทึกเป็น DEBUG ด้วยพารามิเตอร์บรรทัดคำสั่งเช่นนี้:

if (opt["log"] == "debug"):
  logging.basicConfig(level=logging.DEBUG)

ฉันจะทราบได้อย่างไรในภายหลังว่าคนตัดไม้ถูกตั้งค่าเป็นดีบัก ฉันกำลังเขียนมัณฑนากรที่จะกำหนดเวลาของฟังก์ชันหาก True flag ถูกส่งผ่านไปและหากไม่มีการตั้งค่าสถานะจะใช้ค่าเริ่มต้นในการพิมพ์ข้อมูลเวลาเมื่อ root logger ตั้งค่าเป็น DEBUG


ในที่สุดคุณจะต้องการใช้สิ่งที่เฉพาะเจาะจงแทนการเชื่อมต่อสิ่งนี้กับคนตัดไม้เช่น opt ["time_functions"] (ซึ่งคุณอาจตั้งค่าเริ่มต้นเป็น True / False ตามตัวเลือกอื่น ๆ )

คำตอบ:


116
logging.getLogger().getEffectiveLevel()

logging.getLogger() โดยไม่มีข้อโต้แย้งได้รับตัวบันทึกระดับรูท

http://docs.python.org/library/logging.html#logging.Logger.getEffectiveLevel


ยอดเยี่ยมขอบคุณ! ฉันกำลังทำอะไรแบบนั้น (ยกเว้นการส่ง "root" ที่ชัดเจนไปยัง getLogger) แต่ฉันกำลังทำในฟังก์ชันinitของมัณฑนากรของฉันก่อนที่คนตัดไม้จะถูกตั้งค่าเป็น debug: \
gct

5
หากคุณต้องการชื่อระดับไม่ใช่ตัวเลขคุณสามารถใช้สิ่งนี้เพื่อแปลงตัวเลขเป็นสตริง (เช่น 'INFO'): logging.getLevelName ()
guettli

2
@guettli, getLevelName () ต้องการหนึ่งอาร์กิวเมนต์ที่มีระดับที่คุณต้องการได้รับการแสดงข้อความ logging.getLevelName(logging.getLogger().getEffectiveLevel())ดังนั้นการเรียกร้องที่เป็นจริงสัตว์นี้: จะเป็นการดีที่จะมีไวยากรณ์ที่ง่ายกว่านี้เมื่อสิ่งที่คุณต้องการคือสตริงสำหรับระดับปัจจุบัน
Trutane

ในการแปลงจำนวนเต็มระดับเป็นชื่อ: docs.python.org/3/library/logging.html#levels
EddyTheB

106

อันที่จริงมีหนึ่งที่ดีกว่า: ใช้รหัส logging.getLogger().isEnabledFor(logging.DEBUG)ฉันพบมันในขณะที่พยายามทำความเข้าใจว่าจะทำอย่างไรกับผลลัพธ์ของgetEffectiveLevel().

ด้านล่างนี้คือรหัสที่โมดูลการบันทึกใช้เอง

def getEffectiveLevel(self):
    """
    Get the effective level for this logger.

    Loop through this logger and its parents in the blogger hierarchy,
    looking for a non-zero logging level. Return the first one found. 
    """
    logger = self
    while logger:
        if logger.level:
            return logger.level
        logger = logger.parent
    return NOTSET

def isEnabledFor(self, level):
    """
    Is this logger enabled for level ‘level’?
    """
    if self.manager.disable >= level:
        return 0
    return level >= self.getEffectiveLevel()

4
นี่ควรเป็นคำตอบที่ยอมรับได้เนื่องจากมันทำสิ่งเดียวกันกับความซับซ้อนของรันไทม์ที่ต่ำ
AndyJost

1
หากเป็นรหัสจริงไม่ใช่รูปภาพ ยังคง: โหวตขึ้น
kaiser

3

แค่

logging.getLogger().level == logging.DEBUG

สิ่งนี้ไม่ได้ให้คำตอบสำหรับคำถาม เมื่อคุณมีเพียงพอชื่อเสียงคุณจะสามารถที่จะแสดงความคิดเห็นในโพสต์ใด ๆ ; แทนที่จะให้คำตอบที่ไม่จำเป็นต้องชี้แจงจากผู้ถาม - จากรีวิว
Vineeth Sai

@VineethSai, คง. ขอบคุณ!
Keelung
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.