Как настроить политику хранения журналов для каждого модуля с journald?

14

У меня есть один конкретный сервис, который регистрирует редкую, но важную информацию. Я настроил это несколько месяцев назад, и сегодня я бегу journalctl -n 50 --unit=my-serviceтолько, чтобы найти, что нет никаких записей.

Я вполне доволен таким поведением для большинства юнитов - мне либо нужно что-то, что произошло сразу (или, самое большее, несколько дней назад), и меня не волнуют месячные записи.

Тем не менее, есть ли способ сказать, journaldчтобы иметь независимую политику хранения и хранения для записей отдельного конкретного блока? Я хочу сохранить эти конкретные журналы, скажем, на 5 лет - независимо от того, какого размера это займет. Журналы других подразделений не должны быть затронуты этим и сохранять свое существующее поведение.

Я в некотором роде потерял понимание journald.conf(5)и не могу понять, когда конфигурация для каждого устройства вообще возможна. Если это так - был бы признателен за краткий конкретный пример - какой файл я должен редактировать / создавать, а что писать. Или, если вы точно знаете, что это, безусловно, невозможно - это также будет хорошим ответом.

ПРИМЕЧАНИЕ: мой конкретный случай касается хоста Arch Linux, но я думаю, это не должно иметь большого значения.

drdaeman
источник
Я не могу прокомментировать ответ выше, чтобы добавить эту ссылку к проблеме о добавлении этой функции в journald, поэтому здесь это как другой ответ: github.com/systemd/systemd/issues/4751
swoop81

Ответы:

7

Кажется, мне, скорее всего, не повезло с журналом. Если я не придумаю способ создания независимого журнала «длительного хранения» (как в настоящее время существуют разные журналы для каждого пользователя), но я не уверен, что это жизнеспособный и вменяемый подход. Я предполагаю, что настройка syslogd (и logrotate) будет проще.

Эта функция отсутствовала в конце 2014 года , как подтвердил сам Леннарт.

И кажется, что это еще не здесь. По крайней мере, строка «journald: разрешить время удержания для каждого приоритета и для услуги при ротации / вакуумировании» все еще находится в файле TODO (ссылка на ревизию от 2016-07-11).

drdaeman
источник
3
Это похоже на очень большой недостаток дизайна, почти наносящий вред. Особенно, если кто-то хочет уменьшить срок хранения или, по крайней мере, уровень регистрации очень болтливых единиц, которые засоряют журналы.
Орион
1
Для любого, кто наткнулся на этот вопрос, ссылка на строку в TODO все еще присутствует на момент этого комментария (26.03.18): github.com/systemd/systemd/blob/…
timss
1
В попытке получить некоторую тягу к этому я поднял это как проблему с проектом - github.com/systemd/systemd/issues/9519 .
SLM
1

Это удивительно просто создать файл журнала. По умолчанию все записи в journald также идут в syslog, и это значение по умолчанию должно быть на месте. Rsyslog.conf управляет обработкой записей, передаваемых в системный журнал. Кроме того, по SyslogFacilityумолчанию, daemonпоэтому записи журнала для любой службы обычно попадают в daemon.logфайл в /var/log.

В вашем сервисном файле добавьте в раздел [service]

SyslogFacility=local2

(число может быть от 0 до 7) https://www.freedesktop.org/software/systemd/man/systemd.exec.html

Измените /etc/rsyslog.conf (найдите существующие строки для изменения) так, чтобы local2 был зарегистрирован в конкретном файле (первая строка) и в идеале не зарегистрирован в syslog, добавив, local2.noneкак показано (он уже есть в журнале).

local2.*                        /var/log/your-service-name.log
*.*;auth,authpriv.none,local2.none          -/var/log/syslog

[править] вам также нужно изменить поймать все

*.=info;*.=notice;*.=warn;\
        auth,authpriv.none;\
        cron,daemon.none;\
        mail,news.none,local2.none      -/var/log/messages

Конечно, фактическое удержание должно быть сделано logrotate.

НТН

Брайан
источник