Security Lab

Логи в Linux: как не утонуть в строках systemd и найти нужное за секунды

Логи в Linux: как не утонуть в строках systemd и найти нужное за секунды

Любая система, даже самая тихая и спокойная, любит поговорить о своих переживаниях. В Linux эти откровения записываются в журналы — от скромного /var/log/messages до многоголосья systemd-journal. Грамотно читать и анализировать логи — все равно что понимать язык собственного сервера: полезно, увлекательно и иногда спасает нервы и карьеру. Разберёмся, где живут сообщения, чем их читать и как превратить хаос строк в ценные инсайты.

Зачем вообще нужны журналы

Кто-то заводит дневник, чтобы вспоминать яркие моменты, а система пишет логи, чтобы администратор быстрее находил ту самую крошечную ошибку, которая валит сервис в час пик. Логи помогают:

  • отслеживать ошибки и сбои;
  • понимать поведение приложений под нагрузкой;
  • расследовать инциденты безопасности;
  • собирать статистику и создавать метрики.

Одним словом, журналы — это фонарик, освещающий закоулки системы. Остаётся научиться направлять луч туда, где темнее всего.

/var/log: старейшина семейства

До появления systemd почти все события складывались в каталог /var/log. Здесь и по сей день хранятся:

  • /var/log/messages — общие системные сообщения;
  • /var/log/auth.log или secure — аутентификация и sudo;
  • /var/log/kern.log — слово ядра;
  • лог веб-сервера в /var/log/nginx/ или apache2/;
  • и ещё дюжина файлов, о которых вспоминаешь, когда что-то идёт не так.

Чтение классических логов возможно старым, но надёжным набором инструментов: less, tail -f для «живого» чтения и могущественный grep. Например:

tail -f /var/log/auth.log | grep "Failed"

Скучно? Да, но работает даже на минималистичном rescue-дистрибутиве.

Переезд в эпоху systemd и journalctl

Когда systemd пришёл во многие дистрибутивы, он захотел единый источник правды о событиях. Так родился бинарный журнал, читаемый командой journalctl. Его плюсы:

  • централизованность — собирает сообщения ядра, сервисов и самого systemd;
  • метаданные — уровень важности, пользователь, PID, а иногда даже имя собаки разработчика (шутка, пока);
  • фильтрация по времени, сервису, приоритету без внешних скриптов.

Примеры, которые экономят седину:

# последние 50 строк лога сервиса sshd
 journalctl -u sshd -n 50
 
 # ошибки ядра за последние 30 минут
 journalctl -k --since "30 min ago" -p err
 
 # посмотреть, что было во время последней перезагрузки
 journalctl -b -1

А если хочется постоянной «текущей ленты»:

journalctl -f -u nginx.service

Настройка объёма журнала

По умолчанию журнал хранится в /var/log/journal и может разрастись. Меняем лимиты в /etc/systemd/journald.conf:

SystemMaxUse=1G
 RuntimeMaxUse=500M

После изменения нужно перезапустить демон:

systemctl restart systemd-journald

rsyslog: классик, который ещё в строю

rsyslog остаётся популярным, особенно если требуется отправка логов на удалённый сервер или специфичная фильтрация. Его конфигурация в /etc/rsyslog.conf и /etc/rsyslog.d/ может выглядеть страшновато, но правила отправки всего auth-трафика на центральный хост пишутся в пару строк:

auth.*  @log.example.com:514

Таким способом строятся корпоративные «соборчики» логов, где один хост собирает всё и вся. Кстати, если надо TLS, достаточно добавить два «@@».

Полезные приёмы фильтрации и поиска

Поскольку чтение логов руками часто превращается в охоту за нужной иголкой, важно уметь:

  1. Сужать временной окно: journalctl --since «2025-05-16 10:00:00» --until «2025-05-16 12:00».
  2. Фильтровать по приоритету: -p warning..crit — всё жёлтое и красное.
  3. Комбинировать критерии: время + юнит + PID.
  4. Убирать лишнее через grep -v или встроенный _PID фильтр.

Не забывайте про jq , если выводите журнал в JSON (journalctl -o json):

journalctl -u docker -o json | jq 'select(.MESSAGE | test("error"))'

Типичные сценарии: от «не включается Nginx» до «кто ломился в SSH»

Возьмём две популярные беды и кратко покажем, как логи помогают их разрешить.

Nginx не стартует после изменения конфигурации

journalctl -u nginx -n 20

Чаще всего увидите «bind() to 0.0.0.0:80 failed»: порт уже занят другой программой. lsof -i :80 быстро покажет виновника.

Подбор пароля к SSH

journalctl -u sshd -p warning --since yesterday | grep "Failed password"

Оттуда же легко вытащить IP-адреса злоумышленников и забанить их, например, через Fail2Ban .

Ротация и хранение: не дай диску лопнуть

Даже самые скромные логи умеют незаметно превратиться в пухлый роман. Тут вступает в силу logrotate. Проверяем конфигурацию:

cat /etc/logrotate.d/nginx
 /var/log/nginx/*.log {
     weekly
     rotate 4
     compress
     missingok
     notifempty
 }

Эта магия оставит четыре архивных файла и будет сжимать их в gzip. Запускаем вручную для проверки: logrotate -f /etc/logrotate.conf.

Анализ и визуализация: когда строк уже слишком много

Читать многомегабайтные журналы глазами — сомнительное удовольствие. На сцену выходят:

  • GoAccess — мгновенные отчёты по веб-логам;
  • Loki + Grafana — модное облако графиков;
  • Graylog — веб-интерфейс для больших инсталляций;
  • Logwatch — ежедневные email-отчёты «коротко о главном».

Подключить, скажем, Loki не труднее, чем первой попыткой собрать IKEA-шкаф: немного ругани, но результат того стоит. Достаточно настроить promtail, который читает локальные файлы и отправляет их в Loki. Графаны потом рисуют красивые панели, за которые шеф дарит плюсик к премии.

Безопасность логов

Не забывайте: журналы нередко содержат персональные данные и пароли в строке ошибок (да, мы знаем, что «так не должно быть», но бывает). Поэтому:

  • ограничьте доступ к каталогу /var/log правильными правами;
  • шлите логи на удалённый сервер, чтобы злоумышленник не мог их стереть локально;
  • маскируйте чувствительные данные фильтрами rsyslog или самого приложения;
  • регулярно проверяйте, какие данные уходят в журнал — иногда туда летит лишнее.

Заключение

Логи — как сплетни в офисной кухне: много лишнего шума, но среди него скрыта жизненно важная информация. Научившись фильтровать, сортировать и визуализировать события, вы сэкономите часы (а то и дни) на поиске причин сбоев. Используйте journalctl для оперативной диагностики, /var/log для привычной классики, rsyslog — когда нужна гибкость маршрутизации, а Loki или Graylog — чтобы приятно удивить менеджеров отчётами «в цвете». И пусть ваш сервер рассказывает только хорошие истории!

Linux логи журналирование journalctl rsyslog systemd анализ логов logrotate безопасность
Alt text
Обращаем внимание, что все материалы в этом блоге представляют личное мнение их авторов. Редакция SecurityLab.ru не несет ответственности за точность, полноту и достоверность опубликованных данных. Вся информация предоставлена «как есть» и может не соответствовать официальной позиции компании.

Твой код — безопасный?

Расскажи, что знаешь о DevSecOps.
Пройди опрос и получи свежий отчет State of DevOps Russia 2025.