Конфигурация rsyslog для объединения нескольких строк через imuxsock - PullRequest
0 голосов
/ 17 мая 2019

У меня есть веб-сервис, который записывает свои выходные данные в stdout и управляет systemd. Конфигурация systemd отправляет стандартный вывод в системный журнал. У меня проблема в том, что многострочные сообщения разбиты на несколько записей системного журнала. Это проблема особенно с трассировкой стека исключений. Есть ли способ настроить rsyslog, чтобы объединить их в одну запись? Я нашел некоторые решения, использующие свойство readMode imfile, которое делает именно то, что мне нужно, но в моем случае я получаю данные напрямую из значения по умолчанию imuxsock.

Тест, который я использую, выполняется

echo -e "<<hello\n\tsecond\n\tthird\nnew message>>" | logger -t my-tag

Это генерирует

May 16 17:06:46 host my-tag: <<hello
May 16 17:06:46 host my-tag:    second
May 16 17:06:46 host my-tag:    third
May 16 17:06:46 host my-tag: new message>>

Но я хочу получить это

May 16 17:06:46 host my-tag: <<hello
    second
    third
May 16 17:06:46 host my-tag: new message>>

Возможно ли это? Поведение может быть описано как режим 2 в readMode imfile

2 - с отступом (новые сообщения журнала начинаются с начала строки. Если строка начинается с пробела или табуляции «t», это часть сообщения журнала перед ней)

С оговоркой, что, поскольку это не статические данные, такие как потребляет imfile, потребуется таймер, 1 с или что-то в этом духе, и если новые данные не были получены, мы предполагаем, что запись в журнале завершена

1 Ответ

0 голосов
/ 20 мая 2019

Вы можете использовать модуль omprog rsyslog, чтобы попытаться соединить строки данных. Например, конфигурация

$ModLoad omprog
:syslogtag, isequal, "my-tag:" action(type="omprog"
    binary="/bin/myprog" output="/var/log/myoutput")

запустит программу /bin/myprog и передаст ей все входные данные с тегом my-tag. Любой вывод из программы будет сохранен в файл /var/log/myoutput.

В приведенном ниже примере программы используется сценарий awk, который печатает строки, используя printf без завершающей строки. Ввод, содержащий часть сообщения, начинающуюся с табуляции (которая здесь экранируется от rsyslog до восьмеричного #011), аналогично печатается. Новая строка будет напечатана непосредственно перед любым вводом, который не имеет вкладки, как и новое сообщение. Я оставляю вас, чтобы добавить время сброса.

#!/bin/sh
awk '
/my-tag: #011/{
     i = index($0,"#011")
     printf "\n\t%s",substr($0,i+4)
     next
}
{    if(NR>1)printf "\n"; fflush();
     printf "%s",$0
}'

Обратите внимание, что это gnu awk (gawk), которая имеет команду fflush(). В противном случае вам может понадобиться что-то вроде команды stdbuf, чтобы прекратить буферизацию.

...