Python Logging: Loggers, Handlers, and Formatters

Logging is a crucial aspect of any software application, providing valuable insights into its behavior and helping to diagnose and troubleshoot issues. Python’s built-in logging module offers a flexible and efficient way to implement logging in your FastAPI applications. This guide will explore the key components of Python logging: loggers, handlers, and formatters.

Loggers

A logger is an object that represents a logging channel. It’s used to emit log messages at different levels of severity, such as DEBUG, INFO, WARNING, ERROR, and CRITICAL. You can create loggers using the getLogger function:

Python

import logging

logger = logging.getLogger(__name__)

Handlers

Handlers are responsible for sending log messages to specific destinations, such as the console, a file, or a network socket. You can create handlers using classes like StreamHandler (for console output), FileHandler (for file output), and SMTPHandler (for email output).

Example:

Python

handler = logging.StreamHandler()
logger.addHandler(handler)

Formatters

Formatters control the appearance of log messages. They define the layout and content of the messages. You can create formatters using the Formatter class:

Python

formatter = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)

Logging Levels

Python’s logging module defines five logging levels:

  • DEBUG: Most detailed level, typically used for debugging.
  • INFO: Provides general information about the application’s behavior.
  • WARNING: Indicates potential problems or unexpected events.
  • ERROR: Signals an error that doesn’t prevent the application from continuing.
  • CRITICAL: Indicates a serious error that might prevent the application from continuing.

To set the logging level for a logger, use the setLevel method:

Python

logger.setLevel(logging.DEBUG)

Example:

Python

import logging

logger = logging.getLogger(__name__)
logger.setLevel(logging.DEBUG)

handler = logging.StreamHandler()
formatter = logging.Formatter('%(asctime)s    - %(name)s - %(levelname)s - %(message)s')
handler.setFormatter(formatter)
logger.addHandler(handler)   

logger.debug("This is a debug message")
logger.info("This is an info message")
logger.warning("This is a warning message")
logger.error("This is an error message")
logger.critical("This is a critical    message")
Logger Hierarchies and name
Logging Overview

Get industry recognized certification – Contact us

keyboard_arrow_up
Open chat
Need help?
Hello 👋
Can we help you?