Логи сайта: сбор и анализ логов доступа, ошибок и приложений

Логи сайта — это не «куча файлов», а три типа записей с совершенно разным назначением: логи доступа показывают, кто пришёл, логи ошибок — где всё упало, логи приложений — на каком этапе бизнес-процесса мы находимся. У всех трёх разные сроки хранения, инструменты анализа и пороги оповещений...

日志管理:访问、错误、应用三类,各有各的管法Log management: access, error and app logs are handled differently 反直觉:三类日志混在一起存,排障时一份都找不到Counter-intuitive: mixing three log types makes none findable 日志类型Type 看什么What 访问日志Access 谁访问了什么Who requested what 保留 90 天Keep 90 days 错误日志Error 哪里崩了、为什么Where it broke, why 保留 1 年Keep 1 year 应用日志App 业务流程走到哪Where the flow went 保留 30 天Keep 30 days 收集管道:写文件 → 按天切割 → 集中化 → 告警Pipeline: file -> daily rotate -> centralize -> alert 单人团队不必上 ELK,先把切割、集中、告警三件事做对Skip ELK solo; get rotation, centralization, alerting right first 红线:错误率连续 10 分钟超 1% 立即告警;日志不切割会撑爆磁盘Red line: error rate >1% for 10 min = alert; rotate or disk fills 排障顺序:先错误日志定位崩点,再访问日志看影响面,最后应用日志还原流程Triage: error log first, then access log, then app log
Три типа логов сайта: сроки хранения, конвейеры сбора и порядок диагностики для логов доступа, ошибок и приложений

Логи сайта: сбор и анализ логов доступа, ошибок и приложений

Сначала вывод: Логи сайта — это не «куча файлов», а три типа записей с совершенно разным назначением: логи доступа показывают, кто пришёл, логи ошибок — где всё упало, логи приложений — на каком этапе бизнес-процесса мы находимся. У всех трёх разные сроки хранения, инструменты анализа и пороги оповещений, а если хранить их вперемешку, не найдёте ни одного. Минимально рабочее решение — не разворачивать весь стек ELK, а сначала сделать три вещи правильно: разбивать по дням, собирать в одном месте, оповещать при доле ошибок выше 1%. Логи доступа храните 90 дней, логи ошибок — 1 год, логи приложений — 30 дней.

I. Каждый из трёх типов логов отвечает за своё — не смешивайте их

Многие сваливают все .log-файлы на сервере в одну кучу и при аварии перебирают их по одному. На самом деле три типа логов отвечают на три совершенно разных вопроса. Логи доступа (access.log в Nginx/Apache) отвечают на вопрос «кто, когда и что запросил»; логи ошибок (error.log в Nginx, ошибки PHP-FPM) — «где на сервере произошла ошибка»; логи приложения (log, который вы пишете в коде сами) — «на каком этапе обрабатывается заказ и почему не удалось».

Контринтуитивный вывод здесь такой:При аварии в продакшене меньше всего стоит начинать с логов доступа. Логи доступа объёмные и шумные — если смотреть их первыми, вы утонете в тысячах строк с кодом 200. Правильный порядок: сначала логи ошибок, чтобы найти точку сбоя, затем логи доступа, чтобы оценить масштаб (сколько пользователей, какие URL), и наконец логи приложения, чтобы восстановить ход бизнес-процесса. Это тот же подход, что и анализе логов AI-краулеров принцип «сначала разберись, кто тебя читает»: сначала классифицируй, потом анализируй.

Тип лога На какой вопрос отвечает Типичное расположение Рекомендуемый срок хранения
Логи доступа Кто, когда и что запросил Nginx access.log 90 дней горячих данных
Логи ошибок Где на сервере ошибка и почему Nginx error.log / ошибки PHP 1 год
Логи приложения На каком этапе бизнес-процесс и где застрял Пользовательский log в коде 30 дней
Системные логи События самого сервера /var/log/messages 30 дней

II. Конвейер сбора: из «разбросанных по файлам» в «одно место для поиска»

Типичная ситуация для команды из одного человека: отдельный лог у Nginx, отдельный у PHP, отдельный пишет само приложение — всё в разных каталогах, и после перезагрузки сервера или переезда на другую машину история обрывается. Первый шаг в управлении логами — не анализ, а собрать их в одном месте.

Пайплайн состоит из четырёх этапов: приложение пишет файлы, ротация по дням, сбор в одном месте, алерты на ошибки. Для ротации используйте logrotate с ежедневной разбивкой и gzip-сжатием, иначе один файл на несколько гигабайт просто не откроется. Для сбора начните с простого: rsyslog или лёгкий агент отправляет логи на отдельную машину или в облачный сервис логирования.

Команде из одного человека не стоит сразу тащить тяжёлый стек вроде ELK — достаточно централизованного хранилища и поискового интерфейса, а о большем задумайтесь, когда объём вырастет. Для CDN-сайтов нужно собирать и edge-логи, и логи origin — подробнее об этом в Глобальное ускорение CDN.

Этап Как сделать Инструмент / настройка Что будет, если не сделать
Запись файлов Единый формат вывода Формат combined Поля неполные, скрипты анализа писать сложно
Ротация Ежедневная ротация со сжатием logrotate Один файл слишком большой, диск переполняется
Централизация Сбор в одном хранилище rsyslog / облачные логи При смене машины история обрывается
Оповещения Уведомление по порогу ошибок Правила в системе мониторинга О проблеме узнаёте только из жалоб пользователей

III. Логи ошибок: за чем команде из одного человека следить в первую очередь

Из трёх типов логи ошибок дают больше всего информации на единицу объёма, и за ними стоит следить в первую очередь. В логах доступа — сотни тысяч строк в день, в логах ошибок — может быть всего несколько сотен, но каждая строка — это реальный сбой. Выделите логи ошибок в отдельное хранилище и настройте отдельные алерты — это даст максимальную отдачу.

Пороги задавайте конкретными числами: доля 5xx выше 1% в течение 10 минут подряд — алерт немедленно; единичная аномальная ошибка (например, сбой подключения к базе данных или сбой колбэка оплаты) — алерт при первом появлении, не дожидаясь накопления. Логи ошибок нужно разделять по уровням: warning просматривайте регулярно, error и critical требуют уведомления в реальном времени. В приложениях вроде PHP отдельно вылавливайте фатальные ошибки и медленные запросы.

Пример из практики: Однажды утром сработал алерт: доля 5xx подскочила с 0,1% до 3%. Сначала вы открываете логи ошибок и видите множество “PHP-FPM: unable to connect” — пул бэкенд-процессов переполнен. Затем по логам доступа смотрите, какие URL это вызвали, и обнаруживаете, что пул положил медленный запрос нового API. Наконец, по логам приложения определяете, какой именно это SQL. Локализация за десять минут — вот в чём ценность подхода, где логи ошибок идут первыми.

Уровень ошибки Пример Что делать Порог алерта
критично База данных недоступна, оплата не прошла Немедленное уведомление Алерт при первом появлении
ошибка 5xx, фатальные ошибки Уведомление в реальном времени > 1% за 10 минут
предупреждение Медленные запросы, повторы Ежедневный сводный просмотр Сводка при превышении базовой линии в 2 раза
уведомление Штатные бизнес-события Архивировать без алертов Без алертов

IV. Логи приложения: сделайте бизнес-процессы отслеживаемыми

Логи доступа и ошибок — это “объективная” запись сервера, но они не отвечают на бизнес-вопросы вроде “почему этот лид не попал в CRM”. Здесь и нужны логи приложения — вы сами пишете их в ключевых точках бизнес-процесса: лид отправлен, записан в базу данных, передан в CRM, обратная передача из CRM не удалась.

Главное в логах приложения — чтобы каждая запись несла бизнес-идентификатор: ID заявки или номер заказа. Тогда при сбое вы ищете по этому ID и собираете весь путь сделки от отправки до завершения. Не пишите бессмысленные логи (“дошли до 10-й строки”) — каждая запись должна отвечать на бизнес-вопрос. Держите объём логов в пределах нескольких десятков МБ в день, не пишите тело запроса целиком: это и медленно, и раскрывает персональные данные.

Стоит упомянуть и связь производительности с логами: слишком много записей и синхронная запись на диск на каждом запросе сами по себе замедляют ответ. Как смотреть метрики медленных ответов, см.Core Web Vitals. Общая схема мониторинга и алертов — см.Мониторинг сайта и оповещения.

Бизнес-этап Что записывать Идентификатор Как искать при сбое
Отправка заявки Поля формы, страница-источник ID заявки Поиск записи по ID
Запись в базу Успешно / ошибка ID заявки Проверить, попала ли в базу
Отправка в CRM Код ответа API, время выполнения ID заявки Проверить, приняла ли CRM
Уведомление по email Успешно / ошибка ID заявки Проверить, получил ли менеджер

Пять. Подводные камни: три самые частые ошибки в работе с логами

Первый камень — “не ротировать и не хранить”. Лог пишется в один файл, через три месяца это несколько гигабайт: grep при разборе зависает на полминуты, а то и диск забивается под ноль и сайт падает. Ротация по дням плюс политика хранения — это минимум.

Второй камень — “хранить только свежее, без архива”. Диск заполнился — удаляем самое старое, и когда нужно найти начало того сбоя двухмесячной давности, данных просто нет. Горячие данные храните 90 дней, просроченные сжимайте в архив минимум на год — это стоит копейки. Третий камень — “чувствительные данные в логах”. Пароли пользователей и полные номера карт в логах — это ещё один источник утечки в вашем лог-хранилище. Чувствительные поля маскируйте или не пишите на диск.

Частая ошибка Внешнее проявление Реальная проблема Как исправить
Без ротации Файл растёт Диск забит, поиск медленный logrotate по дням
Без истории Диск заполнился — удаляем Нечего восстановить Горячие 90 дней, архив 1 год
Чувствительные данные Логи удобны для отладки Лог-хранилище становится источником утечки Маскировать чувствительные поля
Три типа в одной куче При сбое перебирать всё подряд Долгий поиск, много шума Сначала ошибки, поиск по категориям

FAQ: частые вопросы

Обязательно ли интернет-магазину ставить ELK?
Нет. Команде из одного человека сразу поднимать ELK — избыточно. Минимально рабочее решение — сделать правильно три вещи: ротировать логи по дням, собрать их в одном месте через rsyslog или облачный сервис логов и настроить алерты по частоте ошибок. Эти три шага настраиваются готовыми инструментами за полдня. Задумываться об ELK или коммерческом сервисе логов стоит только когда логов становится несколько ГБ в день и нужен поиск для нескольких человек и анализ трендов за длительный период.
Почему логи доступа, ошибок и приложения нельзя держать вместе?
Потому что они отвечают на совершенно разные вопросы. Лог доступа отвечает, кто пришёл, лог ошибок — где сломалось, лог приложения — на каком шаге остановился бизнес-процесс. Если всё свалить в кучу, при инциденте придётся искать несколько ключевых строк среди сотен тысяч строк шума — крайне неэффективно. Храните, индексируйте и задавайте срок хранения раздельно: при разборе сначала смотрите лог ошибок, чтобы найти точку сбоя, затем лог доступа, чтобы оценить масштаб, и наконец лог приложения, чтобы восстановить ход процесса.
Сколько хранить каждый тип логов?
Горячие данные лога доступа — 90 дней, дальше сжатие и архив. Лог ошибок — 1 год, потому что при разборе инцидентов и безопасности часто нужно вернуться на несколько месяцев назад. Лог приложения — достаточно 30 дней: объём большой, а нужен он только для недавних бизнес-разборов. При ежедневной ротации и gzip-сжатии год логов обычно занимает всего несколько ГБ — не стоит жертвовать историей ради экономии места.
Как задать пороги алертов для лога ошибок?
Два уровня. Если доля ошибок 5xx держится выше 1% десять минут подряд — алерт в реальном времени; здоровое значение должно быть ниже 0,5%. Ошибка уровня critical (нет связи с базой, не прошёл платёжный колбэк) — алерт при первом же появлении, без накопления. Уровень warning (медленные запросы, временные повторы) в реальном времени не уведомляет — смотрите сводку раз в день. После запуска откалибруйте пороги по реальной базовой линии: лучше строже, чем мягче, — лишь бы не пропустить настоящий сбой.
Насколько подробно писать лог приложения и не ударит ли это по производительности?
Пишите в ключевых точках бизнес-процесса, каждую запись снабжайте ID заявки или заказа, но не вставляйте всё тело запроса. Синхронная запись на диск сама по себе имеет цену — используйте асинхронный лог или буфер. Держите суточный объём в пределах десятков МБ. Принцип такой: каждая запись должна отвечать на какой-то бизнес-вопрос, а бессмысленные отладочные строки (дошли до такой-то строки) удаляйте перед выкладкой.
Можно ли писать в логи пароли и платёжные данные?
Категорически нет. Логи хранятся централизованно, долго и доступны для поиска многим — записать туда пароль или полный номер карты значит создать ещё один источник утечки в самом хранилище логов. Чувствительные поля всегда маскируйте или не пишите на диск: например, у карты оставляйте только последние четыре цифры. И сами логи ограничивайте по правам доступа — не каждый должен рыться в логе приложения, особенно если там бизнес-данные.

В заключение

Ценность управления логами не в том, «сколько накопили», а в том, «можно ли за три минуты найти причину при инциденте». Если вы ведёте сайт в одиночку, разделите три типа логов, настройте ежедневную ротацию с централизацией и алерт при доле ошибок выше 1% — с этой базой время на повседневный разбор упадёт с «полдня копания в логах» до «взглянуть на алерт». Тяжёлые платформы для логов — дело будущего, когда вырастете, а не обязательное условие на старте.

Три шага на практике. Первый: разделите логи доступа, ошибок и приложений по разным хранилищам и задайте для каждого свой срок хранения с ежедневной ротацией. Второй: соберите их в одном месте через rsyslog или облачный сервис логирования, чтобы можно было искать по бизнес-ID. Третий: настройте алерты — если доля ошибок за 10 минут превышает 1% или появилась хотя бы одна ошибка уровня critical. После этих трёх шагов вы перестанете узнавать о проблемах на проде от жалоб пользователей и начнёте узнавать о них первыми. Ритм обслуживания можно сверить с графиком обслуживания сайта и спланировать вместе.

Запомните одну фразу: логи — это не файлы на диске для ностальгии, а видеорегистратор места аварии. Если их не разложить по категориям и не собрать в одном месте, при инциденте останется только гадать по памяти.

crater
crater Эксперт Crater

Официальный аккаунт организации · crater Crater

环形山 (Crater) — компания, которая помогает выходить на зарубежные рынки: разработка сайтов на WordPress, Google SEO и комплексный рост в GEO. Мы работаем с умными устройствами, промышленным оборудованием, SaaS и новой энергетикой.

Возможности продуктаБелая книга по методологииОтраслевые отчёты
965篇分享
78статей в базе знаний