Using logging in multiple modules

config, logging, python, python-logging

Solution

Best practice is, in each module, to have a logger defined like this:

import logging
logger = logging.getLogger(__name__)

near the top of the module, and then in other code in the module do e.g.

logger.debug('My message with %s', 'variable data')

If you need to subdivide logging activity inside a module, use e.g.

loggerA = logging.getLogger(__name__ + '.A')
loggerB = logging.getLogger(__name__ + '.B')

and log to `loggerA` and `loggerB` as appropriate.

In your main program or programs, do e.g.:

def main():
    "your program code"

if __name__ == '__main__':
    import logging.config
    logging.config.fileConfig('/path/to/logging.conf')
    main()

or

def main():
    import logging.config
    logging.config.fileConfig('/path/to/logging.conf')
    # your program code

if __name__ == '__main__':
    main()

See here for logging from multiple modules, and here for logging configuration for code which will be used as a library module by other code.

Update: When calling `fileConfig()`, you may want to specify `disable_existing_loggers=False` if you're using Python 2.6 or later (see the docs for more information). The default value is `True` for backward compatibility, which causes all existing loggers to be disabled by `fileConfig()` unless they or their ancestor are explicitly named in the configuration. With the value set to `False`, existing loggers are left alone. If using Python 2.7/Python 3.2 or later, you may wish to consider the `dictConfig()` API which is better than `fileConfig()` as it gives more control over the configuration.

Problem

I have a small python project that has the following structure - ``` Project -- pkg01 -- test01.py -- pkg02 -- test02.py -- logging.conf ``` I plan to use the default logging module to print messages to stdout and a log file. To use the logging module, some initialization is required - ``` import logging.config logging.config.fileConfig('logging.conf') logger = logging.getLogger('pyApp') logger.info('testing') ``` At present, I perform this initialization in every module before I start logging messages. Is it possible to perform this initialization only once in one place such that the same settings are reused by logging all over the project?

Original source

Related problems