Где лежат логи Linux: /var/log, dmesg и rsyslog

Рейтинг: 72.2% · 10 голосов
Подробный курс по диагностике и производительности Linux для админов и DevOps: с чего начать, методология USE, логи (journalctl, dmesg), процессы, CPU, память и OOM, диск и IO (iostat), сеть (ss, tcpdump), системные вызовы и strace, ltrace, perf, флеймграфы, ftrace, eBPF и bpftrace, lsof, мониторинг. Разбор каждого инструмента с чтением вывода.
Ответить
Аватара пользователя
Dmitry_SRE
Сообщения: 47
Зарегистрирован: 11 май 2026, 05:31

Где лежат логи Linux: /var/log, dmesg и rsyslog

Сообщение Dmitry_SRE »

Оглавление курса (47)
  1. С чего начать диагностику Linux: методология вместо паники
  2. Первые 60 секунд: экспресс-диагностика нагруженного сервера
  3. Методологии диагностики: USE, RED и здравый смысл
  4. Логи systemd через journalctl: где искать причину
  5. Где лежат логи Linux: /var/log, dmesg и rsyslog (вы здесь)
  6. Источники правды: load average, /proc и /sys
  7. Процессы Linux: ps, pstree и состояния процессов
  8. Интерактивный мониторинг: top и htop
  9. Метрики процессов во времени: pidstat
  10. Приоритеты и ограничения: nice, ionice, cgroups
  11. Сигналы и зависшие процессы: kill, и что делать с D-state
  12. Загрузка CPU: user, system, iowait, steal и контекст-свитчи
  13. Диагностика CPU по ядрам: vmstat и mpstat
  14. Профилирование CPU: perf top и поиск пожирателя
  15. Частоты, троттлинг и NUMA: turbostat и numastat
  16. Память Linux: RSS, VSZ, page cache и миф о нехватке памяти
  17. Сколько памяти занято: free, /proc/meminfo и vmstat
  18. Поиск утечек и пожирателей памяти: smem, pmap, smaps
  19. Swap и подкачка: swapon, swappiness, когда своп - это боль
  20. OOM killer: кто и за что убил процесс
  21. Память ядра и slab: slabtop и куда уходит RAM
  22. Подсистема ввода-вывода: путь запроса от приложения до диска
  23. Диагностика диска: iostat и чтение await, %util
  24. Кто грузит диск: iotop и атрибуция io процессам
  25. Файловые системы: df, du, иноды и куда делось место
  26. Глубокая диагностика блочного слоя: blktrace и biolatency
  27. Кеш страниц и грязные данные: dirty pages, fsync, drop_caches
  28. Сетевой стек Linux: путь пакета и где возникают задержки
  29. Сокеты и соединения: ss и netstat
  30. Захват трафика: tcpdump для диагностики сети
  31. Задержки и потери в сети: ping, mtr, диагностика латентности
  32. Сеть как источник проблем: nftables, conntrack, дропы
  33. Что такое системный вызов и зачем его трассировать
  34. strace: трассировка системных вызовов на практике
  35. strace в бою: почему программа висит, падает или тормозит
  36. ltrace: трассировка вызовов библиотек
  37. Накладные расходы трассировки и безопасные альтернативы
  38. perf: универсальный профайлер Linux
  39. Флеймграфы: визуализация профиля производительности
  40. Трассировка ядра: ftrace и trace-cmd
  41. eBPF: революция в наблюдаемости Linux
  42. Инструменты eBPF на практике: BCC и bpftrace
  43. lsof: открытые файлы, дескрипторы, кто держит файл и порт
  44. Разбор кейса: приложение тормозит - пошаговая диагностика
  45. Непрерывный мониторинг: sar, node_exporter, Grafana, Zabbix
  46. Диагностика в контейнерах: cgroups, лимиты, Docker и Kubernetes
  47. Карта инструментов и сквозной разбор инцидента производительности
Сервер тормозит, сервис не поднимается, диск ведёт себя странно, а ты сидишь и гадаешь. Так вот: гадать не надо. Linux практически про всё пишет в логи - надо лишь знать, где смотреть. Половина "магических" проблем разруливается за пять минут, если открыть правильный источник и прочитать там обычными словами, что именно пошло не так. На 2026 год тут есть нюанс: классические текстовые файлы в /var/log на современных дистрибутивах все чаще уступают место бинарному журналу systemd-journald, и опытный админ держит в голове обе картины сразу.

Этот урок - база. Разберем три кита: кольцевой буфер ядра и команду dmesg, каталог /var/log с его файлами, и демон rsyslog, который раскладывает сообщения по полочкам. И отдельно - как это все стыкуется с journald на современном Linux с systemd. После урока на вопрос "где логи Linux" ты будешь отвечать не "ну где-то в var", а точно знать, куда смотреть под конкретную задачу.

Кольцевой буфер ядра и команда dmesg

Сначала про ядро. Когда Linux грузится, само ядро еще до старта всех сервисов уже работает: находит процессоры, инициализирует драйверы, видит диски и сетевые карты. Все эти сообщения оно складывает в специальную область памяти - кольцевой буфер (kernel ring buffer). Кольцевой потому, что размер у него фиксированный (задается параметром log_buf_len, по умолчанию обычно сотни килобайт): когда буфер заполняется, новые записи затирают самые старые. Это не файл на диске, это кусок оперативки. Отсюда главное следствие: на нагруженном сервере, который сыпет сообщениями, dmesg может уже не содержать того, что было час назад.

Читается буфер командой dmesg (от "display message"). Запускай ее, когда речь про железо, драйверы, диски, сеть на низком уровне или загадочные убийства процессов нехваткой памяти (OOM). Это первое место, куда смотрит опытный админ при словах "сервер сам перезагрузился" или "диск отвалился".

Голый dmesg выводит время в секундах с момента загрузки ("[12345.67]") - читать неудобно. Поэтому почти всегда добавляют -T (человеческое время):

Код: Выделить всё

sudo dmesg -T | tail -20
Маленький нюанс на 2026: -T берет за основу текущее системное время и вычитает аптайм, поэтому после перевода часов или большого сдвига времени метки могут "плыть" на пару секунд. Для точного машинного формата без этой проблемы есть dmesg --time-format=iso, который дает абсолютное время в ISO-формате.

Кусок вывода и как его читать:

Код: Выделить всё

[Sun Jun 14 03:12:44 2026] EXT4-fs (sda1): mounted filesystem with ordered data mode
[Sun Jun 14 09:41:02 2026] usb 1-2: new high-speed USB device number 4 using xhci_hcd
[Sun Jun 14 11:07:55 2026] Out of memory: Killed process 2841 (mysqld) total-vm:4193280kB, anon-rss:3905120kB
В квадратных скобках - время (благодаря -T уже нормальное). Дальше - подсистема и текст. Первая строка норма: смонтировалась файловая система ext4. Вторая - воткнули USB, тоже норма. А третья - тревога: ядро убило процесс mysqld, потому что в системе кончилась память (это сработал OOM killer). Тут же видно total-vm (сколько виртуальной памяти держал процесс) и anon-rss (сколько реально занимал в RAM) - вот тебе и причина, почему "база данных вдруг упала". Рядом обычно есть строка oom-kill с cgroup-контекстом: на 2026 году почти все живет в cgroup v2, и по полю oom_memcg видно, в каком именно контейнере или слайсе кончилась память.

Когда сообщений много, фильтруй по уровню важности. Запрос dmesg error решается флагом -l (он же --level):

Код: Выделить всё

sudo dmesg -T --level=err,warn,crit
Уровни идут от самого громкого к тихому: emerg, alert, crit, err, warn, notice, info, debug. Тебе обычно интересны от warn и выше. На 2026 в util-linux есть удобный синтаксис с плюсом - "уровень и все, что серьезнее": dmesg --level=err+ покажет err, crit, alert и emerg одной командой. Универсальный "сломалось ли что-нибудь" выглядит так:

Код: Выделить всё

sudo dmesg -T --level=err+
Если хочешь следить за сообщениями в реальном времени (например, втыкаешь устройство или гоняешь нагрузку и ждешь ошибок), есть -w (--follow), как tail -f:

Код: Выделить всё

sudo dmesg -T -w
Команда не завершится - будет висеть и дописывать новые строки ядра по мере появления. Выход - Ctrl+C. На что смотреть в dmesg kernel-выводе по делу: I/O error и blk_update_request - проблемы с диском; строки с ata или nvme и словом error - сбои контроллера или накопителя; segfault - падение программы по обращению к чужой памяти; Link is Down или NIC Link is Up - сеть; call trace - паника или ошибка в ядре; и упомянутый Out of memory - нехватка памяти. Под root dmesg обычно и нужен: с 2018 года на большинстве ядер буфер закрыт от обычных юзеров параметром kernel.dmesg_restrict=1, и без sudo ты получишь Operation not permitted.

Изображение

Каталог /var/log: где какие лог файлы Linux лежат

dmesg - это только ядро и только то, что сейчас в памяти. История и все остальное живут на диске, в каталоге /var/log. Это главный адрес, когда спрашивают, где логи Linux. Глянем, что там есть:

Код: Выделить всё

ls -lh /var/log
Состав отличается по дистрибутивам, но логика одна. Запоминай не файлы, а "куда смотреть под задачу":
  • Кто входил, неудачные пароли, sudo, ssh - /var/log/auth.log (Debian, Ubuntu, Astra Linux) или /var/log/secure (RHEL, Fedora, RED OS).
  • Общие системные события, сервисы - /var/log/syslog (Debian-семейство) или /var/log/messages (RHEL-семейство).
  • Сообщения ядра на диске - /var/log/kern.log (Debian, Ubuntu). По сути та же информация, что в dmesg, но сохраненная и с историей за дни.
  • Установка и обновление пакетов - /var/log/dpkg.log и /var/log/apt/ (Debian, Ubuntu) или /var/log/dnf.log, /var/log/dnf.rpm.log (Fedora, RHEL). Сюда смотрят, когда "после обновления все сломалось".
  • Свои каталоги сервисов - /var/log/nginx/, /var/log/mysql/, /var/log/postgresql/ и так далее. Каждый крупный сервис обычно пишет к себе.
Практический пример - ловим неудачные попытки входа по ssh:

Код: Выделить всё

sudo grep "Failed password" /var/log/auth.log | tail
Строка из вывода:

Код: Выделить всё

Jun 14 22:17:03 web01 sshd[5120]: Failed password for invalid user admin from 203.0.113.7 port 51422 ssh2
Читаем по полям: дата и время, имя хоста (web01), процесс и его PID (sshd[5120]), затем суть - неудачный пароль для несуществующего пользователя admin с такого-то IP. Несколько таких строк подряд с одного адреса - это типичный перебор паролей (brute force), повод поставить fail2ban или закрыть порт. Полезная связка для быстрого подсчета атакующих IP:

Код: Выделить всё

sudo grep "Failed password" /var/log/auth.log | grep -oE "from [0-9.]+" | sort | uniq -c | sort -rn | head
Эта цепочка вытащит IP, посчитает повторы и отсортирует по убыванию - сразу видно, кто долбится сильнее всех.

rsyslog, journald и ротация: кто все это пишет

Возникает вопрос: а кто, собственно, раскладывает сообщения по этим файлам? Исторически этим занимается демон логирования rsyslog. Программы и ядро отдают ему сообщения, у каждого есть facility (категория: auth, kern, mail, cron) и priority (важность). rsyslog по своим правилам решает, в какой файл что положить. Правила лежат тут:

Код: Выделить всё

cat /etc/rsyslog.conf
ls /etc/rsyslog.d/
Типичная строка правила выглядит как "auth,authpriv.* /var/log/auth.log" - то есть все из категории auth складывать в этот файл. Это и есть ответ, почему ssh-логи именно в auth.log: так настроен rsyslog.

А теперь важная актуализация на 2026. На современном Linux с systemd центральным сборщиком стал journald, а не rsyslog. journald собирает все в одном месте: сообщения ядра, ранний boot, stdout/stderr сервисов, syslog-сообщения - и хранит в структурированном бинарном журнале. rsyslog на таких системах работает уже не сборщиком, а читателем: он вычитывает сообщения из журнала и при желании дублирует их в привычные текстовые файлы. По умолчанию journald даже не форвардит в syslog (ForwardToSyslog=no), потому что rsyslog забирает данные сам. А целый ряд дистрибутивов (Amazon Linux 2023, минимальные образы Fedora/RHEL) идут вообще без rsyslog - и тогда /var/log/messages и /var/log/syslog просто нет, все живет только в journald. Это не поломка, это новая норма: не ищи файл, спрашивай journalctl.

Чтобы текстовые логи не съели весь диск, есть демон logrotate. Раз в сутки (по systemd-таймеру logrotate.timer) он переименовывает разросшиеся файлы (syslog становится syslog.1, потом syslog.2.gz и так сжимается), а самые старые удаляет. Поэтому ты часто видишь рядом auth.log, auth.log.1, auth.log.2.gz. Если ищешь старое событие - не забудь про архивы:

Код: Выделить всё

sudo zgrep "Failed password" /var/log/auth.log.2.gz
zgrep - это grep, умеющий читать сжатые .gz прямо на лету, не распаковывая руками. Настройки ротации - в /etc/logrotate.conf и /etc/logrotate.d/. У journald своей "ротации файлами" нет: он сам режет журнал на сегменты и ограничивает объем (по умолчанию до 10% от размера раздела). Управляется это через SystemMaxUse в /etc/systemd/journald.conf или вручную: journalctl --vacuum-size=500M (оставить полгигабайта), journalctl --vacuum-time=14d (выкинуть старше двух недель), а journalctl --disk-usage покажет, сколько журнал занимает сейчас.

Связь dmesg и journalctl -k: одно ядро, два источника

И вот ключевая связь, которую обязательно нужно понять. dmesg и journalctl -k показывают одни и те же сообщения ядра. Флаг -k - это синоним --dmesg, он неявно включает фильтр текущей загрузки. Разница в том, что dmesg читает текущий буфер в оперативке (то, что не затерлось), а journalctl -k - сохраненный на диск журнал, в том числе за прошлые загрузки:

Код: Выделить всё

journalctl -k -b -1
Это покажет сообщения ядра за предыдущую загрузку (-b -1). Незаменимо, когда сервер внезапно перезагрузился: в живом dmesg уже новая загрузка и причины не видно, а тут виден последний вздох системы перед падением - например, та самая строка I/O error или Out of memory за секунду до ребута. Чтобы это работало, журнал должен быть постоянным (persistent). Проверь, что есть каталог /var/log/journal: если его нет, журнал хранится только в /run (в памяти) и после ребута чистится. Включается так:

Код: Выделить всё

sudo mkdir -p /var/log/journal
sudo systemd-tmpfiles --create --prefix /var/log/journal
sudo systemctl restart systemd-journald
Либо явно прописать Storage=persistent в /etc/systemd/journald.conf. На большинстве дистрибутивов 2026 года persistent-журнал включен из коробки, но на легких облачных образах его иногда отключают ради экономии - и тогда journalctl --list-boots покажет только текущую загрузку. Это первое, что нужно проверить, если расследуешь внезапные ребуты.

Astra Linux логи и типичные грабли

Тема astra linux логи всплывает часто, потому что там своя специфика безопасности. Astra основана на Debian, поэтому база знакомая: /var/log/auth.log, /var/log/syslog, /var/log/kern.log на месте, dmesg и journalctl работают как обычно. Но добавляется подсистема мандатного контроля PARSEC со своим аудитом. Информация о входах и выходах пользователей пишется в журнал /var/log/parsec/user.mlog, а читается он не grep-ом, а специальной утилитой userlog (события там типа auth - вход и exit - выход). Есть и общий каталог журналов PARSEC. Вывод практический: для разбора "кто-когда-работал" на Astra одного auth.log может не хватить - смотри еще и userlog. В сертифицированных сборках аудит ядра (Linux Audit, auditd) обычно включен жестче, чем в обычном Debian, так что часть событий ищется через ausearch/aureport.

Теперь грабли, на которые новички наступают стабильно:
  • Permission denied или Operation not permitted на dmesg - не баг, а защита kernel.dmesg_restrict=1. Решение простое: sudo dmesg.
  • Логов нет, а вы уверены, что они должны быть - на чисто systemd-системах (Amazon Linux 2023, минимальный Fedora/RHEL) текстовых /var/log/syslog и /var/log/messages может не быть вообще: rsyslog не установлен, все ушло в journald. Не ищи файл - спрашивай journalctl.
  • journalctl -b -1 ругается "Failed to find boot" - журнал не persistent. Нет каталога /var/log/journal - нет истории за прошлые загрузки. Включи persistent заранее, а не после аварии.
  • "Кончилось место на диске" из ниоткуда - часто это раздутые логи. Проверь и текстовые (du -sh /var/log/*), и журнал (journalctl --disk-usage). Виновник нередко один разбухший файл сервиса с включенным debug либо распухший journald.
  • Ищешь вчерашнюю ошибку, а ее нет - ее уже заротировали или затерли. В текстовых логах загляни в .log.1 и .gz через zgrep; в журнале добавь --since/--until.
  • Путаешь dmesg и kern.log/journalctl -k - буфер ядра не бесконечный, старое затирается. Для истории за дни нужен файл на диске или persistent-журнал, а не голый dmesg.
Мини-лаба: повтори руками прямо сейчас

Открой терминал и пройди по шагам, читая вывод, а не просто копируя:
  • sudo dmesg -T | tail -30 - посмотри последние сообщения ядра. Найди строки про свои диски (sda, nvme) и сеть.
  • sudo dmesg -T --level=err+ - есть ли ошибки и что серьезнее? Прочитай, о чем они.
  • ls -lh /var/log и du -sh /var/log/* - оцени, какие файлы самые жирные. Затем journalctl --disk-usage - сколько ест журнал.
  • sudo tail -20 /var/log/auth.log (или /var/log/secure) - найди свои входы и sudo. Если файла нет - sudo journalctl -u ssh --since today.
  • journalctl --list-boots - сколько загрузок помнит система? Если только одна - persistent-журнал у тебя выключен.
  • journalctl -k -b -1 - если система переживала перезагрузку и журнал persistent, глянь, что было до нее.
  • Сравни: совпадают ли последние строки в sudo dmesg -T и в journalctl -k? Должны - это и есть та самая связь "одно ядро, два источника".
Контрольные вопросы
  • Чем dmesg отличается от /var/log/kern.log и от journalctl -k, если все три про ядро?
  • В какой файл смотреть, если кто-то подбирает пароль по ssh, и чем отличается путь на RHEL от Debian?
  • Что делает --level=err+ в dmesg и чем он удобнее, чем перечислять уровни руками?
  • Почему на свежей системе journalctl -b -1 может выдать ошибку и как это лечится заранее?
Что запомнить

Ядро, железо, диски, OOM - это dmesg (с -T для времени, --level=err+ для ошибок, -w чтобы следить). История и все остальное - на диске: текстом в /var/log (auth.log/secure для входов, syslog/messages для общего, kern.log для ядра, dpkg/dnf для пакетов) и в бинарном журнале journald. Раскладывает текст rsyslog, чистит logrotate - поэтому помни про .gz-архивы и zgrep. А на современном Linux 2026 года главный сборщик уже journald: на части дистрибутивов текстовых файлов нет вовсе, все читается через journalctl, и именно persistent-журнал спасает при разборе внезапных ребутов. dmesg и journalctl -k - это одно и то же ядро, только из памяти и с диска. Знаешь, куда смотреть под задачу - и диагностика перестает быть гаданием.
👍4 ❤️2 🔥 😄 🤔1
Аватара пользователя
Txboy23
Сообщения: 1
Зарегистрирован: 11 май 2026, 03:24

Re: Где лежат логи Linux: /var/log, dmesg и rsyslog

Сообщение Txboy23 »

Спасибо, наконец дошло чем dmesg от kern.log и journalctl -k отличается - буфер в памяти против файла на диске. Раньше тупо копировал команды и не понимал, почему вчерашних ошибок в dmesg нет.
👍 ❤️ 🔥 😄 🤔
Аватара пользователя
denis1337
Сообщения: 1
Зарегистрирован: 12 май 2026, 09:44

Re: Где лежат логи Linux: /var/log, dmesg и rsyslog

Сообщение denis1337 »

А у меня journalctl -b -1 выдавал Failed to find boot, думал баг. Оказалось persistent журнал был выключен, каталога /var/log/journal не было. Включил - и сразу увидел I/O error перед ночным ребутом. Огонь урок.
👍1 ❤️ 🔥 😄 🤔
Ответить
← Предыдущая глава
Логи systemd через journalctl: где искать причину
Следующая глава →
Источники правды: load average, /proc и /sys

Все главы курса «Диагностика и производительность Linux: логи, strace, perf и eBPF»

Поделиться темой: ✈ Telegram VK
Похожие запросы: как посмотреть сколько памяти занято в linuxlsof кто держит файл и порт в linuxstrace почему программа висит и тормозитperf top как найти что грузит процессорчто такое системный вызов и зачем трассироватьЛоги и диагностика macOS

Вернуться в «Диагностика и производительность Linux: логи, strace, perf и eBPF»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость