Администрирование Linux-серверов

Журналы Linux: journalctl, rsyslog и logrotate

Как найти сообщения службы в journal или текстовых файлах, отфильтровать их через journalctl и настроить хранение журналов без неконтролируемого роста диска.

13 минут
абстрактная иллюстрация: потоки системных журналов Linux
В системах с systemd сообщения служб обычно принимает systemd-journald, а читает их journalctl. Текстовый лог может вести само приложение или rsyslog, если он установлен и для сообщений есть правило маршрутизации. Хранение journal настраивается параметрами journald, а ротация текстовых файлов — правилами logrotate: сначала установите фактический источник записей, затем меняйте только относящийся к нему механизм.

Что делают journald, journalctl, rsyslog и logrotate

КомпонентНазначениеЧто не делает
systemd-journaldПринимает, индексирует и хранит структурированные сообщения ядра, процессов и systemd-служб.Не является утилитой интерактивного просмотра и не ротирует произвольные текстовые логи по правилам logrotate.
journalctlЧитает и фильтрует journal по полям: unit, загрузке, времени, приоритету и другим критериям.Сам по себе не запускает, не останавливает и не изменяет состояние службы.
rsyslogПри наличии нужных входных модулей принимает syslog-сообщения, фильтрует их и по правилам записывает в файлы или иные назначения.Не обязательно установлен и не обязан создавать определённый файл в /var/log.
logrotateПереименовывает, сжимает, удаляет и создаёт текстовые файлы журналов по правилам.Не управляет файлами journal и не гарантирует, что приложение автоматически продолжит запись в новый файл.

Один и тот же факт иногда попадает в оба места: служба пишет в stdout или stderr, запись видна в journal, а rsyslog дополнительно получает syslog-сообщение и сохраняет его в текстовый файл. Обратное тоже возможно: приложение открывает собственный файл напрямую, поэтому его сообщений в journal нет. Имена unit, наличие rsyslog, набор файлов в /var/log, пути конфигурации и способ запуска logrotate зависят от дистрибутива Linux, выпуска, пакетов и локальной конфигурации.

Шаг 1. Определите, куда пишет нужная служба

Первичный поиск источника журнала

Начните с journal, затем сопоставьте результат с настройками приложения и, если он используется, rsyslog.

  1. 1
    Уточните имя service unit
    Имя пакета, процесса и unit может различаться. Проверьте состояние предполагаемой системной службы через systemctl status ИМЯ.service и используйте подтверждённое имя в дальнейших командах. Управление службами подробно разобрано в статье «systemd и systemctl: управление службами и автозагрузкой Linux».
  2. 2
    Проверьте journal по unit
    Выполните journalctl -u ИМЯ.service -b. Если появились релевантные записи, stdout/stderr службы или сообщения, связанные с unit, поступают в journal. Пустой вывод не доказывает отсутствие логирования: запись могла быть вне текущей загрузки, отфильтрована правами доступа или направлена приложением в файл.
  3. 3
    Проверьте конфигурацию приложения
    Ищите в документированной конфигурации приложения параметры наподобие log, logfile, error_log, access_log, syslog или настройки вывода stdout/stderr. Не выбирайте файл только по его названию: убедитесь, что меняется время модификации, размер или появляются ожидаемые строки после контролируемого события.
  4. 4
    Установите роль rsyslog
    Если rsyslog установлен, проверьте его статус и фактически подключённые конфигурационные файлы по документации пакета вашей ОС. В правилах сопоставьте входной источник и действие записи в файл. Расположение основного файла и включаемых каталогов не одинаково во всех системах; наличие rsyslog не означает, что он принимает сообщения journald или пишет их в конкретный путь.
  5. 5
    Сопоставьте время и сообщение
    Для одного контролируемого события сравните отметку времени, текст и идентификатор процесса в journalctl и предполагаемом текстовом файле. Совпадение подтверждает дублирование этого события. Запись только в одном источнике показывает маршрут именно для проверенного типа сообщения; если приложение разделяет журналы или rsyslog фильтрует их по приоритету и facility, повторите проверку для нужных типов событий.
Показывает текущее состояние unit и последние строки, которые systemd выводит в статусе. Команда не заменяет полный просмотр journal.
systemctl status ИМЯ.service
Показывает записи указанного unit только для текущей загрузки. Замените `ИМЯ.service` на подтверждённое имя unit.
journalctl -u ИМЯ.service -b
Если команда доступна в установленном пакете rsyslog, проверяет синтаксис его конфигурации без запуска демона в обычном рабочем режиме. Точная доступность опций, подключённые модули и пути конфигурации зависят от пакета и выпуска ОС.
rsyslogd -N1

Проверка rsyslog не заменяет применение

Успешный режим проверки rsyslog не сохраняет исходную конфигурацию, не проверяет свободное место и не подтверждает фактическую маршрутизацию сообщений. До reload или restart сохраните изменяемые файлы, а после применения проверьте статус демона и появление тестовой записи в ожидаемом месте.

Шаг 2. Просмотр логов systemd через journalctl

Для диагностики не читайте весь журнал без отбора: ограничьте его загрузкой, unit, временем и приоритетом. Набор опций и отдельные детали их поведения зависят от версии systemd, поэтому для целевой ОС сверяйтесь с man journalctl и документацией поставщика.

ЗадачаКомандаРезультат
Все записи текущей загрузкиjournalctl -bСообщения от старта текущей ОС до настоящего момента.
Записи конкретной службыjournalctl -u ИМЯ.service -bСообщения unit в текущей загрузке.
Ошибки текущей загрузкиjournalctl -b -p errЗаписи уровня err и более критичных уровней. Чтобы включить предупреждения и все более важные сообщения, используйте journalctl -b -p warning.
Интервал времениjournalctl --since "2026-09-26 09:00" --until "2026-09-26 10:00"Записи за указанный период; время задавайте в формате, понятном вашей версии journalctl.
Служба за интервалjournalctl -u ИМЯ.service --since "1 hour ago"Сообщения unit за последний час.
Новые сообщения потокомjournalctl -u ИМЯ.service -fСледит за новыми записями в режиме follow.
Предыдущая загрузкаjournalctl -b -1Записи предшествующей загрузки, только если они доступны в сохранённом journal.
Список известных загрузокjournalctl --list-bootsИдентификаторы и временные границы загрузок, записи которых сохранились.

Просмотр не меняет службу

Команды journalctl читают журнал и не выполняют restart, reload или иное изменение unit. Но вывод может быть ограничен правами текущего пользователя: для полного системного журнала обычно требуются административные права или членство в разрешённой дистрибутивом группе.

Если служба не запускается, первично зафиксируйте systemctl status ИМЯ.service и journalctl -u ИМЯ.service -b до повторных попыток запуска. Разбор причин failed-unit, зависимостей, кодов завершения и восстановления — отдельная процедура в статье «Служба systemd не запускается: диагностика ошибок и восстановление».

Шаг 3. Проверьте, переживает ли journal перезагрузку

В journald.conf параметр Storage= определяет место хранения. volatile использует временный каталог /run/log/journal, содержимое которого обычно теряется при перезагрузке. persistent предпочитает постоянное хранилище в /var/log/journal, но до доступности /var или при недоступности постоянного каталога journald может использовать /run/log/journal. В режиме auto постоянное хранение применяется, когда доступен каталог /var/log/journal; при none journal не сохраняет записи, хотя их пересылка в другие приёмники может продолжаться. После появления постоянного хранилища записи из временного journal переносятся туда при штатном выполнении flush.

Показывает доступные загрузки. Если в списке есть только текущая, предыдущие записи либо не сохранились, либо уже очищены лимитами, либо недоступны текущему пользователю.
journalctl --list-boots
Проверяет наличие каталога, который обычно используется для постоянного journal. Само наличие каталога не заменяет проверку `Storage=` и фактического результата после следующей загрузки.
sudo test -d /var/log/journal && echo persistent-directory-present || echo persistent-directory-absent

Включение постоянного journal

Ниже приведена стандартная схема systemd. Перед применением проверьте в документации выпуска, поддерживает ли он drop-in-файлы journald и какой способ подготовки /var/log/journal предписан поставщиком.

  1. 1
    Зафиксируйте текущую конфигурацию и место
    Сохраните действующие journald.conf и drop-in-файлы, выполните journalctl --disk-usage и проверьте свободное место на файловой системе /var. Не заменяйте основной файл целиком, если выпуск поддерживает локальные drop-in-настройки.
  2. 2
    Задайте постоянное хранение
    Если документация выпуска поддерживает drop-in-файлы, создайте каталог /etc/systemd/journald.conf.d и файл, например /etc/systemd/journald.conf.d/10-persistent.conf, с секцией [Journal] и строкой Storage=persistent. Если поставщик предписывает менять основной journald.conf, внесите тот же параметр туда, не удаляя остальные настройки.
  3. 3
    Подготовьте постоянный каталог
    Не назначайте права /var/log/journal произвольно. Если это предусмотрено документацией выпуска, выполните sudo systemd-tmpfiles --create --prefix /var/log/journal: штатные tmpfiles-правила создадут каталог с ожидаемыми владельцем и режимом. В выпусках с другой процедурой используйте команду поставщика.
  4. 4
    Примените конфигурацию и перенесите временные записи
    В согласованное окно примените изменение способом, указанным для вашей ОС. Для выпусков, где документирована стандартная процедура systemd, перезапустите journald командой sudo systemctl restart systemd-journald, затем выполните sudo journalctl --flush, чтобы запросить перенос записей из /run в постоянное хранилище. Сразу проверьте статус journald и доступность новых записей.
  5. 5
    Проверьте результат после перезагрузки
    После плановой перезагрузки выполните journalctl --list-boots и journalctl -b -1. Предыдущая загрузка должна отображаться, пока её файлы не удалены политикой хранения и у пользователя есть права на чтение.

Не удаляйте файлы journal вручную

Не включайте /var/log/journal или /run/log/journal в правила logrotate и не удаляйте активные файлы journal вручную. Форматом, ротацией и очисткой этих файлов управляет journald; ручное вмешательство может нарушить ожидаемое хранение и затруднить диагностику.

Шаг 4. Ограничьте объём journal средствами journald

Лимиты persistent- и runtime-журналов задаются раздельно. Обычно параметры размещают в journald.conf или поддерживаемом drop-in-файле; точный путь и приоритет конфигурации сверяйте с документацией выпуска.

ПараметрНазначение
SystemMaxUse=Ограничивает объём постоянного journal на файловой системе с /var/log/journal.
SystemKeepFree=Задаёт объём свободного места, который journald старается оставить на той же файловой системе.
SystemMaxFileSize=Ограничивает размер отдельного файла постоянного journal и влияет на частоту внутренней ротации.
SystemMaxFiles=Ограничивает число сохраняемых файлов постоянного journal.
RuntimeMaxUse=, RuntimeKeepFree=, RuntimeMaxFileSize=, RuntimeMaxFiles=Соответствующие ограничения для временного journal в /run/log/journal.

Не воспринимайте эти значения как абсолютно точную границу байт. Для освобождения места journald удаляет прежде всего архивные файлы; активный файл обрабатывается отдельно. Поэтому фактический объём может временно превышать лимит — например, до ротации активного файла. Условия SystemMaxUse= и SystemKeepFree= также взаимодействуют: применяемое ограничение зависит от доступного пространства при запуске journald и текущего состояния файловой системы.

Показывает место, занятое файлами journal. Используйте до и после изменения, чтобы оценить фактический результат.
journalctl --disk-usage

В версиях systemd, где они документированы, journalctl --rotate переводит активные файлы journal в архивные, а --vacuum-size=, --vacuum-time= и --vacuum-files= удаляют старые архивы по выбранному критерию. Проверяйте наличие и синтаксис этих опций через man journalctl в целевой ОС. Для немедленного применения очистки обычно важен порядок: сначала ротация активного файла, затем vacuum; без архивных файлов освобождать может быть нечего.

Лимиты journal не заменяют logrotate

Параметры SystemMaxUse= и RuntimeMaxUse= не управляют журналами приложений в произвольных текстовых файлах. И наоборот, logrotate не должен обслуживать бинарные файлы journal. Для каждого источника задавайте его собственную политику хранения.

Шаг 5. Настройте ротацию текстового лога через logrotate

Правило logrotate содержит путь к одному или нескольким текстовым логам, условия ротации, число архивов и при необходимости действия после ротации. Основной файл, каталог включаемых правил и механизм периодического запуска различаются: в одних пакетных вариантах это cron, в других — systemd timer или иной пакетный механизм. Проверьте установленные файлы пакета и состояние соответствующего механизма в документации своей ОС; диагностика cron и timers рассматривается отдельно в статье «Cron и systemd timers: задачи по расписанию и диагностика сбоев».

пример правила для /var/log/example-app/app.log
/var/log/example-app/app.log {
    weekly
    maxsize 100M
    rotate 8
    compress
    delaycompress
    missingok
    notifempty
    create 0640 appuser appgroup
    sharedscripts
    postrotate
        # Здесь должна быть только документированная команда
        # переоткрытия лога или reload целевого приложения.
        # Например, команда из документации приложения.
    endscript
}
ДирективаСмысл и ограничение
daily, weeklyПериодическая ротация по дням или неделям, если logrotate действительно запускается по расписанию.
size 100MРотирует по размеру; эта директива обычно взаимоисключается с интервалом времени, причём порядок директив влияет на итоговое правило.
maxsize 100MРазрешает ротацию раньше временного интервала, если при очередном запуске logrotate обнаружен превышенный размер. Это не непрерывный предел: между запусками файл может вырасти значительно больше указанного значения.
rotate 8Оставляет указанное число старых ротированных экземпляров; это не равно сроку хранения без учёта расписания и размера.
compressСжимает старые файлы, уменьшая занимаемое место ценой нагрузки на CPU и необходимости распаковывать архив при диагностике.
delaycompressОткладывает сжатие последнего ротированного файла до следующего цикла. Это может быть нужно программам, которые некоторое время продолжают держать старый файловый дескриптор.
create 0640 appuser appgroupСоздаёт новый файл с заданными правами, владельцем и группой. Значения должны соответствовать способу записи приложения.
missingokНе считает отсутствующий лог ошибкой.
notifemptyНе ротирует пустой файл.
postrotate ... endscriptВыполняет действие после реальной ротации: например, документированный reload или сигнал для переоткрытия лога.
sharedscriptsЗапускает блок postrotate один раз для всего правила с несколькими файлами, а не для каждого файла отдельно.

Пример намеренно не содержит универсальной команды reload. Некоторые приложения умеют переоткрывать лог по сигналу, некоторые — по собственной команде управления, другие требуют документированного reload или restart. Применяйте только способ, указанный в документации целевого приложения или демона. copytruncate не является универсальной заменой: между копированием и обнулением возможна потеря или дублирование строк, а приложение может иметь другой штатный механизм.

Шаг 6. Проверьте правило без изменений и проведите реальную ротацию

Режим отладки разбирает указанное правило и выводит план действий, не изменяя лог-файлы и файл состояния logrotate. Подставьте реальный путь к создаваемому или изменяемому правилу.
sudo logrotate -d /ПУТЬ/К/ПРАВИЛУ

Dry-run не подтверждает работу приложения

logrotate -d подтверждает, что logrotate смог разобрать конфигурацию, но не выполняет настоящую ротацию. Он не доказывает выполнение postrotate, успешный reload, переоткрытие файла приложением и появление новых строк в новом файле.

Контролируемая фактическая проверка

Проводите её в согласованное окно или на тестовом экземпляре, особенно для журналов критичной службы.

  1. 1
    Зафиксируйте исходное состояние
    Сохраните правило и состояние файлов: имя текущего лога, размер, владельца, права и список существующих архивов. Проверьте свободное место: ротация, сжатие и создание нового файла тоже требуют пространства.
  2. 2
    Подготовьте документированный способ переоткрытия
    Подтвердите в документации приложения, какая команда, сигнал или reload заставляет его закрыть старый файловый дескриптор и открыть новый. Внесите именно этот способ в postrotate, если действие должно выполняться автоматически.
  3. 3
    Ограничьте тест одним правилом
    Подготовьте отдельный самодостаточный конфигурационный файл только для проверяемого журнала. Не запускайте -f для общего файла конфигурации, если он включает правила других служб: это может принудительно ротировать и их журналы.
  4. 4
    Выполните реальную ротацию
    В контролируемом тесте выполните sudo logrotate -v -f -s /tmp/logrotate-example.state /ПУТЬ/К/ТЕСТОВОМУ-ПРАВИЛУ. Ключ -v показывает выполняемые действия, -s использует отдельный файл состояния, а -f принудительно запускает ротацию. Это разовая проверка, а не команда для обычного расписания.
  5. 5
    Проверьте файлы и продолжение записи
    Убедитесь, что старый файл получил ожидаемое имя или сжатие, а новый файл создан с нужными владельцем и правами. Число архивов, обрабатываемых этим правилом, не должно превышать значение rotate; после одного запуска их может быть меньше. Затем вызовите безопасное тестовое событие приложения и проверьте, что новая строка появилась именно в новом активном файле.
  6. 6
    Проверьте ошибки применения
    Посмотрите вывод logrotate, статус и журнал приложения либо демона, выполнявшего reload. Если приложение продолжает писать в переименованный файл, выполните документированное переоткрытие, исправьте postrotate и повторите проверку в контролируемых условиях.

Перед изменением политики хранения

  • Оцените свободное место на файловой системе, где находятся journal и текстовые логи, отдельно от общего свободного места сервера.
  • Определите требуемый срок хранения: он зависит от расследований инцидентов, аудита, частоты ошибок и объёма записей, а не только от доступного диска.
  • Сохраните изменяемые journald.conf, drop-in-файлы, правила logrotate и конфигурацию rsyslog до правки.
  • Для journal проверьте journalctl --disk-usage, доступность предыдущих загрузок и действующие настройки хранения.
  • Для текстовых файлов зафиксируйте владельца, права, размер, механизм переоткрытия и текущие архивы.
  • После изменения проверяйте результат штатными средствами именно вашего дистрибутива: фактический объём, новые записи, статус демона и выполнение планировщика logrotate.

Границы этой настройки

Удалённая отправка syslog, сетевой сбор журналов, TLS и централизованное хранение требуют отдельного проектирования. Изменение разделов или выделение отдельного хранилища под логи относится к задачам файловых систем и не сводится к настройке journald или logrotate.

Термины в статье

Демон — обычно длительно работающий неинтерактивный процесс, который в фоне выполняет системную, сетевую или прикладную функцию.
Процесс — экземпляр выполняемой программы в Linux с PID, виртуальным адресным пространством, состоянием и связанными с ним ресурсами.
Системная служба — программный компонент, которым ОС управляет как логической единицей для фонового выполнения задач или предоставления функций программам и пользователям.
Файловый дескриптор — целочисленный идентификатор открытого объекта ввода-вывода в процессе Linux, через который ядро выполняет чтение, запись и другие операции.
Cron — служба-планировщик в Unix-подобных ОС, запускающая команды по расписаниям из таблиц crontab, обычно с минутной дискретностью.
journalctl — консольная утилита чтения и фильтрации журнала systemd, выводящая сообщения по времени, юниту, загрузке системы, приоритету и другим полям.
logrotate — утилита Linux для ротации файлов журналов: она переименовывает, сжимает, удаляет или отправляет старые файлы по заданным правилам.
PID — числовой идентификатор экземпляра процесса, назначаемый ядром Linux для его адресации; после завершения процесса номер может быть использован повторно.
rsyslog — служба обработки журналов Linux, принимающая, фильтрующая, сохраняющая и пересылающая сообщения syslog по локальным и сетевым каналам.
syslog — семейство форматов и протоколов передачи журнальных сообщений от ОС, приложений и устройств локальному обработчику или удалённому коллектору.
systemctl — командная утилита управления systemd, которая запускает и останавливает юниты, показывает их состояние и настраивает автоматическую активацию.
systemd — система инициализации и менеджер служб Linux, управляющий службами и другими ресурсами как объектами unit, обычно описанными unit-файлами.
systemd timer — юнит systemd, который по календарному или монотонному расписанию активирует другой юнит, по умолчанию одноимённый сервис.
Systemd unit — именованный объект systemd, представляющий отслеживаемый или управляемый ресурс, службу, задачу либо состояние системы.
systemd-journald — служба systemd для приёма, индексации и хранения структурированных журналов ядра, служб, процессов и системных сообщений.

Вопросы по теме

Все вопросы и ответы

Почему journalctl -u службы может ничего не показать?

Пустой вывод journalctl -u ИМЯ.service -b подтверждает только отсутствие доступных записей этого unit в journal текущей загрузки. Сообщения могли быть записаны до перезагрузки, а предыдущий journal мог не сохраниться или уже быть очищен политикой хранения. Полный системный журнал также может быть ограничен правами текущего пользователя.

Кроме того, имя пакета, процесса и systemd-unit нередко различается. Сначала проверьте предполагаемое имя через systemctl status ИМЯ.service. Если unit подтверждён, изучите настройки приложения: оно может писать в собственный файл через параметры наподобие log, logfile, error_log или access_log, не отправляя сообщения в journal. Проверяйте предполагаемый файл контролируемым событием: должны измениться время модификации, размер или появиться ожидаемая строка.

Нужен ли rsyslog, чтобы логи появились в /var/log?

Нет, не обязательно. Приложение может самостоятельно писать в текстовый файл, а rsyslog создаёт файлы только при наличии установленного пакета, нужных входных модулей и правила маршрутизации. Наличие rsyslog само по себе не означает, что он принимает сообщения journald или пишет в конкретный путь.

Почему логи journal пропадают после перезагрузки?

В режиме Storage=volatile journal хранится во временном каталоге /run/log/journal, поэтому после перезагрузки старые записи обычно исчезают. В режиме auto постоянное хранение используется только при доступном каталоге /var/log/journal. Режим persistent предпочитает этот каталог, но до доступности /var или при недоступности постоянного хранилища journald также может временно использовать /run/log/journal.

Перед изменением настройки сохраните действующую конфигурацию, проверьте journalctl --disk-usage и свободное место на файловой системе /var. Если выпуск поддерживает drop-in-файлы, задайте Storage=persistent в секции [Journal]. Каталог /var/log/journal не следует создавать с произвольными правами: используйте предусмотренную поставщиком процедуру, например штатные tmpfiles-правила, если они документированы. После применения конфигурации и плановой перезагрузки проверьте доступность предыдущей загрузки командами journalctl --list-boots и journalctl -b -1.

Можно ли включить файлы journal в правила logrotate?

Нет. Бинарными файлами journal в /var/log/journal и /run/log/journal управляет systemd-journald: он сам выполняет внутреннюю ротацию и очистку по своим лимитам. Не добавляйте их в logrotate и не удаляйте вручную — это может нарушить хранение журналов и осложнить диагностику.

Почему приложение не пишет в новый файл после logrotate?

После ротации приложение может продолжать записывать в старый, уже переименованный файл, если не закроет и не откроет журнал заново. Поэтому перед настройкой правила выясните в документации целевого приложения его штатный способ переоткрытия: это может быть собственная команда управления, reload или определённый сигнал. Именно этот способ можно добавить в блок postrotate.

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