Пример хорошего решения для меня при использовании системной библиотеки logging. Для каждого модуля можно создавать свой логгер
import logging
import os
# Путь к файлу в котором хранится лог сообщений
logFileName = './log/log.log'
# Формат сообщения
# Пример: [07.03.2023 21:55:01] - main_process - DEBUG This is a debug message
format = '[%(asctime)s] - %(name)s - %(levelname)-8s %(message)s'
# Базовая конфигурация Ограничение уровня логирования
# формат даты сообщения
# имя файла для лога
# сообщения добавляются в файл
logging.basicConfig(level=logging.DEBUG,
format=format,
datefmt='%m.%d.%Y %H:%M:%S',
filename=logFileName,
filemode='a')
# Обработчик для трансляции в консоль
consoleHandler = logging.StreamHandler()
# Ограничение уровня логирования
consoleHandler.setLevel(logging.INFO)
formatter = logging.Formatter(format)
# Формат сообщения
consoleHandler.setFormatter(formatter)
# Добавление обработчика для трансляции в консоль в базовый (root) логер
logging.getLogger('').addHandler(consoleHandler)
# Создание именованного экземпляра логера для текущего модуля
logger = logging.getLogger('main_process')
logger.debug('This is a debug message') #DEBUG тип сообщения не будет отображаться если базовая настройка уровня логирования выше чем DEBUG
logger.warning('This is a warning message')#WARNING тип сообщения не будет отображаться если базовая настройка уровня логирования выше чем WARNING
Что выводится в консоль:
[07.03.2023 22:34:31] - main_process - DEBUG This is a debug message
[07.03.2023 22:34:31] - main_process - WARNING This is a warning message
Далее код создания отдельного именованного логгера для любого модуля
import logging
# Создание именованного экземпляра логера для текущего модуля
module_logger = logging.getLogger('spam_service.spam')
# Используем экземпляр логгера в функции
def some_function():
module_logger.info('received a call to "some_function"')
Что выводится в консоль (при вызове функции some_function):
[07.03.2023 22:34:31] - spam_service.spam - INFO received a call to "some_function"