Логи: просмотр и анализ
Просмотр и анализ логов — базовый навык отладки на сервере:
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- Нет временных меток в логах — невозможно сопоставить события
Связанные темы
- _MOC DevOps
- Логирование -- ELK stack
- systemd -- управление сервисами
- Мониторинг -- Prometheus и Grafana