d3pd
d3pd

Reputation: 8295

How should Python logging be accomplished using a logging object across multiple modules?

I want to create a Python logging object in my main program and have logging in both my main program and in the modules it uses at the same logging level. The basic example given in logging documentation is essentially as follows:

main.py:

import logging
import mylib

def main():
    logging.basicConfig(level = logging.INFO)
    logging.info('Started')
    mylib.do_something()
    logging.info('Finished')

if __name__ == '__main__':
    main()

mylib.py:

import logging

def do_something():
    logging.info('Doing something')

This works fine. I am not sure, however, of how to get a Python logging object doing something similar. The following, for example, does not work:

main.py:

import logging
import mylib

def main():
    verbose = True
    global log
    log = logging.getLogger(__name__)
    if verbose:
        log.setLevel(logging.INFO)
    else:
        log.setLevel(logging.DEBUG)
    log.info('Started')
    mylib.do_something()
    log.info('Finished')

if __name__ == '__main__':
    main()

mylib.py:

import logging

def do_something():
    log.info('Doing something')

It does not work because the global log object is not recognised in the mylib.py module. How should I be doing this? My two main goals are

Upvotes: 1

Views: 243

Answers (2)

Tom Dalton
Tom Dalton

Reputation: 6190

You can use a different logger in each module as follows:

import logging
LOG = logging.getLogger(__name__)

# Stuff
LOG.info("A log message")

Upvotes: 1

Simeon Visser
Simeon Visser

Reputation: 122326

Your application should configure the logging once (with basicConfig or see logging.config) and then in each file you can have:

import logging

log = logging.getLogger(__name__)

# further down:

log.info("alert")

So you use a logger everywhere and you don't directly access the logging module in your codebase. This allows you to configure all your loggers in your logging configuration (which, as said earlier, is configured once and loaded at the beginning of your application).

Upvotes: 3

Related Questions