logging.info doesn't show up on console but warn and error do

Question:

When I log an event with logging.info, it doesn’t appear in the Python terminal.

import logging
logging.info('I am info')  # no output

In contrast, events logged with logging.warn do appear in the terminal.

import logging
logging.warn('I am warning')  # outputs "I am warning"

Is there a environment level change I can to make logging.info print to the console? I want to avoid making changes in each Python file.

Asked By: daydreamer

||

Answers:

The root logger always defaults to WARNING level. Try calling

logging.getLogger().setLevel(logging.INFO)

and you should be fine.

Answered By: Ztyx

Like @ztyx said that default logger level is WARNING. You have to set it to a lower level

You can do it by using logging.basicConfig and setting logger level:

logging.basicConfig(level=logging.DEBUG)
Answered By: Vlad Bezden

The above solutions didn’t work for me, but the code here did:

# set up logging to file
logging.basicConfig(level=logging.DEBUG,
                    format='%(asctime)s %(name)-12s %(levelname)-8s %(message)s',
                    datefmt='%m-%d %H:%M',
                    filename='/temp/myapp.log',
                    filemode='w')
# define a Handler which writes INFO messages or higher to the sys.stderr
console = logging.StreamHandler()
console.setLevel(logging.INFO)
# add the handler to the root logger
logging.getLogger('').addHandler(console)

(I omitted parts of the code for the sake of readability)

Answered By: Orly

This will work

import logging

logging.basicConfig()
logger = logging.getLogger(__name__)
logger.setLevel(logging.INFO)

logger.info('its working')
Answered By: Deepak Chauhan

For those using absl.logging, the equivalent command is

from absl import logging
logging.set_verbosity(logging.INFO)
Answered By: Bremsstrahlung

What’s the minimum required code for a working module-level logger? I did an experiment (with python version 3.8.6).

The take-away is:

  • logging.basicConfig() is needed (however, specifying level=... is NOT needed)
  • it’s necessary to configure the root logger: logging.getLogger().setLevel(...)

So, a minimum working example is:

The library/module code does NOT need to configure the logger:

# library/module code: lib.py
import logging
LOGGER = logging.getLogger('x.y.z')

def some_function():
    LOGGER.info("hi")

The application code need to configure the logger with 2 lines at minimum:

# Application Code
import logging, lib

logging.basicConfig()
logging.getLogger().setLevel(logging.INFO)  # configure root logger

main()  # code that will trigger lib

Here’s the experiment:

In [1]: import logging

In [2]: lg = logging.getLogger('x.y.z')

In [3]: lg.info(1)

In [4]: logging.basicConfig()

In [5]: lg.info(1)

In [6]: logging.basicConfig(level=logging.INFO)

In [7]: lg.info(1)

In [8]: logging.basicConfig()

In [9]: logging.getLogger().setLevel(logging.INFO)

In [10]: lg.info(1)
INFO:x.y.z:1
Answered By: KFL

If you are using Django to power your server, you just simply need to change the log level in your settings.py file as such:

"handlers": {
                "console": {
--                  "level": "WARNING",
++                  "level": "INFO",
                    "class": "logging.StreamHandler",
                    "formatter": "stackdriver",
                }
            },

More examples in the documentation here:
https://docs.djangoproject.com/en/4.0/topics/logging/#configuring-logging-1

Answered By: Danny Vu

logging.info() will use the root logger for logging.

According to official doc,
if you do not set an explicit handler for the logger, a special handler called lastResort will be used.
See the code here. By default the logging level of lastResort (it is stream handler) is 30.
we can change its level to output info message.

# setting both the logger and handler's level will work as expected.
logger.setLevel(logging.DEBUG)
logging.lastResort.setLevel(logging.DEBUG)

However, this is like a hack and never a encouraged action.

Using logging.basicConfig()

If we want to do logging real quick, we can use the method logging.basicConfig.

logging.basicConfig(level=logging.DEBUG)

This will create the logger. The logger.level will be the level we set here.
A stream handler will be also created, with level NOTSET.
Without a level param, the default level for root logger is WARNING.

reference

Answered By: jdhao

In more recent versions of Python 3 (tested with Python 3.8), console logging requires creating a console handler to correctly show info messages.

The following example is modified from the Configuring Logging example in the Python documentation:

import logging

# create logger
logger = logging.getLogger('__name__')
level = logging.INFO
logger.setLevel(level)

# ----> console info messages require these lines <----
# create console handler and set level to debug
ch = logging.StreamHandler()
ch.setLevel(level)

# add ch to logger
logger.addHandler(ch)
# -----------------------------------------------------

# 'application' code
logger.debug('debug message')
logger.info('info message')
logger.warning('warn message')
logger.error('error message')
logger.critical('critical message')

Running the above code generates the following output:

info message
warn message
error message
critical message

Here is this same code without the console handler.

import logging

# create logger
logger = logging.getLogger('__name__')
level = logging.INFO
logger.setLevel(level)

# 'application' code
logger.debug('debug message')
logger.info('info message')
logger.warning('warn message')
logger.error('error message')
logger.critical('critical message')

Without the console handler, the output does not include the info message:

warn message
error message
critical message

I do not understand why this is the case as it seems unnecessary.

Answered By: Steven C. Howell
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.