Что делают 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Уточните имя service unitИмя пакета, процесса и unit может различаться. Проверьте состояние предполагаемой системной службы через
systemctl status ИМЯ.serviceи используйте подтверждённое имя в дальнейших командах. Управление службами подробно разобрано в статье «systemd и systemctl: управление службами и автозагрузкой Linux». - 2Проверьте journal по unitВыполните
journalctl -u ИМЯ.service -b. Если появились релевантные записи, stdout/stderr службы или сообщения, связанные с unit, поступают в journal. Пустой вывод не доказывает отсутствие логирования: запись могла быть вне текущей загрузки, отфильтрована правами доступа или направлена приложением в файл. - 3Проверьте конфигурацию приложенияИщите в документированной конфигурации приложения параметры наподобие
log,logfile,error_log,access_log,syslogили настройки вывода stdout/stderr. Не выбирайте файл только по его названию: убедитесь, что меняется время модификации, размер или появляются ожидаемые строки после контролируемого события. - 4Установите роль rsyslogЕсли rsyslog установлен, проверьте его статус и фактически подключённые конфигурационные файлы по документации пакета вашей ОС. В правилах сопоставьте входной источник и действие записи в файл. Расположение основного файла и включаемых каталогов не одинаково во всех системах; наличие rsyslog не означает, что он принимает сообщения journald или пишет их в конкретный путь.
- 5Сопоставьте время и сообщениеДля одного контролируемого события сравните отметку времени, текст и идентификатор процесса в
journalctlи предполагаемом текстовом файле. Совпадение подтверждает дублирование этого события. Запись только в одном источнике показывает маршрут именно для проверенного типа сообщения; если приложение разделяет журналы или rsyslog фильтрует их по приоритету и facility, повторите проверку для нужных типов событий.
systemctl status ИМЯ.servicejournalctl -u ИМЯ.service -brsyslogd -N1Проверка rsyslog не заменяет применение
Шаг 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-bootssudo test -d /var/log/journal && echo persistent-directory-present || echo persistent-directory-absentВключение постоянного journal
Ниже приведена стандартная схема systemd. Перед применением проверьте в документации выпуска, поддерживает ли он drop-in-файлы journald и какой способ подготовки /var/log/journal предписан поставщиком.
- 1Зафиксируйте текущую конфигурацию и местоСохраните действующие
journald.confи drop-in-файлы, выполнитеjournalctl --disk-usageи проверьте свободное место на файловой системе/var. Не заменяйте основной файл целиком, если выпуск поддерживает локальные drop-in-настройки. - 2Задайте постоянное хранениеЕсли документация выпуска поддерживает drop-in-файлы, создайте каталог
/etc/systemd/journald.conf.dи файл, например/etc/systemd/journald.conf.d/10-persistent.conf, с секцией[Journal]и строкойStorage=persistent. Если поставщик предписывает менять основнойjournald.conf, внесите тот же параметр туда, не удаляя остальные настройки. - 3Подготовьте постоянный каталогНе назначайте права
/var/log/journalпроизвольно. Если это предусмотрено документацией выпуска, выполнитеsudo systemd-tmpfiles --create --prefix /var/log/journal: штатные tmpfiles-правила создадут каталог с ожидаемыми владельцем и режимом. В выпусках с другой процедурой используйте команду поставщика. - 4Примените конфигурацию и перенесите временные записиВ согласованное окно примените изменение способом, указанным для вашей ОС. Для выпусков, где документирована стандартная процедура systemd, перезапустите journald командой
sudo systemctl restart systemd-journald, затем выполнитеsudo journalctl --flush, чтобы запросить перенос записей из/runв постоянное хранилище. Сразу проверьте статус journald и доступность новых записей. - 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 и текущего состояния файловой системы.
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 {
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. Проверьте правило без изменений и проведите реальную ротацию
sudo logrotate -d /ПУТЬ/К/ПРАВИЛУDry-run не подтверждает работу приложения
logrotate -d подтверждает, что logrotate смог разобрать конфигурацию, но не выполняет настоящую ротацию. Он не доказывает выполнение postrotate, успешный reload, переоткрытие файла приложением и появление новых строк в новом файле.Контролируемая фактическая проверка
Проводите её в согласованное окно или на тестовом экземпляре, особенно для журналов критичной службы.
- 1Зафиксируйте исходное состояниеСохраните правило и состояние файлов: имя текущего лога, размер, владельца, права и список существующих архивов. Проверьте свободное место: ротация, сжатие и создание нового файла тоже требуют пространства.
- 2Подготовьте документированный способ переоткрытияПодтвердите в документации приложения, какая команда, сигнал или reload заставляет его закрыть старый файловый дескриптор и открыть новый. Внесите именно этот способ в
postrotate, если действие должно выполняться автоматически. - 3Ограничьте тест одним правиломПодготовьте отдельный самодостаточный конфигурационный файл только для проверяемого журнала. Не запускайте
-fдля общего файла конфигурации, если он включает правила других служб: это может принудительно ротировать и их журналы. - 4Выполните реальную ротациюВ контролируемом тесте выполните
sudo logrotate -v -f -s /tmp/logrotate-example.state /ПУТЬ/К/ТЕСТОВОМУ-ПРАВИЛУ. Ключ-vпоказывает выполняемые действия,-sиспользует отдельный файл состояния, а-fпринудительно запускает ротацию. Это разовая проверка, а не команда для обычного расписания. - 5Проверьте файлы и продолжение записиУбедитесь, что старый файл получил ожидаемое имя или сжатие, а новый файл создан с нужными владельцем и правами. Число архивов, обрабатываемых этим правилом, не должно превышать значение
rotate; после одного запуска их может быть меньше. Затем вызовите безопасное тестовое событие приложения и проверьте, что новая строка появилась именно в новом активном файле. - 6Проверьте ошибки примененияПосмотрите вывод logrotate, статус и журнал приложения либо демона, выполнявшего reload. Если приложение продолжает писать в переименованный файл, выполните документированное переоткрытие, исправьте
postrotateи повторите проверку в контролируемых условиях.
Перед изменением политики хранения
- Оцените свободное место на файловой системе, где находятся journal и текстовые логи, отдельно от общего свободного места сервера.
- Определите требуемый срок хранения: он зависит от расследований инцидентов, аудита, частоты ошибок и объёма записей, а не только от доступного диска.
- Сохраните изменяемые
journald.conf, drop-in-файлы, правила logrotate и конфигурацию rsyslog до правки. - Для journal проверьте
journalctl --disk-usage, доступность предыдущих загрузок и действующие настройки хранения. - Для текстовых файлов зафиксируйте владельца, права, размер, механизм переоткрытия и текущие архивы.
- После изменения проверяйте результат штатными средствами именно вашего дистрибутива: фактический объём, новые записи, статус демона и выполнение планировщика logrotate.
Границы этой настройки
Термины в статье
- Демон
- Демон — обычно длительно работающий неинтерактивный процесс, который в фоне выполняет системную, сетевую или прикладную функцию.
- Процесс
- Процесс — экземпляр выполняемой программы в Linux с PID, виртуальным адресным пространством, состоянием и связанными с ним ресурсами.
- Системная служба
- Системная служба — программный компонент, которым ОС управляет как логической единицей для фонового выполнения задач или предоставления функций программам и пользователям.
- Файловый дескриптор
- Файловый дескриптор — целочисленный идентификатор открытого объекта ввода-вывода в процессе Linux, через который ядро выполняет чтение, запись и другие операции.
- Cron
- Cron — служба-планировщик в Unix-подобных ОС, запускающая команды по расписаниям из таблиц crontab, обычно с минутной дискретностью.
- journalctl
- journalctl — консольная утилита чтения и фильтрации журнала systemd, выводящая сообщения по времени, юниту, загрузке системы, приоритету и другим полям.
- logrotate
- logrotate — утилита Linux для ротации файлов журналов: она переименовывает, сжимает, удаляет или отправляет старые файлы по заданным правилам.
- PID
- PID — числовой идентификатор экземпляра процесса, назначаемый ядром Linux для его адресации; после завершения процесса номер может быть использован повторно.
- rsyslog
- rsyslog — служба обработки журналов Linux, принимающая, фильтрующая, сохраняющая и пересылающая сообщения syslog по локальным и сетевым каналам.
- syslog
- syslog — семейство формат ов и протоколов передачи журнальных сообщений от ОС, приложений и устройств локальному обработчику или удалённому коллектору.
- systemctl
- systemctl — командная утилита управления systemd, которая запускает и останавливает юниты, показывает их состояние и настраивает автоматическую активацию.
- systemd
- systemd — система инициализации и менеджер служб Linux, управляющий службами и другими ресурсами как объектами unit, обычно описанными unit-файлами.
- systemd timer
- systemd timer — юнит systemd, который по календарному или монотонному расписанию активирует другой юнит, по умолчанию одноимённый сервис.
- Systemd unit
- Systemd unit — именованный объект systemd, представляющий отслеживаемый или управляемый ресурс, службу, задачу либо состояние системы.
- systemd-journald
- systemd-journald — служба systemd для приёма, индексации и хранения структурированных журналов ядра, служб, процессов и системных сообщений.
