Python'da kök kaydedicinin DEBUG düzeyine ayarlanıp ayarlanmadığını belirleme?


93

Günlük modülünü aşağıdaki gibi bir komut satırı parametresiyle DEBUG olarak ayarlarsam:

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

Kaydedicinin DEBUG olarak ayarlanıp ayarlanmadığını daha sonra nasıl anlarım? Ona Doğru bayrak geçirilirse bir işlevi zamanlayacak bir dekoratör yazıyorum ve herhangi bir bayrak verilmezse, kök günlükleyici DEBUG olarak ayarlandığında varsayılan olarak zamanlama bilgilerini yazdırmak için kullanılır.


Sonunda bunu kaydediciye bağlamak yerine belirli bir şey kullanmak isteyeceksiniz, örneğin opt ["time_functions"] (başka bir seçeneğe bağlı olarak True / False'ı varsayılan olarak seçebilirsiniz).

Yanıtlar:


116
logging.getLogger().getEffectiveLevel()

logging.getLogger() bağımsız değişken olmadan kök düzey günlükçüyü alır.

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


Mükemmel, teşekkürler! Böyle bir şey yapıyordum (getLogger'a açıkça "root" iletmek dışında), ancak bunu günlükleyici hata ayıklamaya ayarlanmadan önce dekoratörümün init işlevinde yapıyordum : \
gct

5
Numarayı değil, seviyenin adını istiyorsanız, bunu sayıyı bir dizeye dönüştürmek için kullanabilirsiniz ('INFO' gibi): logging.getLevelName ()
guettli

2
@guettli, getLevelName (), metinsel temsilini almak istediğiniz düzeyi içeren bir bağımsız değişken gerektirir. Yani çağrı aslında bu canavar: logging.getLevelName(logging.getLogger().getEffectiveLevel()). İstediğiniz tek şey geçerli seviye için dizge olduğunda daha basit bir sözdizimine sahip olmak güzel olurdu.
Trutane

Seviye tamsayısını isme dönüştürmek için: docs.python.org/3/library/logging.html#levels
EddyTheB

106

Aslında daha iyisi var: kodu kullanınlogging.getLogger().isEnabledFor(logging.DEBUG) . Bunun sonucu ile ne yapacağımı anlamaya çalışırken buldum getEffectiveLevel().

Aşağıda, günlük modülünün kendisinin kullandığı kod bulunmaktadır.

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
Aynı şeyi daha düşük çalışma zamanı karmaşıklığı ile yaptığı için bu kabul edilen cevap olmalıdır.
AndyJost

1
Eğer gerçek bir kod olacaksa ve bir görüntü olmayacaksa. Yine de: olumlu oy verildi.
kaiser

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.