- Уровни логирования (по возрастанию важности):
DEBUG
(10): Детальная информация, интересная только при отладке.INFO
(20): Подтверждение, что всё работает как ожидается.WARNING
(30): Указание на неожиданное событие или потенциальную проблему в будущем (например, нехватка места). Программа продолжает работать. (Уровень по умолчанию).ERROR
(40): Серьезная проблема, из-за которой программа не смогла выполнить какую-то функцию.CRITICAL
(50): Очень серьезная ошибка, программа, возможно, не сможет продолжать работу.
- Базовая конфигурация (
logging.basicConfig
): Простой способ настроить логирование (вызывается один раз).import logging logging.basicConfig( level=logging.DEBUG, # Минимальный уровень сообщений для обработки format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', # Формат сообщения # filename='app.log', # Запись в файл вместо консоли # filemode='w' # 'w' - перезапись, 'a' - дозапись (по умолчанию) ) logging.debug('Это сообщение DEBUG') logging.info('Это сообщение INFO') logging.warning('Это сообщение WARNING')
- Логгеры (
Logger
): Объекты, через которые отправляются сообщения.- Получение логгера:
logger = logging.getLogger(__name__)
(рекомендуется использовать__name__
для иерархии). - Корневой логгер:
logging.getLogger()
или простоlogging
. - Методы для отправки сообщений:
logger.debug()
,logger.info()
,logger.warning()
,logger.error()
,logger.critical()
,logger.exception()
(какerror
, но добавляет traceback).
- Получение логгера:
- Наследование и Иерархия:
- Логгеры образуют иерархию, основанную на именах, разделенных точками (e.g.,
logging.getLogger('app.ui.button')
). - Сообщения, отправленные дочерним логгером, по умолчанию передаются родительским логгерам (до корневого).
logger.propagate = False
отключает это. - Уровень логгера (
logger.setLevel()
) определяет, сообщения какого уровня этот логгер будет обрабатывать (и передавать дальше).
- Логгеры образуют иерархию, основанную на именах, разделенных точками (e.g.,
- Обработчики (
Handler
): Определяют, куда отправлять лог-сообщения.- Логгер может иметь несколько обработчиков.
- Примеры:
logging.StreamHandler(stream=None)
(вывод в поток, по умолчаниюsys.stderr
),logging.FileHandler(filename, mode='a', encoding=None, delay=False)
,logging.handlers.RotatingFileHandler
,logging.handlers.TimedRotatingFileHandler
. - Добавление:
logger.addHandler(my_handler)
- Удаление:
logger.removeHandler(my_handler)
- Уровень обработчика (
handler.setLevel()
): Определяет минимальный уровень сообщений, которые этот обработчик будет выводить.
- Форматтеры (
Formatter
): Определяют формат вывода лог-сообщений.- Создание:
formatter = logging.Formatter(fmt=None, datefmt=None, style='%')
fmt
: Строка формата сообщения.datefmt
: Формат даты/времени для%(asctime)s
.style
: Стиль форматирования ('%'
,'{'
,'$'
).'%'
- по умолчанию.
- Атрибуты формата (основные):
%(asctime)s
,%(created)f
,%(filename)s
,%(funcName)s
,%(levelname)s
,%(levelno)s
,%(lineno)d
,%(message)s
,%(module)s
,%(msecs)d
,%(name)s
,%(pathname)s
,%(process)d
,%(thread)d
,%(threadName)s
. - Применение к обработчику:
my_handler.setFormatter(formatter)
- Пример настройки с обработчиком и форматтером:
import logging import sys # 1. Создать (или получить) логгер logger = logging.getLogger('my_app') logger.setLevel(logging.DEBUG) # Уровень логгера # 2. Создать обработчик(и) console_handler = logging.StreamHandler(sys.stdout) console_handler.setLevel(logging.INFO) # Уровень обработчика file_handler = logging.FileHandler('detailed.log', mode='w', encoding='utf-8') file_handler.setLevel(logging.DEBUG) # 3. Создать форматтер(ы) # style='{' - позволяет использовать f-string-подобный формат console_format = logging.Formatter( fmt='{levelname: <8} - {name} - {message}', style='{' ) file_format = logging.Formatter( fmt='{asctime} | {levelname: <8} | {name} | {filename}:{lineno} | {message}', datefmt='%Y-%m-%d %H:%M:%S', style='{' ) # 4. Добавить форматтеры к обработчикам console_handler.setFormatter(console_format) file_handler.setFormatter(file_format) # 5. Добавить обработчики к логгеру # Избегаем дублирования, если скрипт запускается много раз (в Jupyter) if not logger.hasHandlers(): logger.addHandler(console_handler) logger.addHandler(file_handler) # 6. Логирование logger.debug('Детальное сообщение для файла') logger.info('Информационное сообщение для консоли и файла') logger.warning('Предупреждение')
- Создание:
〰〰〰 𓆝 𓆟 𓆞 𓆝 𓆟 𓆝 𓆟 𓆞 〰〰〰