介绍
- 模板是rsyslog的关键功能。
- 它们允许指定用户可能需要的任何格式。
- 它们还用于动态文件名生成。
注意:模板的关键元素是rsyslog属性。
- rsyslog有预制的硬编码Templates
模板基本语法
template(parameters) { list-descriptions }
- 每一个模板都有一个name参数,用来指定模板名
- type: 指定模板类型
- list
- subtree
- string
- plugin
List类型
template(name="tpl1" type="list") {
constant(value="Syslog MSG is: '")
property(name="msg")
constant(value="', ")
property(name="timereported" dateFormat="rfc3339" caseConversion="lower")
constant(value="\n")
}
template(name="outfmt" type="list" option.jsonf="on") {
property(outname="message" name="msg" format="jsonf")
constant(outname="@version" value="1" format="jsonf")
}
constant常量声明
支持带以下参数:
- value 常量值本身
- outname 输出字段名(结构化输出)
- format 空着或
jsonf
Property 声明
该声明用于包含属性文本,它可访问所有属性。支持以下参数:
- name
- outname
- dateformat
- date.inUTC
- caseconversion 支持“lower” and “upper”
- format
- csv
- json
- jsonf 完整json字段
- jsonr
- jsonfr
- compressspace
- position.from 从此位置开始获取子字符串(1是第一个位置)
- position.to
- field.delimiter
- spifno1stsp RFC3164模板处理的专家选项
- droplastlf 删除尾随的LF(如果存在)
- datatype 等等
YYYY-MM-DD的表示法:
property(name="timereported" dateformat="year")
constant(value="-")
property(name="timereported" dateformat="month")
constant(value="-")
property(name="timereported" dateformat="day")
Subtree
自rsyslog 7.1.4起可用
用例是首先创建一个自定义子树,然后将其包含在模板中,我们假设$msg包含各种字段,并且将从字段中提取的数据(与消息一起)作为字段内容存储:
set $!usr!tpl2!msg = $msg;
set $!usr!tpl2!dataflow = field($msg, 58, 2);
template(name="tpl2" type="subtree" subtree="$!usr!tpl2")
String
与传统模板语句非常相似。它具有强制性的参数字符串,其中包含要应用的模板字符串。
template(name="tpl3" type="string"
string="%TIMESTAMP:::date-rfc3339% %HOSTNAME% %syslogtag%%msg:::sp-if-no-1st-sp%%msg:::drop-last-lf%\n"
)
模板字符串是常量文本和替换变量的混合,基于字符串的模板是指定文本内容的好方法,尤其是在不需要对属性进行复杂操作的情况下。
插件
在这种情况下,模板由插件生成(称为“ strgen”或“字符串生成器”)。格式是固定的。
示例
写入文件的标准模板
template(name="FileFormat" 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")
}
这等价于String:
template(name="FileFormat" type="string"
string= "%TIMESTAMP% %HOSTNAME% %syslogtag%%msg:::sp-if-no-1st-sp%%msg:::drop-last-lf%\n"
)
注意:模板字符串本身必须在一行上。
用于转发到远程主机的标准模板(RFC3164 mode)
template(name="ForwardFormat" type="list") {
constant(value="<")
property(name="pri")
constant(value=">")
property(name="timestamp" dateFormat="rfc3339")
constant(value=" ")
property(name="hostname")
constant(value=" ")
property(name="syslogtag" position.from="1" position.to="32")
property(name="msg" spifno1stsp="on" )
property(name="msg")
}
等价的字符串写法:
template(name="forwardFormat" type="string"
string="<%PRI%>%TIMESTAMP:::date-rfc3339% %HOSTNAME% %syslogtag:1:32%%msg:::sp-if-no-1st-sp%%msg%"
)
注意:模板字符串内容必须在一行上。
写入MySQL数据库的标准模板
template(name="StdSQLformat" 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="')")
}
等价的字符串写法:
template(name="stdSQLformat" type="string" option.sql="on"
string="insert into SystemEvents (Message, Facility, FromHost, Priority, DeviceReportedTime, ReceivedAt, InfoUnitID, SysLogTag) values ('%msg%', %syslogfacility%, '%HOSTNAME%', %syslogpriority%, '%timereported:::date-mysql%', '%timegenerated:::date-mysql%', %iut%, '%syslogtag%')"
)
生成JSON
template(name="outfmt" 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")
}
生成的数据大概是这样(美化格式后):
{
"@timestamp": "2018-03-01T01:00:00+00:00",
"host": "172.20.245.8",
"severity": 7,
"facility": 20,
"syslog-tag": "tag",
"source": "tag",
"message": " msgnum:00000000:"
}
输出并不是美化json格式后的,对API来说没必要!
最有用的来了:
为omfile创建动态文件名
template (name="DynFile" type="string" string="/var/log/system-%HOSTNAME%.log")
在rsyslog.conf中这样写: 按IP分文件夹,日期分文件名
template (name="DynFile" type="string" string="/data/log/%fromhost-ip%/%fromhost-ip%_%$YEAR%-%$MONTH%-%$DAY%.log")
*.info;mail.none;authpriv.none;cron.none action(type="omfile" dynaFile="DynFile")
关于发送到ES的模板
在CentOS7.4上实测通过,发送的是用户bash操作记录,json格式:
module(load="omelasticsearch")
set $!es!fip = substring(replace(field(field($msg,32,5),":",1),")",""),1,16);
set $!es!cmd = re_extract($msg,'(^[A-Za-z0-9_]+ pts\\/[0-9]+ 20[0-9]{2}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2} \\([0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\) .*)([0-9]{1,3} [0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}\\s)(.*\$)',0,3,"**No Match**");
template(name="esFormat"
type="list"
option.json="on") {
constant(value="{\"login-user\":\"") property(name="msg" field.number="1" field.delimiter="32")
constant(value="\",\"login-pts\":\"") property(name="msg" field.number="2" field.delimiter="32")
constant(value="\",\"login-time\":\"") property(name="msg" field.number="3" field.delimiter="32")
constant(value=" ") property(name="msg" field.number="4" field.delimiter="32")
constant(value="\",\"login-from-ip\":\"") property(name="$!es!fip")
constant(value="\",\"cmd-user\":\"") property(name="msg" field.number="8" field.delimiter="32")
constant(value="\",\"cmd-time\":\"") property(name="msg" field.number="11" field.delimiter="32")
constant(value="\",\"cmd\":\"") property(name="$!es!cmd")
constant(value="\",\"cmd-exit-code\":\"") property(name="msg" field.number="10" field.delimiter="32")
constant(value="\",\"cmd-pwd\":\"") property(name="msg" field.number="9" field.delimiter="32")
constant(value="\",\"@host\":\"") property(name="hostname")
constant(value="\",\"@host-ip\":\"") property(name="msg" field.number="6" field.delimiter="32")
constant(value="\",\"@severity\":\"") property(name="syslogseverity-text")
constant(value="\",\"@facility\":\"") property(name="syslogfacility-text")
constant(value="\",\"@syslogtag\":\"") constant(value="user-cmd")
constant(value="\",\"@timestamp\":\"") property(name="timegenerated" dateFormat="mysql")
constant(value="\"}")
}
local1.info /var/log/cmd.his.log
local1.info action(type="omelasticsearch" server="es-host:9200" template="esFormat" errorFile="/data/log/eserr.log" searchIndex="test-index" searchType="_doc")