Логи: просмотр и анализ

Просмотр и анализ логов — базовый навык отладки на сервере: tail, grep, journalctl и просмотр логов Docker/Nginx позволяют быстро найти причину проблемы.

Зачем нужно

Когда приложение работает неправильно в продакшне, логи — первое место где искать причину. Умение быстро найти нужное сообщение в потоке логов, отфильтровать ошибки и сопоставить время события критично для минимизации времени простоя.

Где используется

  • Отладка ошибок в продакшне — поиск exception в логах приложения
  • Анализ Nginx access logs для поиска медленных запросов
  • systemd journalctl для диагностики упавшего сервиса
  • Docker logs для просмотра вывода контейнеров

Основной контент

Базовые команды просмотра логов

# Просмотр файла логов
tail -f /var/log/nginx/error.log          # следить в реальном времени
tail -n 100 /var/log/nginx/access.log    # последние 100 строк
less /var/log/myapp/app.log              # постраничный просмотр
cat /var/log/myapp/app.log               # весь файл (осторожно с большими!)

# Поиск в логах
grep "ERROR" /var/log/myapp/app.log
grep -i "error\|exception\|fatal" /var/log/myapp/app.log   # case-insensitive
grep "2026-04-10 14:" /var/log/myapp/app.log  # логи за конкретный час

# Комбинирование
tail -n 1000 /var/log/nginx/access.log | grep "POST /api"
tail -f /var/log/myapp/app.log | grep --line-buffered "ERROR"

journalctl (systemd логи)

# Логи конкретного сервиса
journalctl -u myapp
journalctl -u myapp -f              # follow
journalctl -u myapp -n 50           # последние 50 строк
journalctl -u myapp --since "2026-04-10 14:00" --until "2026-04-10 15:00"
journalctl -u myapp -p err          # только ошибки (err, warning, info)

# Логи с момента последнего запуска
journalctl -u myapp -b

# Логи нескольких сервисов
journalctl -u nginx -u myapp -f

Docker логи

docker logs mycontainer              # все логи
docker logs mycontainer -f           # follow
docker logs mycontainer --tail 100   # последние 100
docker logs mycontainer --since 1h   # за последний час
docker logs mycontainer 2>&1 | grep "ERROR"  # stderr + stdout + grep

# docker-compose
docker compose logs -f api
docker compose logs --tail 50 api

Анализ Nginx access.log

# Топ IP по запросам
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head 10

# Медленные запросы (если настроен $request_time)
awk '$NF > 2' /var/log/nginx/access.log   # запросы > 2 секунды

# Подсчёт HTTP-кодов
awk '{print $9}' /var/log/nginx/access.log | sort | uniq -c | sort -rn

# Запросы за последний час
awk -v date="$(date '+%d/%b/%Y:%H')" '$4 ~ date' /var/log/nginx/access.log | wc -l

JSON-логи из Node.js

// Структурированное логирование с winston
const winston = require('winston');

const logger = winston.createLogger({
  format: winston.format.combine(
    winston.format.timestamp,
    winston.format.json()    // JSON формат проще парсить
  ),
  transports: [new winston.transports.Console],
});

logger.info('Request processed', { userId: 123, duration: 45, endpoint: '/api/users' });
// {"level":"info","message":"Request processed","userId":123,"duration":45,...}
# Парсинг JSON-логов через jq
docker logs myapp | jq 'select(.level == "error")'
journalctl -u myapp --output=cat | jq '.message'

Частые ошибки

  • Писать логи в файл на продакшне без ротации — диск заполняется, сервер падает (использовать logrotate или winston daily rotate)
  • Логировать чувствительные данные (пароли, токены, персональные данные) в открытом виде
  • cat большого файла логов — зависает терминал; использовать less или tail
  • Нет временных меток в логах — невозможно сопоставить события

Связанные темы

Ресурсы