Шаблоны позволяют задавать пользовательские форматы вывода сообщений и генерировать имена выходных файлов. Любой вывод в rsyslog использует шаблоны: запись в файл, пользовательские сообщения и другие. Если шаблон не задан, используется один из предопределенных в rsconf.c шаблонов.
В конфигурации шаблон объявляется выражением tempale()
или его устаревшей формой $template
. Шаблоны инициализируются на этапе чтения конфигурационного файла и не чувствительны к условным операторам или вложенным конфигурациям.
Шаблон может быть объявлен в сокращенном виде
template(parameters)
или расширенном
template(parameters) { list-descriptions }
и содержать обязательные параметры: имя и тип.
Имя должно быть уникально. Контроль за уникальностью возлагается на пользователя. В случае коллизии поведение не определено.
Тип позволяет использовать разные способы объявления шаблона:
Независимо от типа шаблоны оперируют свойствами. Они подразделяются на 2 уровня: свойства сообщения и системы. Более подробно с их списков можно ознакомиться в документации rsyslog.
Вывод сообщения может производиться в текстовой или структурной форме.
List
шаблон подключается указанием параметра type="list"
. Формат вывода задается через список константных и вычисляемых выражений:
template(name="exmpl-1" type="list") {
constant(value="Syslog MSG is: '")
property(name="msg")
constant(value="', ")
property(name="timereported" dateFormat="rfc3339" caseConversion="lower")
constant(value="\n")
}
Константные выражения возвращают статический текст. Используются для добавления текста в выходную строки или свойства в структуру.
Выражение имеет вид:
constant(parameters)
и параметры:
value - значение выражения. Поддерживает escape последовательности;
constant(value="abc")
constant(value="\"")
constant(value="\n")
constant(value="\000")
constant(value="\xhh")
outname - выходное имя свойства (для структурного вывода);
constant(value="abc" outname="property1")
format - формат вывода: empty
или jsonf
.
constant(value="abc" format="empty")
constant(value="abc" format="jsonf")
Добавление возврата каретки в конец строки:
template(name="exmpl-2" type="list"){
property(name="$!usr!msgnum")
constant(value="\n")
}
Добавление свойства в структуру:
template(name="exmpl-3" type="list"){
constant(vaue="Hello, world!" outname="greeting")
}
Выражения без параметра
outname
игнорируются в структурном форме
Добавление json
свойства:
template(name="exmpl-4" type="list" option.jsonf="on"){
constant(vaue="1" outname="@version" format="jsonf")
}
Запись в таком формате сгенерирует: { "@version": "1" }
Вычисляемые выражения возвращают результат обработки переменной. Они используются для привидения свойств к нужному формату.
Выражение имеет вид:
property(parameters)
и параметры:
name - имя используемого свойства;
property(name="msg")
outname - выходное имя поля (для структурного вывода);
property(name="msg" outname="message")
dateformat - формат даты. Полный список опций доступен в документации;
property(name="timestamp" dateformat="rfc3339")
property(name="timestamp" dateformat="year")
property(name="timestamp" dateformat="month")
property(name="timestamp" dateformat="day")
date.inUTC - дата должна быть сконвертирована в UTC;
property(name="timestamp" date.inUTC="on")
caseconversion - регистр вывода: нижний lower
или верхний upper
;
property(name="msg" caseconversion="lower")
property(name="msg" caseconversion="upper")
controlcharacters - задает способ обработки управляющих символов: экранировать escape
, заменять пробелом space
или удалять drop
;
property(name="msg" caseconversion="escape")
property(name="msg" caseconversion="space")
property(name="msg" caseconversion="drop")
securepath - используется для создания путей файлов в dynafile
шаблонах;
property(name="programname" SecurePath="replace")
format - формат вывода: csv
, json
, jsonf
, jsonr
, jsonfr
;
property(name="msg" format="csv")
property(name="msg" format="json")
property(name="msg" format="jsonf")
property(name="msg" format="jsonr")
property(name="msg" format="jsonfr")
position.from, position.to - индекс начала/окончания подстроки (отсчет ведется с 1);
property(name="syslogtag" position.from="1")
property(name="syslogtag" position.to="32")
property(name="syslogtag" position.from="16" position.to="32")
position.relativeToEnd - использовать индексы from и to относительно конца строки, а не её начала;
property(name="syslogtag" position.relativeToEnd="on" position.from="5")
property(name="syslogtag" position.relativeToEnd="on" position.to="2")
property(name="syslogtag" position.relativeToEnd="on" position.from="16" position.to="1")
fixedwidth - длина выходной строки. Использует position.to
для задания длинны. Выходная строка дополняется пробелами до требуемой длинны;
property(name="syslogtag" fixedwidth="on" position.to="16")
compressspace - заменять повторяющиеся пробелы одним (символ US-ASCII SP). Замена не производится после вывода подстроки;
property(name="msg" compressspace="on")
field.number, field.delimiter - номер поля и символ разделителя в десятичном виде;
property(outname="__loglvl" name="msg" field.number="4"
field.delimiter="32" format="jsonf")
regex.expression, regex.type, regex.nomatchmode, regex.match, regex.submatch - регулярное выражение;
property(name="msg"
regex.type="ERE"
regex.submatch="0"
regex.nomatchmode="FIELD"
regex.expression="[0-9|a-z|A-Z| \t\n\r\f\v]*$")
constant(value="\nContent-Type: text/html;")
droplastlf - удалить последний конец строки LF;
property(name="msg" droplastlf="on")
mandatory - помечает поле как обязательное. Выводится даже пустым;
property(name="msg" mandatory="on")
spifno1stsp - использовать формат RFC3164;
property(name="msg" spifno1stsp="on")
datatype - тип данных для format=jsonf
: number
, string
, auto
, bool
;
property(name="$year" format="jsonf" datatype="number")
property(name="$month" format="jsonf" datatype="string")
property(name="$now" format="jsonf" datatype="auto")
property(name="$!val" format="jsonf" datatype="bool")
onEmpty - способ обработки пустых значений в format=jsonf
: keep
, skip
, null
. По умолчанию используется keep
;
property(name="app-name" format="jsonf" onEmpty="null")
property(name="app-name" format="jsonf" onEmpty="keep")
property(name="app-name" format="jsonf" onEmpty="skip")
Добавление шаблона для записи в файл:
template(name="exmpl-5" type="list") {
property(name="timestamp" dateFormat="rfc3339")
constant(value=" ")
property(name="hostname")
constant(value=" ")
property(name="syslogtag")
property(name="msg" spifno1stsp="on" )
property(name="msg" droplastlf="on" )
constant(value="\n")
}
Добавление шаблона для записи в MySQL:
template(name="exmpl-6" type="list" option.sql="on") {
constant(value="insert into SystemEvents (Message, Facility, FromHost, Priority, DeviceReportedTime, ReceivedAt, InfoUnitID, SysLogTag)")
constant(value=" values ('")
property(name="msg")
constant(value="', ")
property(name="syslogfacility")
constant(value=", '")
property(name="hostname")
constant(value="', ")
property(name="syslogpriority")
constant(value=", '")
property(name="timereported" dateFormat="mysql")
constant(value="', '")
property(name="timegenerated" dateFormat="mysql")
constant(value="', ")
property(name="iut")
constant(value=", '")
property(name="syslogtag")
constant(value="')")
}
Добавление шаблона для записи в json
:
template(name="exmpl-7" type="list" option.jsonf="on") {
property(outname="@timestamp" name="timereported" dateFormat="rfc3339" format="jsonf")
property(outname="host" name="hostname" format="jsonf")
property(outname="severity" name="syslogseverity" caseConversion="upper" format="jsonf" datatype="number")
property(outname="facility" name="syslogfacility" format="jsonf" datatype="number")
property(outname="syslog-tag" name="syslogtag" format="jsonf")
property(outname="source" name="app-name" format="jsonf" onEmpty="null")
property(outname="message" name="msg" format="jsonf")
}
Subtree
шаблон подключается параметрами type="subtree"
и subtree
с указанием какую ветку нужно использовать. Например, subtree="$!"
включает полное дерево в вывод, тогда как subtree="$!usr!exmpl8"
только поддерево, начинающееся с узла $!usr!exmpl8
. Шаблон лучше всего подходит при выводе иерархических структур - таких как MongoDB. Формат вывода задается предварительно через выражения добавления set
и удаления unset
:
set $!usr!exmpl8!msg = $msg;
set $!usr!exmpl8!dataflow = field($msg, 58, 2);
template(name=”exmpl-8” type=”subtree” subtree=”$!”)
Основная идея заключается в предварительном добавлении и удалении скриптовых выражений в результирующее дерево. В дальнейшем оно может быть использовано в шаблоне.
Subtree
шаблон - единственный способ добавления дерева непосредственно в корень объекта. Другие типы позволяют добавлять лишь поддеревья.
Деревья можно использовать не только при структурном выводе, но и при текстовом. Однако, шаблон не позволяет задать статический текст. Из-за этого использование текстового вывода скорее полезно при отладке.
Добавление шаблона для записи в MongoDB:
set $!time = $timestamp;
set $!sys = $hostname;
set $!procid = $syslogtag;
set $!syslog_fac = $syslogfacility;
set $!syslog_sever = $syslogpriority;
set $!pid = $procid;
template(name="exmpl-9" type="subtree" subtree="$!")
String
шабон наиболее схож с устаревшим способом объявления шаблона. Шаблон подключается параметрами type=string
и string
с указанием применяемого шаблона. Например, string="%TIMESTAMP:::date-rfc3339% %msg%"
задаст выходную строку в дату со временем в формате RFC-3339 и сообщения. Формат вывода задается в виде статического текста и заменяемых переменных:
template(name="exmpl-10" type="string"
string="%TIMESTAMP:::date-rfc3339% %HOSTNAME% %syslogtag%%msg:::sp-if-no-1st-sp%%msg:::drop-last-lf%\n"
)
String
шаблон распознает свойства сообщения, а также может использовать другие источники. Отлично подходит для форматирования простых текстовых сообщений, без комплексной логики обработки.
Plugin
шаблон подключается параметрами type=plugin
и plugin
с указанием имени сгенерированного плагина. Формат задается на уровне кода и поэтому фиксированный. Эта особенность повышает производительность. Формат вывода задается в виде ссылки на плагин:
template(name="exmpl-11" type="plugin" plugin="mystrgen")