Системный сервис и структурированная регистрация - PullRequest
2 голосов
/ 23 апреля 2019

У меня есть служба systemd типа simple.

Я хочу, чтобы мой сервис регистрировал пары ключ-значение.

До сих пор мой простой сервис просто печатал журнал в стандартный вывод с использованием синтаксиса ключа-значения.

Я бы хотел избежать своего пользовательского синтаксиса значения ключа, поскольку он использует официальный способ структурированного ведения журнала.

Есть ли способ использовать структурированные журналы с systemd?

Например, мой сервис записывает это в стандартный вывод:

{"key1": "value1", "key2": 1234}

Было бы здорово, если бы systemd мог прочитать строку как json.

Ответы [ 2 ]

3 голосов
/ 01 мая 2019

Вы можете записать структурированные данные в systemd и затем просмотреть их как есть или в формате json

Допустим, мы записываем пары ключ-значение в формате json

systemd-cat -t "struct_logs" echo '{"key1": "value1", "key2": 1234}'

Затем мычитать их как есть

sudo journalctl -t 'struct_logs' --lines 1 --no-pager

Apr 30 21:46:14 linux-ar struct_logs[17455]: {"key1": "value1", "key2": 1234}

или в формате json

sudo journalctl -t 'struct_logs' --lines 1 --no-pager -o json-pretty
{
        "__CURSOR" : "s=b6d07ffffffffff2787cea140a0db88a5;i=db8;b=c9b2132ffffffffe5807625fe;m=9fa5b3f81;t=58fffffff87eab;x=6402818ea7e32a5b",
        "__REALTIME_TIMESTAMP" : "1556671574343339",
        "__MONOTONIC_TIMESTAMP" : "42854989697",
        "_BOOT_ID" : "fffffffffffff24ec7a237b5e5807625fe",
        "PRIORITY" : "6",
        "_MACHINE_ID" : "fffffffffff66c86aaaaaaaaaa",
        "_HOSTNAME" : "linux-ar",
        "_TRANSPORT" : "stdout",
        "_UID" : "1000",
        "_GID" : "100",
        "SYSLOG_IDENTIFIER" : "struct_logs",
        "MESSAGE" : "{\"key1\": \"value1\", \"key2\": 1234}",
        "_PID" : "17455"
}

В дальнейшем вы можете восстановить ваши точные сообщения журнала с помощью jq

sudo journalctl -t 'struct_logs' --lines 1 --no-pager -o json-pretty | jq -r '.MESSAGE'
{"key1": "value1", "key2": 1234}

Также возможно регистрировать пользовательские ключи при условии, что у пользователя есть на это соответствующие права.Служба должна быть в состоянии сделать это

sudo logger --journald <<end
MESSAGE_ID=67feb6ffbaf24c5cbec13c008dd72309
MESSAGE=The dogs bark, but the caravan goes on.
SYSLOG_IDENTIFIER=struct_logs
KEY=bark
VALUE=goes on
end

Надеюсь, это поможет.

1 голос
/ 03 мая 2019

Взгляните на Структурированное ведение журнала в журнал из контейнера докера ; ваше приложение должно использовать метод sd_journal_send, если вы хотите указать пользовательские поля.

Если ваше приложение не может этого сделать, вы также можете вывести json - который окажется в поле MESSAGE, после чего вы сможете проанализировать себя. Например - я написал SystemdJournal2Gelf для отправки записей журнала в Graylog, а также поддерживает вывод json в MESSAGE, отправляя его в Graylog в виде отдельных полей для фильтрации

Если вы не хотите изменять приложение, вы можете использовать отдельный скрипт - что-то вроде этого:

[Service]
ExecStart=/bin/sh -c '/bin/my-app | while read l; do echo "$l" | logger --journald; done'

Вы можете даже преобразовать json в пары ключ / значение, если хотите, или использовать StandardOutput для отправки стандартного вывода в сокет, где у вас есть отдельная служба прослушивания.

...