B20 - logging

import logging

logging.info("information")

log levels

logging.basicCongig(level = logging.INFO)

custom logger

import logging

handler = logging.StreamHandler()
formatter = logging.Formatter("%(asctime)s - %(levelname)s - %(message)s")
handler.setFormatter(formatter)

custom_logger = logging.getLogger("custom_logger")
custom_logger.setLevel(logging.INFO)
custom_logger.addHandler(handler)

custom_logger.info("information")

exceptions

try:
	...
except exception as e:
	logging.exception("error message")

example usage

logging.basicConfig(
	level = logging.INFO,
	format = "%(asctime)s - %(levelname)s - %(message)s",
)
error_logger = logging.getLogger("error_logger")
info_logger   = logging.getLogger("info_logger")

error_logger.setLevel(logging.ERROR)
info_logger.setLevel(logging.INFO)

error_formatter = logging.Formatter("%(asctime)s - %(levelname)s - %(message)s")
info_formatter = logging.Formatter("%(levelname)s - %(message)s")

file_handler = logging.FileHandler("error.log") # file to log the errors
file_handler.setFormatter(error_formatter)

stream_handler = logging.StreamHandler() # logs in the terminal
stream_handler.setFormatter(info_formatter)

error_logger.addHandler(file_handler)
info_logger.addHandler(stream_handler)

loguru

pip install loguru

B20 - logging - loguru.png|500
image: Pluralsight, Douglas Starnes

import sys

from loguru import logger

a = 10
logger.info(f"the value of a is {a}")

b = 50
a = b
logger.success(f"the value of a has been updated to {b}")

## customising
logger.remove # removes existing handlers
logger.add(
	"logs/info_{time:YYYY-MM-DD_HH-mm-ss}.log", # log file
	rotation = "5 seconds", # creates a new log file every 5 secs
	retention = "30 seconds", # removes log files after 30 secs
	sys.stderr,
	format = "<yellow>{time: YYYY/MM/DD HH:mm}</yellow> - <b>{level}</b> - <i><green>{message}</i></green>",
	serealize = True,  # writes logs in JSON format
)

@logger.catch # logs error with detailed traceback
def ...