How to log specific level for my loggers, and keep the rest with another level

81 Views Asked by At

I want to be able to have my own loggers at some level, but not show the info from another modules.

I have these versions:

FORMAT = '[%(asctime)s] {%(name)s:%(lineno)d} %(levelname)s - %(message)s'

def configure_logging():
    # set up logging to console
    console = logging.StreamHandler()
    console.setLevel(logging.DEBUG)
    formatter = logging.Formatter(FORMAT)
    console.setFormatter(formatter)
    logging.getLogger('').addHandler(console)

This version, prints everything on DEBUG, not only my loggers

FORMAT = '[%(asctime)s] {%(name)s:%(lineno)d} %(levelname)s - %(message)s'

def configure_logging():
    # set up logging to console
    console = logging.StreamHandler()
    console.setLevel(logging.INFO)
    formatter = logging.Formatter(FORMAT)
    console.setFormatter(formatter)
    logging.getLogger('').addHandler(console)

This version, prints nothing on DEBUG, not even when my loggers are configured with setLevel(logging.DEBUG), and calling logger.debug('my_message')

So I tried to make different console handlers in next version

FORMAT = '[%(asctime)s] {%(name)s:%(lineno)d} %(levelname)s - %(message)s'

def configure_logging():
    # set up logging to console
    root_console = logging.StreamHandler()
    root_console.setLevel(logging.INFO)
    console = logging.StreamHandler()
    console.setLevel(logging.DEBUG)
    formatter = logging.Formatter(FORMAT)
    root_console.setFormatter(formatter)
    console.setFormatter(formatter)
    logging.getLogger('').addHandler(root_console)
    logging.getLogger('my_logger').addHandler(console)

It turned out that now, I achieved what I wanted, however, the INFO messages gets logged twice (I assume, one for each handler)...

So, I guess there is a better approach.

As summary, I would like something like:

  • my_module1.logger1 --> DEBUG

  • my_module1.logger2 --> DEBUG

  • my_module2.logger1 --> DEBUG

  • my_module2.logger2 --> WARNING

  • my_module2.logger3 --> DEBUG

  • REST_OF_LOGS --> INFO

So I could do something like(pseudocode):

'my_module1'.setLevel(DEBUG)
'my_module2'.setLevel(DEBUG)
'my_module2.logger2'.setLevel(WARNING)
''.setLevel(INFO)
1

There are 1 best solutions below

0
On

It was just a stupid mistake. I forgot to specify root logger level, and at some point, some library was setting it up at some level.

My new source code working is the following:

FORMAT = '[%(asctime)s] {%(name)s:%(lineno)d} %(levelname)s - %(message)s'

def configure_logging():
    console = logging.StreamHandler()
    console.setLevel(logging.DEBUG)
    formatter = logging.Formatter(FORMAT)
    console.setFormatter(formatter)
    logging.getLogger('').setLevel(logging.INFO) # This was the missing line
    logging.getLogger('my_module1').setLevel(logging.DEBUG)
    logging.getLogger('my_module1.internal').setLevel(logging.INFO)
    logging.getLogger('').addHandler(console)