Określanie, czy główny program rejestrujący jest ustawiony na poziom DEBUG w Pythonie?

93

Jeśli ustawię moduł logowania na DEBUG z parametrem wiersza poleceń, takim jak ten:

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

Jak mogę później sprawdzić, czy rejestrator został ustawiony na DEBUG? Piszę dekorator, który będzie mierzył czas funkcji, jeśli zostanie do niego przekazana flaga True, a jeśli nie zostanie podana żadna flaga, domyślnie wypisze informacje o czasie, gdy główny rejestrator jest ustawiony na DEBUG.

gct
źródło
W końcu będziesz chciał użyć czegoś konkretnego zamiast sprzęgania tego z loggerem, na przykład opt ["time_functions"] (które możesz domyślnie ustawić na True / False na podstawie innej opcji).

Odpowiedzi:

116
logging.getLogger().getEffectiveLevel()

logging.getLogger() bez argumentów pobiera rejestrator poziomu głównego.

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

Tor Valamo
źródło
Wspaniale dzięki! Robiłem coś takiego (z wyjątkiem przekazywania jawnego "roota" do getLogger), ale robiłem to w funkcji init mojego dekoratora, zanim rejestrator został ustawiony na debugowanie: \
gct
5
Jeśli chcesz nazwę poziomu, a nie liczbę, możesz użyć tego, aby przekonwertować liczbę na ciąg (np. „INFO”): logging.getLevelName ()
guettli
2
@guettli, getLevelName () wymaga jednego argumentu zawierającego poziom, którego reprezentację tekstową chcesz uzyskać. Więc połączenie jest rzeczywiście ta bestia: logging.getLevelName(logging.getLogger().getEffectiveLevel()). Byłoby miło mieć prostszą składnię, gdy wszystko, czego chcesz, to ciąg znaków dla bieżącego poziomu.
Trutane
Aby przekonwertować liczbę całkowitą poziomu na nazwę: docs.python.org/3/library/logging.html#levels
EddyTheB,
106

Właściwie jest jeden lepszy: użyj kodulogging.getLogger().isEnabledFor(logging.DEBUG) . Znalazłem to, próbując zrozumieć, co zrobić z wynikiem getEffectiveLevel().

Poniżej znajduje się kod używany przez sam moduł logowania.

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()
Poklepać
źródło
4
To powinna być akceptowana odpowiedź, ponieważ robi to samo z mniejszą złożonością czasu wykonywania.
AndyJost
1
Gdyby to był rzeczywisty kod, a nie obraz. Wciąż: przegłosowano.
kaiser