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?