# journald и логи

> journald — служба журналирования systemd, собирающая структурированные логи ядра и всех служб; journalctl — инструмент их просмотра. Также о традиционных логах в /var/log, syslog и ротации.

Источник: https://llmdocs.ru/wiki/journald-logs/ · обновлено 2026-11-09 · лицензия CC BY-SA 4.0

- **Служба**: systemd-journald (часть systemd)
- **Инструмент просмотра**: journalctl
- **Хранение**: двоичный журнал в /var/log/journal (постоянно) или /run/log/journal (до перезагрузки)
- **Источники**: ядро, stdout/stderr служб, syslog, sd_journal API
- **Уровни важности**: 0 (emerg) — 7 (debug), по RFC 5424
- **Традиционные инструменты**: rsyslog, /var/log, logrotate
**journald** (служба `systemd-journald`) — компонент [systemd](https://llmdocs.ru/wiki/systemd.md), который собирает логи со всей системы: сообщения ядра, стандартный вывод и поток ошибок каждой службы, сообщения syslog. Записи хранятся в структурированном двоичном журнале с метаданными — время, служба, PID, пользователь, уровень важности, — по которым их можно быстро фильтровать. Просматривают журнал утилитой **`journalctl`**.[2]

Логи — первое, куда смотрят при любой проблеме на сервере: почему не запустилась служба, что случилось перед падением, кто подключался по [SSH](https://llmdocs.ru/wiki/ssh.md).

## Как устроен журнал

Служба, запущенная systemd, может не заботиться о файлах логов: всё, что она пишет в stdout и stderr, автоматически попадает в журнал с пометкой, от какого юнита оно пришло. Каждая запись — набор полей: `MESSAGE`, `PRIORITY`, `_SYSTEMD_UNIT`, `_PID`, `_UID`, `_HOSTNAME`, `_BOOT_ID` и другие. Приложения могут добавлять собственные поля через API.

Журнал хранится в `/var/log/journal/`, если каталог существует (постоянное хранение), иначе — в `/run/log/journal/`, в памяти до перезагрузки. Размер ограничивается настройками в `/etc/systemd/journald.conf`, например `SystemMaxUse=1G`; старые записи удаляются автоматически.[3]

## journalctl

```bash
journalctl -u nginx                     # логи одной службы
journalctl -u nginx -f                  # следить в реальном времени
journalctl -u nginx --since "1 hour ago"
journalctl -u nginx --since "2026-11-09 10:00" --until "2026-11-09 11:00"
journalctl -b                           # с момента текущей загрузки
journalctl -b -1 -p err                 # ошибки предыдущей загрузки (после сбоя)
journalctl -k                           # сообщения ядра (как dmesg)
journalctl -p warning                   # уровень warning и важнее
journalctl _PID=1234                    # по полю
journalctl -u myapp -o json-pretty -n 5 # последние 5 записей со всеми полями
journalctl -u myapp -o cat              # только текст сообщений
journalctl --disk-usage                 # сколько места занимает журнал
sudo journalctl --vacuum-time=14d       # удалить записи старше 14 дней
```

Фильтры комбинируются: `journalctl -u nginx -u php-fpm -p err --since today`.[1]

## Уровни важности

Уровни унаследованы от протокола syslog (RFC 5424):[4]

| Код | Имя | Значение |
|---|---|---|
| 0 | emerg | система неработоспособна |
| 1 | alert | нужно немедленное действие |
| 2 | crit | критическое состояние |
| 3 | err | ошибка |
| 4 | warning | предупреждение |
| 5 | notice | нормальное, но значимое событие |
| 6 | info | информационное сообщение |
| 7 | debug | отладка |

## Традиционные логи: /var/log

До systemd логи писал демон syslog (сегодня — обычно rsyslog) в текстовые файлы каталога `/var/log` (см. [Файловая система Unix (FHS)](https://llmdocs.ru/wiki/fhs.md)). Многие системы используют оба механизма: journald принимает сообщения и передаёт их rsyslog, а тот раскладывает по файлам.

| Файл | Содержимое |
|---|---|
| `/var/log/syslog` или `/var/log/messages` | общий системный журнал (Debian/Ubuntu и RHEL соответственно) |
| `/var/log/auth.log` или `/var/log/secure` | входы, `sudo`, SSH |
| `/var/log/nginx/`, `/var/log/postgresql/` | логи отдельных приложений |
| `/var/log/kern.log` | сообщения ядра |

Текстовые файлы растут бесконечно, поэтому их **ротирует** утилита logrotate: по расписанию переименовывает текущий файл, сжимает старые и удаляет самые давние.[5] Работа с текстовыми логами — основная область [grep](https://llmdocs.ru/wiki/grep.md), [sed и awk](https://llmdocs.ru/wiki/sed-awk.md) и `tail -f`.

## Логи в контейнерах

В [Docker](https://llmdocs.ru/wiki/docker.md) приложения тоже пишут в stdout и stderr, а драйвер логирования сохраняет вывод (`docker logs -f container`). Драйвер `journald` отправляет логи контейнеров прямо в журнал хоста. Для драйвера по умолчанию `json-file` важно задать ограничение размера (`max-size`, `max-file`), иначе логи заполнят диск. В [Kubernetes](https://llmdocs.ru/wiki/kubernetes.md) логи читают через `kubectl logs`.

## Централизованное логирование

Когда серверов и контейнеров много, логи собирают в одно место:

- **Сборщики** — Vector, Fluent Bit, Promtail/Alloy, rsyslog — читают журнал и файлы и отправляют дальше.
- **Хранилища** — Grafana Loki (индексирует только метки, дёшево),[6] Elasticsearch/OpenSearch (полнотекстовый поиск), [ClickHouse](https://llmdocs.ru/wiki/clickhouse.md).
- **Интерфейсы** — Grafana, Kibana.

Связь логов с метриками и трассировками описывает статья [Логирование и трассировка (OpenTelemetry)](https://llmdocs.ru/wiki/opentelemetry.md).

## Хорошие практики

- Пишите **структурированные** логи (JSON или пары ключ-значение) с идентификатором запроса — их можно фильтровать и агрегировать.
- Не логируйте секреты, пароли, токены и лишние персональные данные.
- Используйте уровни осмысленно: `error` — то, что требует внимания, `debug` — выключен в продакшене.
- Включите постоянное хранение журнала (`mkdir -p /var/log/journal`), чтобы логи переживали перезагрузку и можно было разобрать причину сбоя.
- Ограничьте размер логов и следите за свободным местом на диске.

## См. также

- [systemd](https://llmdocs.ru/wiki/systemd.md)
- [Логирование и трассировка (OpenTelemetry)](https://llmdocs.ru/wiki/opentelemetry.md)
- [Мониторинг и алертинг](https://llmdocs.ru/wiki/monitoring-alerting.md)
- [grep и регулярные выражения](https://llmdocs.ru/wiki/grep.md)
- [Процессы и сигналы](https://llmdocs.ru/wiki/processes-signals.md)

## Источники

1. [journalctl — manual](https://www.freedesktop.org/software/systemd/man/latest/journalctl.html)
2. [systemd-journald.service — manual](https://www.freedesktop.org/software/systemd/man/latest/systemd-journald.service.html)
3. [journald.conf — manual](https://www.freedesktop.org/software/systemd/man/latest/journald.conf.html)
4. [RFC 5424 — The Syslog Protocol](https://www.rfc-editor.org/rfc/rfc5424)
5. [logrotate — GitHub](https://github.com/logrotate/logrotate)
6. [Grafana Loki — документация](https://grafana.com/docs/loki/latest/)
