Skip to content

Logging in python

The basic setup

  1. create a logger with a name
  2. define a handler
  3. set handler level
  4. set handler format
  5. add handler to logger
  6. if needed, repeat 2-5 to define another handler and add it to logger

We consolidate the above in a reusable function. Its functionality is only slightly more than minimal, but probably sufficient for 99% of a data person's use case.

import logging

def setup_logger(
    name: str,
    level=logging.DEBUG,
    log_to_file=False,
    filename="app.log",
    file_level=None  # optional file-specific level
):
    logger = logging.getLogger(name)
    logger.setLevel(level)

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

    # Clear any existing handlers (optional but helps in Jupyter)
    if logger.hasHandlers():
        logger.handlers.clear()

    # Console handler
    ch = logging.StreamHandler()
    ch.setLevel(level)
    ch.setFormatter(formatter)
    logger.addHandler(ch)

    # Optional file handler with separate level
    if log_to_file:
        fh = logging.FileHandler(filename)
        fh.setLevel(file_level if file_level else level)
        fh.setFormatter(formatter)
        logger.addHandler(fh)

    return logger

Usage

logger = setup_logger("mylog", level=10, log_to_file=True, file_level=30) # debug=10, warning=30
logger.info("30>info=20>= 10, go to console but NOT file")
logger.error("error=40 >= 30, go to console and file")