Logging

LevelNumberic Value
NOTSET0
DEBUG10
INFO20
WARNING30
ERROR40
CRITICAL50
import logging

dir(logging)
# items in all caps are constants
# capitalized items are classes
# lowercase are methods

# create an configure logger
logging.basicConfig(filename = "~/py.log")
logger = logging.getLogger()

# Test the logger
logger.info("our first message.")
print(logger.level) # Defaulted 30 so info and below is not shown
import logging

from rich.logging import RichHandler

logger = logging.getLogger(__name__)

# the handler determines where the logs go: stdout/file
shell_handler = RichHandler()
file_handler = logging.FileHandler("debug.log")

logger.setLevel(logging.DEBUG)
shell_handler.setLevel(logging.DEBUG)
file_handler.setLevel(logging.DEBUG)

# the formatter determines what our logs will look like
fmt_shell = '%(message)s'
fmt_file = '%(levelname)s %(asctime)s [%(filename)s:%(funcName)s:%(lineno)d] %(message)s'

shell_formatter = logging.Formatter(fmt_shell)
file_formatter = logging.Formatter(fmt_file)

# here we hook everything together
shell_handler.setFormatter(shell_formatter)
file_handler.setFormatter(file_formatter)

logger.addHandler(shell_handler)
logger.addHandler(file_handler)
  • To have aesthetic logging output easily: