rsyslog: сделать %syslogtag% равной длины

Вопрос или проблема

У меня настроен rsyslog для ведения журнала в следующем формате:

$template long-iso,"%$NOW% %timereported:8:15%  %syslogtag% %msg%\n"

что приводит к созданию журналов, похожих на следующие:

2013-12-14 15:59:39  postfix/pickup[4665]:  559A48C9: uid=0 from=<root>
2013-12-14 15:59:39  postfix/cleanup[5194]:  559A48C9: message
2013-12-14 15:59:39  postfix/qmgr[7358]:  559A48C9: from=<[email protected]>
2013-12-14 15:59:39  postfix/smtp[5196]:  559A48C9: to=<[email protected]>
2013-12-14 15:59:39  postfix/qmgr[7358]:  559A48C9: removed

Как мне сделать текст в 3-м столбце одинаковой длины, то есть

2013-12-14 15:59:39  postfix/pickup[4665]:   559A48C9: uid=0 from=<root>
2013-12-14 15:59:39  postfix/cleanup[5194]:  559A48C9: message
2013-12-14 15:59:39  postfix/qmgr[7358]:     559A48C9: from=<[email protected]>
2013-12-14 15:59:39  postfix/smtp[5196]:     559A48C9: to=<[email protected]>
2013-12-14 15:59:39  postfix/qmgr[7358]:     559A48C9: removed

Использование rsyslog

Я нашел эту страницу с заголовком: Отправка сообщений с тегами больше 32 символов. На странице я заметил, что вы можете указать, что выглядит как диапазон для полей в шаблоне.

Пример

template (name="ForwardFormat" type="string" string="<%PRI%>%TIMESTAMP:::date-rfc3339% %HOSTNAME%

%syslogtag:1:32%%msg:::sp-if-no-1st-sp%%msg%”)

Возможно, вы могли бы сделать это поле шире, чем что-либо, что отображается там, тем самым заставив вывод выровняться?

После этого использовать awk

Вы также могли бы сделать это постфактум, используя awk для контроля ширины 3-го столбца. Это было бы просто для отображения журнала, когда вы хотите его просмотреть, это фактически не решит проблему, о которой вы спрашиваете.

$  awk '{ printf("%s %s %-30s %s ", $1, $2, $3, $4); \
  for (i = 5; i <= NF; i++) printf $i; print "" }' < rsyslog.txt 

Пример

$  awk '{ printf("%s %s %-30s %s ", $1, $2, $3, $4); \
      for (i = 5; i <= NF; i++) printf $i; print "" }' < rsyslog.txt 
2013-12-14 15:59:39 postfix/pickup[4665]:          559A48C9: uid=0from=<root>
2013-12-14 15:59:39 postfix/cleanup[5194]:         559A48C9: message
2013-12-14 15:59:39 postfix/qmgr[7358]:            559A48C9: from=<[email protected]>
2013-12-14 15:59:39 postfix/smtp[5196]:            559A48C9: to=<[email protected]>
2013-12-14 15:59:39 postfix/qmgr[7358]:            559A48C9: removed

Извлечение только имени процесса без PID

Автор вопроса задал следующий уточняющий вопрос в комментариях.

И вы не знаете, как я мог избавиться от части с идентификатором процесса, то есть [4665]? Так чтобы в 3-м столбце у меня осталось только postfix/pickup.

Я считаю, что следующий метод, используемый для извлечения данных для вставки в базу данных MySQL, можно адаптировать для выполнения того, о чем вы спрашиваете. Тема называется: ProcessID пустой, PID в Syslogtag.

Важно следующее в этом примере:

$template dbFormat,"insert into SystemEvents (Message, Facility, FromHost, Priority, DeviceReportedTime, ReceivedAt, InfoUnitID, SysLogTag, ProcessID) values ('%msg%', %syslogfacility%, '%HOSTNAME%', %syslogpriority%, '%timereported:::date-mysql%', '%timegenerated:::date-mysql%', %iut%, '%syslogtag:R,ERE,1,FIELD:([a-zA-Z\/]+)(\[[0-9]{1,5}\])*:--end%', '%syslogtag:R,ERE,1,BLANK:\[([0-9]{1,5})\]--end%')",sql

В частности, эти части. Эти 2 переменные:

  • SysLogTag
  • ProcessID

Заполняются следующими форматировщиками:

  • '%syslogtag:R,ERE,1,FIELD:([a-zA-Z\/]+)(\[[0-9]{1,5}\])*:--end%'
  • '%syslogtag:R,ERE,1,BLANK:\[([0-9]{1,5})\]--end%'

Я полагаю, что первый избавляется от части PID в выводе syslogtag. В то время как второй избавляется от части имени процесса строки, оставляя только информацию о PID.

Невозможно выводить поля фиксированной ширины с помощью rsyslogd. Однако возможно использовать разделенные табуляцией поля.

Следующее должно быть использовано. Это также запишет имя процесса и PID в отдельные поля:

$template long-iso,"%$NOW%\t%timereported:8:15%\t%programname%\t%procid%\t%msg%\n"

Опция свойства фиксированной ширины может быть использована:
https://www.rsyslog.com/doc/configuration/property_replacer.html

template(name="CustomFormat" type="string"
  string="[%syslogseverity-text:0:7:fixed-width%]%msg:::sp-if-no-1st-sp%%msg%\n")

Ответ или решение

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

1. Основы использования rsyslog

rsyslog — это мощная система журналирования, которая позволяет настраивать формат выходных логов с помощью различных шаблонов. В вашем случае имеется шаблон, который формирует записи с помощью переменной %syslogtag%.

2. Выравнивание с помощью фиксированной ширины

Текущая конфигурация вашего rsyslog не позволяет задать фиксированную ширину для поля %syslogtag%. Однако есть возможность установить фиксированную ширину для других полей, используя опцию fixed-width. Например:

$template long-iso,"%$NOW% %timereported:8:15% %syslogtag:0:20:fixed-width% %msg%\n"

В данном примере я добавил опцию :0:20:fixed-width, что обеспечит выравнивание логов. Указанная ширина — 20 символов. Если ваша метка будет короче, она будет дополнена пробелами до указанной ширины.

3. Устранение PID из syslogtag

Если вам необходимо вывести только название программы, а не ее PID (идентификатор процесса), вы можете модифицировать шаблон, чтобы извлечь только название программы с помощью регулярных выражений (regex). Пример шаблона:

$template long-iso,"%$NOW% %timereported:8:15% %syslogtag:R,ERE,1,FIELD:([a-zA-Z\/]+)(\[[0-9]{1,5}\])*:--end% %msg%\n"

Этот шаблон будет извлекать только название программы без PID.

4. Использование табуляции для выравнивания

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

$template long-iso,"%$NOW%\t%timereported:8:15%\t%syslogtag%\t%msg%\n"

5. Пример полного шаблона

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

$template long-iso,"%$NOW% %timereported:8:15% %syslogtag:R,ERE,1,FIELD:([a-zA-Z\/]+)(\[[0-9]{1,5}\])*:--end% %msg%\n"
*.* /var/log/mylogs.log;long-iso

Заключение

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

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

Оцените материал
Добавить комментарий

Капча загружается...