<div dir="ltr"><div>It seems like that any logger I create BEFORE calling logging.config.dictConfig does not get configured.<br></div><div style><br></div><div style>Meanwhile, if I configure the logger like I always have, by just setting handlers on root, everything works fine, including the loggers that were created BEFORE I configure logging.</div>
<div style><br></div><div style>I make a lot of module-level log instances.</div><div style><br></div><div style>I wrote a simple script to show my problem.  Run it like:</div><div><br></div><div>    $ python scratch.py code</div>
<div><br></div><div>and then</div><div><br></div><div>    $ python scratch.py dict</div><div><br></div><div>and see how the logging output is different.</div><div><br></div><div style>### SCRIPT START</div><div><br></div>
<div>"""</div><div><br></div><div>import argparse</div><div>import logging</div><div>import logging.config</div><div><br></div><div>log1 = logging.getLogger('scratch')</div><div><br></div><div>def configure_logging_with_dictConfig():</div>
<div><br></div><div>    d = {</div><div>        'formatters': {</div><div>            'consolefmt': {</div><div>                'format': '%(asctime)s %(levelname)-10s %(process)-6d %(name)-24s %(lineno)-4d %(message)s'}},</div>
<div><br></div><div>        'handlers': {</div><div>            'console': {</div><div>                'class': 'logging.StreamHandler',</div><div>                'formatter': 'consolefmt',</div>
<div>                'level': 'DEBUG'}},</div><div><br></div><div>        'root': {</div><div>            'handlers': ['console'],</div><div>            'level': 'DEBUG'},</div>
<div><br></div><div>       'version': 1}</div><div><br></div><div>    logging.config.dictConfig(d)</div><div><br></div><div><div>def configure_logging_with_code():</div><div><br></div><div>    # Set the logger to DEBUG.</div>
<div>    logging.root.setLevel(logging.DEBUG)</div><div><br></div><div>    # Now write a custom formatter, so that we get all those different</div><div>    # things.</div><div>    f = logging.Formatter(</div><div>        '%(asctime)s '</div>
<div>        '%(levelname)-10s '</div><div>        '%(process)-6d '</div><div>        '%(filename)-24s '</div><div>        '%(lineno)-4d '</div><div>        '%(message)s '</div><div>
    )</div><div><br></div><div>    # Set up a stream handler for DEBUG stuff (and greater).</div><div>    sh = logging.StreamHandler()</div><div>    sh.setLevel(logging.DEBUG)</div><div>    sh.setFormatter(f)</div><div>    logging.root.addHandler(sh)</div>
<div><br></div><div>def set_up_arguments():</div><div><br></div><div>    ap = argparse.ArgumentParser()</div><div>    ap.add_argument('how_to_configure', choices=['code', 'dict'])</div><div>    return ap.parse_args()</div>
<div><br></div><div>if __name__ == '__main__':</div><div><br></div><div>    args = set_up_arguments()</div><div><br></div><div>    if args.how_to_configure == 'code':</div><div>        configure_logging_with_code()</div>
<div><br></div><div>    elif args.how_to_configure == 'dict':</div><div>        configure_logging_with_dictConfig()</div><div><br></div><div>    log1.debug('debug from log1')</div><div><br></div><div style>
    # log2 is created AFTER I configure logging.</div><div>    log2 = logging.getLogger('log2')</div><div>    log2.debug('debug from log2')</div><div><br></div><div style>    # Try to figure out what is the difference!  Nothing jumps out at me.</div>
<div><br></div><div>    print "log.root.level: {0}".format(log1.root.level)</div><div>    print "log.root.handlers: {0}".format(log1.root.handlers)</div><div><br></div><div>    print "log1.parent.level: {0}".format(log1.parent.level)</div>
<div>    print "log1.parent.handlers: {0}".format(log1.parent.handlers)</div><div><br></div><div>    print "log1.level: {0}".format(log1.level)</div><div>    print "log1.handlers: {0}".format(log1.handlers)</div>
<div>    print "log1.propagate: {0}".format(log1.propagate)</div><div>    print "log1.getEffectiveLevel(): {0}".format(log1.getEffectiveLevel())</div></div><div><br></div><div style>### SCRIPT END</div>
<div><br></div><div><br></div>-- <br>W. Matthew Wilson<br><a href="mailto:matt@tplus1.com" target="_blank">matt@tplus1.com</a><br><a href="http://tplus1.com" target="_blank">http://tplus1.com</a><br><br>
</div>