orange
orange

Reputation: 8090

Python default logger disabled

For some reason, in a Python application I am trying to modify, the logger is not logging anything. I traced the error to logging/__init__.py

def handle(self, record):
    """
    Call the handlers for the specified record.

    This method is used for unpickled records received from a socket, as
    well as those created locally. Logger-level filtering is applied.
    """
    if (not self.disabled) and self.filter(record):
        self.callHandlers(record)

I am not sure why, but self.disabled is True. Nowhere in the application this value is set and I don't think any of the packages is changing it. The logger is instantiated as usual logger = logging.getLogger(__name__). When I set logger.disabled = False before actually logging anything (before calling logger.info()), the logger prints the expected log text. But if I don't, it returns in handle() without logging anything.

Is there any way I can debug this? Perhaps one can change the Logger class so that some function is called whenever disabled gets written to...

Upvotes: 12

Views: 7266

Answers (2)

Martijn Pieters
Martijn Pieters

Reputation: 1121962

If you need to trace what code might set handler.disabled to True (it is 0, so false, by default), you can replace the attribute with a property:

import logging
import sys

@property
def disabled(self):
    try:
        return self._disabled
    except AttributeError:
        return False

@disabled.setter
def disabled(self, disabled):
    if disabled:
        frame = sys._getframe(1)
        print(
            f"{frame.f_code.co_filename}:{frame.f_lineno} "
            f"disabled the {self.name} logger"
        )
    self._disabled = disabled

logging.Logger.disabled = disabled

Demo from the interactive interpreter:

>>> import logging
>>> logging.getLogger('foo.bar').disabled = True
<stdin>:1 disabled the foo.bar logger

If you want to see the full stack, add from traceback import print_stack, and inside the if disabled: block, print_stack(frame).

Upvotes: 25

frost-nzcr4
frost-nzcr4

Reputation: 1620

Often found this problem when configuration schema is used, by default disable_existing_loggers is True so all loggers that not included in that schema will be disabled.

BTW Martin Pieters' answer is supreme and works in any situation when you've stuck.

Upvotes: 21

Related Questions