Menentukan apakah root logger disetel ke level DEBUG dengan Python?

93

Jika saya mengatur modul logging ke DEBUG dengan parameter baris perintah seperti ini:

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

Bagaimana saya nanti bisa tahu jika logger telah diatur ke DEBUG? Saya sedang menulis dekorator yang akan mengatur waktu fungsi jika True flag diteruskan ke sana, dan jika tidak ada flag yang diberikan, defaultnya adalah mencetak informasi waktu ketika root logger diatur ke DEBUG.

gct
sumber
Pada akhirnya Anda ingin menggunakan sesuatu yang spesifik daripada menggabungkan ini ke logger, seperti opt ["time_functions"] (yang mungkin Anda default ke True / False berdasarkan beberapa opsi lain).

Jawaban:

116
logging.getLogger().getEffectiveLevel()

logging.getLogger() tanpa argumen mendapatkan pencatat tingkat akar.

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

Tor Valamo
sumber
Luar biasa, terima kasih! Saya melakukan hal seperti itu (kecuali meneruskan "root" eksplisit ke getLogger), tetapi saya melakukannya dalam fungsi init dekorator saya, sebelum logger disetel ke debug: \
gct
5
Jika Anda menginginkan nama level, bukan nomor, Anda dapat menggunakan ini untuk mengonversi angka menjadi string (seperti 'INFO'): logging.getLevelName ()
guettli
2
@guettli, getLevelName () memerlukan satu argumen yang berisi level yang representasi tekstualnya ingin Anda dapatkan. Jadi panggilan sebenarnya binatang ini: logging.getLevelName(logging.getLogger().getEffectiveLevel()). Alangkah baiknya memiliki sintaks yang lebih sederhana ketika yang Anda inginkan hanyalah string untuk level saat ini.
Trutane
Untuk mengonversi integer level ke nama: docs.python.org/3/library/logging.html#levels
EddyTheB
106

Sebenarnya, ada satu yang lebih baik: gunakan kodelogging.getLogger().isEnabledFor(logging.DEBUG) . Saya menemukannya saat mencoba memahami apa yang harus dilakukan dengan hasil getEffectiveLevel().

Di bawah ini adalah kode yang digunakan modul logging itu sendiri.

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()
Menepuk
sumber
4
Ini harus menjadi jawaban yang diterima, karena melakukan hal yang sama dengan kompleksitas waktu proses yang lebih rendah.
AndyJost
1
Jika itu akan menjadi kode sebenarnya dan bukan gambar. Tetap: suara positif.
kaiser