---
title: "Логирование в systemd"
---

# Логирование в systemd

> Полный индекс документации для ИИ-агентов: [llms.txt](https://timeweb.cloud/llms.txt).

Системный менеджер `systemd` присутствует в большинстве современных Linux-дистрибутивов, в том числе, в Ubuntu, Debian и CentOS. С помощью `systemd` выполняется управление сервером и службами (например, их запуск и остановка), а также — ведение логов. В журнал `systemd` (компонент `journal`) собираются все системные сообщения — от ядра, служб и приложений. Логирование `systemd` может использоваться параллельно с `syslog` либо заменить его.

Для работы с логами используется утилита `journalctl`. 

## Просмотр и фильтрация логов

### Отображение времени в логах

Просматривать записи логов можно как с указанием местного времени, так и с указанием UTC — достаточно внести в команду опцию `--utc`.

По умолчанию в выводе будет указано местное время. Чтобы убедиться, что часовой пояс задан верно, можно выполнить:

```shell
timedatectl status
```

Корректное местное время должно быть выведено в строке `Local time`.

Если требуются изменения, можно просмотреть весь список часовых поясов:

```shell
timedatectl list-timezones
```

После чего установить нужный:

```shell
timedatectl set-timezone часовой_пояс
```

Далее можно еще раз выполнить проверку с помощью `timedatectl status`.

### Фильтр по определенной загрузке

Вывод событий из последней (то есть текущей) загрузки выполняется с помощью опции `-b`:

```shell
journalctl -b
```

Если нужно указать UTC вместо местного времени:

```shell
journalctl -b --utc
```

Вывод списка доступных загрузок:

```shell
journalctl --list-boots
```

Пример вывода:

```
-2 b94zf405f9424a1d39b667ce0bdbcff7 Wed 2020-07-08 08:34:12 MSK—Wed 2020-07-08 08:41:22 MSK
-1 t80dc883d180dc04z5db0abcb0dc5fa2 Wed 2020-07-08 09:01:46 MSK—Wed 2020-07-08 09:28:08 MSK
0 8cabc9420ea34a8d868e3014895269d8 Wed 2020-07-08 11:56:57 MSK—Wed 2020-07-08 13:51:27 MSK
```

Чтобы просмотреть данные конкретной загрузки из списка, необходимо указать ее порядковый номер (первая колонка в выводе) или ID (вторая колонка): 

```shell
journalctl -b -1

# Или:

journalctl -b t80dc883d180dc04z5db0abcb0dc5fa2
```

Если по умолчанию данные предыдущих загрузок не сохраняются, необходимо внести изменения в конфигурационный файл:

```shell
sudo nano /etc/systemd/journald.conf
```

И заменить значение для `Storage` на `persistent`:

```shell
[Journal]
Storage=persistent
```

### Фильтр по временному промежутку

Если интересующий нас период не совпадает с той или иной загрузкой, можно указывать конкретное время. Для этого используются:

-   опции `--since` (начиная с) и `--until` (до)
-   время в формате: `"ГГГГ-ММ-ДД ЧЧ:ММ:СС"`
-   ключи `yesterday`, `today`, `now` (вчера, сегодня, сейчас)

Например, вывод событий с указанного времени по текущий момент:

```shell
journalctl --since "2020-07-06 07:00:00"
```

Вывод событий за конкретный период:

```shell
journalctl --since "2020-07-06 07:00:00" --until "2020-07-06 08:00:00"
```

Вывод событий со вчерашнего дня:

```shell
journalctl --since yesterday
```

### Фильтр по службе (юниту)

Если нас интересуют только события конкретной службы, можно использовать:

```shell
journalctl -u имя_службы
```

Дополнительно могут быть внесены временные параметры. Например, чтобы просмотреть события Nginx за определенные часы, выполним:

```shell
journalctl -u nginx.service --since 10:00 --until 16:00
```

Можно указывать более одного юнита:

```shell
journalctl -u nginx.service -u php-fpm.service --since today
```

### Фильтр событий ядра

Можно отдельно вывести только события ядра. Для этого используется `-k`.

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

```shell
journalctl -k -2
```

### Фильтр по пользователю, группе или процессу

Есть возможность просматривать данные для конкретного PID, UID, GID:

```shell
journalctl _PID=id_процесса
journalctl _UID=id_пользователя 
journalctl _GID=id_группы
```

Например, чтобы вывести только сегодняшние события, связанные с определенным процессом, выполним:

```shell
journalctl _PID=544 --since today
```

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

```shell
journalctl -F _UID 

# Аналогично для GID:

journalctl -F _GID
```

### Фильтр по приоритету

С помощью опции `-p` можно вывести только события, начиная с определенного уровня приоритета. Уровни следующие:

-   0: emerg (авария, неработоспособность системы)
-   1: alert (тревога, требует немедленного внимания)
-   2: crit (критическое состояние)
-   3: err (ошибка)
-   4: warning (предупреждение)
-   5: notice (уведомление)
-   6: info (информация)
-   7: debug (отладка)

В команде можно указывать как название уровня, так и его числовое обозначение.

Например, следующей командой мы можем вести все события в текущей загрузке, имеющие уровень 3 (ошибка) и выше:

```shell
journalctl -p err -b 

# Или:

journalctl -p 3 -b
```

## Настройка отображения

### Базовые настройки

Сокращение строк по ширине окна терминала:

```shell
journalctl --no-full
```

Запись в стандартный вывод (чтобы сделать возможной обработку другими утилитами, например, `grep`, или сохранение в текстовый файл):

```shell
journalctl --no-pager
```

### Форматы вывода

Специфический формат вывода можно указать с помощью `-o`:

```shell
journalctl -o формат
```

Доступные форматы:

-   `cat` — только само сообщение из лога, без служебной информации;
-   `export` — бинарный формат, подходящий для экспорта или бэкапов логов;
-   `json` — стандартный `.json`, с одной записью на строку;
-   `json-pretty`  или `json-sse` — удобный для чтения `.json`;
-   `short` — формат вывода `syslog`;
-   `short-iso` — формат вывода `syslog` с метками времени по стандарту ISO8601;
-   `short-monotonic` — формат вывода `syslog` с монотонными временными метками;
-   `short-precise` — формат вывода `syslog` с указанием времени с точностью до микросекунд;
-   `verbose` — максимально подробный вывод, со скрытыми полями.

Пример использования:

```shell
journalctl -b -u nginx.service -o json-pretty
```

### Отображение недавних событий

По умолчанию будут выведены последние 10 событий:

```shell
journalctl -n
```

Их количество можно уточнить, например:

```shell
journalctl -n 20
```

Вывод на экран событий в режиме реального времени:

```shell
journalctl -f
```

## Управление журналом

### Занимаемый объем

Узнать, сколько места на диске занимает журнал на текущий момент, можно с помощью:

```shell
journalctl --disk-usage
```

### Ограничение объема

Вы можете настроить лимиты для журнала, отредактировав его конфигурационный файл:

```shell
sudo nano /etc/systemd/journald.conf
```

Можно настроить следующие параметры:

-   `SystemMaxUse` — максимальный объем на диске, который может занимать журнал. 
-   `SystemKeepFree` —  объем, который должен оставаться свободным на диске после сохранения логов.
-   `SystemMaxFileSize` — максимальный объем файла лога, при достижении которого он должен быть удален.
-   `RuntimeMaxUse` — максимальный объем, который могут занимать логи в файловой системе `/run`.
-   `RuntimeKeepFree` — объем, который должен оставаться свободным в файловой системе `/run` после сохранения логов.
-   `RuntimeMaxFileSize` — максимальный объем файла лога, при достижении которого он должен быть удален из файловой системы `/run`.

### Удаление старых записей

Для удаления старых логов и уменьшения объема журнала можно использовать два способа.

Способ 1. Можно указать объем, к которому нужно привести журнал. Это запустит удаление старых записей до тех пор, пока журнал не будет уменьшен до указанного объема. Например:

```shell
sudo journalctl --vacuum-size=1G
```

Способ 2. Можно указать период, данные за которые должны быть сохранены. В этом случае все записи, которые будут старше указанного периода, удалятся. Например:

```shell
sudo journalctl --vacuum-time=1years
```

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