tags:

views:

404

answers:

2

It appears that if you invoke logging.info() BEFORE you run logging.basicConfig, the logging.basicConfig call doesn't have any effect. In fact, no logging occurs.

Where is this behavior documented? I don't really understand.

+3  A: 

Yes.

You've asked to log something. Logging must, therefore, fabricate a default configuration. Once logging is configured... well... it's configured.

"With the logger object configured, the following methods create log messages:"

Further, you can read about creating handlers to prevent spurious logging. But that's more a hack for bad implementation than a useful technique.

There's a trick to this.

  1. No module can do anything except logging.getlogger() requests at a global level.

  2. Only the if __name__ == "__main__": can do a logging configuration.

If you do logging at a global level in a module, then you may force logging to fabricate it's default configuration.

Don't do logging.info globally in any module. If you absolutely think that you must have logging.info at a global level in a module, then you have to configure logging before doing imports. This leads to unpleasant-looking scripts.

S.Lott
+2  A: 

You can remove the default handlers and reconfigure logging like this:

# if someone tried to log something before basicConfig is called, Python creates a default handler that
# goes to the console and will ignore further basicConfig calls. Remove the handler if there is one.
root = logging.getLogger()
if root.handlers:
    for handler in root.handlers:
        root.removeHandler(handler)
logging.basicConfig(format="'%(asctime)s %(message)s',level=logging.DEBUG)
Carlos A. Ibarra