- Вопрос или проблема
- Использование rsyslog
- Пример
- После этого использовать awk
- Пример
- Извлечение только имени процесса без PID
- Ответ или решение
- 1. Основы использования rsyslog
- 2. Выравнивание с помощью фиксированной ширины
- 3. Устранение PID из syslogtag
- 4. Использование табуляции для выравнивания
- 5. Пример полного шаблона
- Заключение
Вопрос или проблема
У меня настроен 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, чтобы быть в курсе новых возможностей и функций.