← Назад к вопросам

В чем отличие между log и error log в контексте логирования в Python?

1.0 Junior🔥 161 комментариев
#Python Core

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

# Различие между log и error log в Python логировании

В Python логировании существует система уровней (levels), и log/error log — это просто разные уровни логирования. Разберу подробно разницу и когда что использовать.

Уровни логирования в Python

Python имеет 5 основных уровней (от менее критичных к более критичным):

import logging

logging.DEBUG    # 10 - самая детальная информация для диагностики
logging.INFO     # 20 - основные события (запуск, завершение)
logging.WARNING  # 30 - предупреждения (что-то подозрительное)
logging.ERROR    # 40 - ошибки (что-то сломалось)
logging.CRITICAL # 50 - критические ошибки (система не может работать)

Структура логирования

log           — общий термин для всех записей логирования
error log     — конкретный тип логирования (запись об ошибке)

Это похоже на:

животное      — общая категория
собака         — конкретный тип животного

Практические примеры

Базовое использование

import logging

# Конфигурируем логирование
logging.basicConfig(level=logging.INFO)

logger = logging.getLogger(__name__)

# Разные уровни логирования
logger.debug("Отладочная информация")      # НЕ выведется (уровень INFO)
logger.info("Приложение запустилось")     # ВЫВЕДЕТСЯ
logger.warning("Это предупреждение")       # ВЫВЕДЕТСЯ
logger.error("Ошибка при обработке")      # ВЫВЕДЕТСЯ
logger.critical("Система упала!")         # ВЫВЕДЕТСЯ

Пример: обработка исключений

import logging

logger = logging.getLogger(__name__)

def divide(a, b):
    try:
        result = a / b
        logger.info(f"Деление успешно: {a} / {b} = {result}")  # general log
        return result
    except ZeroDivisionError as e:
        logger.error(f"Ошибка деления: {e}")  # ERROR LOG
        return None
    except Exception as e:
        logger.critical(f"Непредвиденная ошибка: {e}")  # CRITICAL
        raise

divide(10, 2)  # INFO: Деление успешно
divide(10, 0)  # ERROR: Ошибка деления

Разница между log() и error()

Метод logger.log()

# log() — универсальный метод с явным указанием уровня
logger.log(logging.DEBUG, "Отладка")      # уровень явно указан
logger.log(logging.INFO, "Инфо")          # уровень явно указан
logger.log(logging.ERROR, "Ошибка")       # уровень явно указан

# Это то же самое, что:
logger.debug("Отладка")
logger.info("Инфо")
logger.error("Ошибка")

Метод logger.error()

# error() — специализированный метод для ОШИБОК
logger.error("Что-то пошло не так")

# Это эквивалентно:
logger.log(logging.ERROR, "Что-то пошло не так")

Когда использовать что

logger.info() / logger.debug() / logger.warning()

import logging
logger = logging.getLogger(__name__)

# ИНФОРМАЦИОННОЕ логирование
logger.info("Приложение запустилось на порту 8000")
logger.info("Пользователь john_doe вошёл в систему")
logger.info("Данные успешно загружены из БД")

# ОТЛАДОЧНОЕ логирование
logger.debug("Переменная x = 42")
logger.debug("Запрос SQL: SELECT * FROM users WHERE id = 1")

# ПРЕДУПРЕЖДЕНИЯ
logger.warning("Размер памяти выше 80%")
logger.warning("Сессия истекает через 5 минут")

logger.error()

import logging
logger = logging.getLogger(__name__)

def save_user(user_data):
    try:
        # бизнес логика
        db.save(user_data)
        logger.info("Пользователь успешно сохранён")  # успех
    except ValidationError as e:
        logger.error(f"Ошибка валидации: {e}")  # ОШИБКА - что-то сломалось
    except DatabaseError as e:
        logger.error(f"Ошибка БД: {e}")         # ОШИБКА - что-то сломалось
        logger.critical("Связь с БД потеряна")  # КРИТИЧНО - система не может работать

Полный пример приложения

import logging
from logging.handlers import RotatingFileHandler

# Конфигурация логирования
logger = logging.getLogger('myapp')
logger.setLevel(logging.DEBUG)

# Формат логов
formatter = logging.Formatter(
    '%(asctime)s - %(name)s - %(levelname)s - %(message)s'
)

# Файловый обработчик
file_handler = RotatingFileHandler('app.log', maxBytes=1MB, backupCount=5)
file_handler.setLevel(logging.ERROR)  # В файл только ошибки
file_handler.setFormatter(formatter)

# Консольный обработчик
console_handler = logging.StreamHandler()
console_handler.setLevel(logging.INFO)  # В консоль все выше INFO
console_handler.setFormatter(formatter)

logger.addHandler(file_handler)
logger.addHandler(console_handler)

# Использование
def process_payment(amount):
    logger.info(f"Начинаю обработку платежа {amount} руб")  # log
    
    try:
        if amount <= 0:
            logger.warning(f"Сумма недопустимая: {amount}")
            return False
        
        # обработка платежа
        logger.debug(f"Сумма валидна: {amount}")
        logger.info(f"Платёж успешно обработан: {amount} руб")
        return True
    except NetworkError as e:
        logger.error(f"Ошибка сети при платеже: {e}")  # error log
        return False
    except Exception as e:
        logger.critical(f"Непредвиденная ошибка: {e}")
        raise

process_payment(100)   # INFO: успех
process_payment(-50)   # WARNING: предупреждение
process_payment(None)  # ERROR: ошибка

Различие в обработке

import logging

logger = logging.getLogger(__name__)

# Обычное логирование
logger.info("Всё работает нормально")

# Логирование с трейсом исключения
try:
    result = 10 / 0
except ZeroDivisionError:
    logger.error("Ошибка деления", exc_info=True)  # выведет полный стек
    # OUTPUT:
    # ERROR - Ошибка деления
    # Traceback (most recent call last):
    #   File "script.py", line 3, in <module>
    #     result = 10 / 0
    # ZeroDivisionError: division by zero

Когда что использовать

УровеньКогдаПример
DEBUGИнформация для разработчикаЗначение переменной, SQL запрос
INFOВажные событияЗапуск app, пользователь залогинился
WARNINGПодозрительно, но работаетМедленный запрос, низкая память
ERRORОшибка, но app продолжает работатьОшибка валидации, БД недоступна
CRITICALОшибка, app может упастьОшибка инициализации, нет диска

Фильтрация по уровню

import logging

logger = logging.getLogger(__name__)

# В PRODUCTION: только WARNING и выше
logger.setLevel(logging.WARNING)

# В DEVELOPMENT: всё до DEBUG
logger.setLevel(logging.DEBUG)

# Это значит:
logger.info("Это не выведется")      # < WARNING
logger.warning("Это выведется")      # >= WARNING
logger.error("Это выведется")        # >= WARNING

Резюме

log — общий термин для всех записей логирования (info, warning, error, debug)

error log — конкретный тип логирования для ошибок (logging.ERROR уровень)

Важно выбирать правильный уровень:

  • INFO для успешных операций
  • ERROR для ошибок, которые нужно исправить
  • WARNING для проблем, требующих внимания
  • DEBUG для разработки

Правильное логирование помогает быстро найти проблемы и понять, что случилось в production.

В чем отличие между log и error log в контексте логирования в Python? | PrepBro