What is Python's default logging formatter?

Question:

I’m trying to decipher the information contained in my logs (the logging setup is using the default formatter). The documentation states:

Do formatting for a record – if a formatter is set, use it. Otherwise, use the default formatter for the module.

However, I can’t find any reference actually stating what this default format is.

Asked By: Trent

||

Answers:

It’s in the source of logging/__init__.py:

_defaultFormatter = Formatter()

The default formatting string is %(message)s, which is in the source as well:

if fmt:
    self._fmt = fmt
else:
    self._fmt = "%(message)s"
Answered By: Blender

The default seems to be %(levelname)s:%(name)s:%(message)s

import logging
logging.error("Some error")
print "fmt: " , logging.root.handlers[0].formatter._fmt
# ERROR:root:Some error
# fmt:  %(levelname)s:%(name)s:%(message)s
Answered By: Salem

The default format is located here which is:

BASIC_FORMAT = "%(levelname)s:%(name)s:%(message)s"  

The Format code will tell you how you can customize it. Here is one example on how you can customize it.

import sys
import logging

logging.basicConfig(
    level=logging.DEBUG,
    format="[%(asctime)s] %(levelname)s [%(name)s.%(funcName)s:%(lineno)d] %(message)s",
    datefmt="%d/%b/%Y %H:%M:%S",
    stream=sys.stdout)

logging.info("HEY")

Which results in:

[26/May/2013 06:41:40] INFO [root.<module>:1] HEY
Answered By: rh0dium
import logging
print(logging.BASIC_FORMAT)

Old thread but this comes up first in my google search results for the query “python logging default format”, so I thought I should add my answer.

Also some comments asked about how one could have come to discover this on their own. Here is a natural thing to do:

import logging
print(dir(logging))

BASIC_FORMAT is in there, in fact it is the first entry in the result in my case.

Answered By: awhan

Here is the example of an advanced way of logging:-

import logging
class logger_con():
   def log_test(self):
      """
        :create logger
        :set logger level
        :create console handler
        :add formatter to console handler
        :add console handler to logger
        :add logging massage
        :return:
      """
    #create logger and set level
    logger=logging.getLogger(logger_con.__name__)

    logger.setLevel(logging.INFO)

    #create console handler(we are using steamHandler which is only used to display log in console)

    con_handler=logging.StreamHandler()
    con_handler.setLevel(logging.INFO)

    #create formatter and add formatter to con_handler
    formatter=logging.Formatter('%(asctime)s : %(message)s : %(levelname)s -%(name)s',datefmt='%d%m%Y %I:%M:%S %p')
    con_handler.setFormatter(formatter)
    #add console handler to logger
    logger.addHandler(con_handler)

    logger.debug('Program debugging')
    logger.info('massage conatain information')
    logger.warning('warning message')
    logger.error('massage contains error')
    logger.critical('critical massages')
Answered By: v.k

@rh0dium’s and @Blender’s answers contradict each other but they’re both correct… just incomplete.

As of Python 3.10:

  • If you create a handler without specifying a formatter, the default format is "%(message)s".
  • If you call logging.basicConfig it sets up a handler on the root logger with a formatter that defaults to "%(levelname)s:%(name)s:%(message)s".
    • Note that logging.info, logging.warning etc will automatically call logging.basicConfig() if you haven’t called it already.
    • But calling the root logger directly (like logging.getLogger().info(...)) won’t call logging.basicConfig().

So the actual behaviour depends on whether you’ve ever called logging.basicConfig or logging.info/logging.warning/etc.

$ python3
Python 3.10.4 (main, Apr  2 2022, 09:04:19) [GCC 11.2.0] on linux
>>> import logging
>>> root = logging.getLogger()
>>> root.warning("W")
W
>>> logging.warning("W")
WARNING:root:W
>>> root.warning("W")
WARNING:root:W
>>> mylogger = logging.getLogger("mylogger")
>>> mylogger.addHandler(logging.StreamHandler())
>>> mylogger.propagate = False
>>> mylogger.warning("W")
W
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.