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

Шаблоны позволяют задавать пользовательские форматы вывода сообщений и генерировать имена выходных файлов. Любой вывод в rsyslog использует шаблоны: запись в файл, пользовательские сообщения и другие. Если шаблон не задан, используется один из предопределенных в rsconf.c шаблонов.

В конфигурации шаблон объявляется выражением tempale() или его устаревшей формой $template. Шаблоны инициализируются на этапе чтения конфигурационного файла и не чувствительны к условным операторам или вложенным конфигурациям.

Шаблон может быть объявлен в сокращенном виде

template(parameters)

или расширенном

template(parameters) { list-descriptions }

и содержать обязательные параметры: имя и тип.

Имя должно быть уникально. Контроль за уникальностью возлагается на пользователя. В случае коллизии поведение не определено.

Тип позволяет использовать разные способы объявления шаблона:

  • list - шаблон генерируется на основе списка константных и вычисляемых выражений;
  • subtree - шаблон генерируется на основе деревьев;
  • string - шаблон формируется на основе строки;
  • plugin - шаблон генерируется на основе плагина.

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

Вывод сообщения может производиться в текстовой или структурной форме.

List шаблон

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 statements)

Константные выражения возвращают статический текст. Используются для добавления текста в выходную строки или свойства в структуру.

Выражение имеет вид:

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 statements)

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

Выражение имеет вид:

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 шаблон

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 шаблон

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 шаблон

Plugin шаблон подключается параметрами type=plugin и plugin с указанием имени сгенерированного плагина. Формат задается на уровне кода и поэтому фиксированный. Эта особенность повышает производительность. Формат вывода задается в виде ссылки на плагин:

template(name="exmpl-11" type="plugin" plugin="mystrgen")