备注:正则表达式
V6以前是旧格式sql
V7版本,传统语法与最新配置可在配置文件中混合使用,咱们下面学习的是新格式。mongodb
用来定义模板,是一种静态声明,表示全部的模板都会在rsyslog读取配置文件的时候被定义。template不会受到if语句或嵌入配置的影响。shell
template(parameters)
list templates则是一种扩展的支持 template(parameters) {list-descriptions}
类型参数指定不一样的template类型,不一样类型就可使用不一样的方法来定义template的内容,类型不会影响插件工做,合适的template类型会很好的匹配需求。数据库
下面具体讲一下每种类型express
1. list类型json
List template是由一系列反复出现的内容和变量语句生成的,内容经过“{}”包含起来,这种类型通常用于已知输出结构的状况,好比,ommongodb。建议在有复杂属性替换的状况下使用这种类型,比较清晰安全
List template包含template头部(type = "list")和紧接着的用”{}”括起来的constant和property部分。服务器
举例:性能
template(name="tpl1" type="list"){ constant(value="Syslog MSG is: '") property(name="msg") constant(value="', ") property(name="timereported" dataFormat="rfc3339" caseConversion="lower") constant(value="\n") }
备注:这个示例可能会被用于定位常见的文件输出
(1)常量的声明(constant statement)
一种指定常量文本的方法。常量主要用于基于文本的输出。
举例:
template(name="outfmt" type="list"){ property(name="$!user!msgnum") constant(value+"\n") }
下面是常量文本中可被识别的一系列转义字符的含义:
\ |
单个反斜线 |
\n |
换行(line feed) |
\000 |
三位八进制数-数字值对应的字符(\101表明字母A),三个数是必须的,可是建议使用十六进制 |
\xhh |
十六进制数-表示数字值对应的字符(\x41表明A),注意两个数都是必须给定的 |
若是反斜线后面跟了一个不支持的字符,那么将会被当作一个威胁报错,这种状况会致使不可知的动做
为结构化输出建立name/value树的时候,没有outname参数的常量(constant text)会被忽略掉。
template(name="outfmt" type="list"){ property(name="$!usr!msgnum") constant(value="\n" outname="IWantThisInMyDB") }
常量声明时可以使用如下参数
value |
常量的值 |
outname |
结构化输出中的字段名 |
(2)property的声明
property声明用于包含属性文本,能够用于全部的属性。选项options用来指定提取或修改属性的某些部分,对于property支持如下参数:
name |
要访问的属性名 |
outname |
结构化输出中的字段名 |
dateformat |
用于指定日期相关属性的日期格式 |
caseconversion |
将文本字母转换成大写或小写,支持的value有“lower”和“upper” |
controlcharacters |
指定如何处理控制字符,value:转义字符(escape),空格(用一个空格替换),从字符串中移除(drop) |
securepath |
在dynafile templates中用来建立pathnames |
format |
指定字段格式。csv(csv),json(没有字段头field header的json格式),jsonf(完整的json段),jsonr(没有双反斜线,可是可将其做为安全的json字段),jsonfr(jsonf和jsonr的结合格式) |
position.from |
从这个位置开始包含子字符串(1是第一个位置) |
position.to |
一直到这个位置开始包含子字符串 |
position.relativetoend |
From和to的位置与字符串的结尾有关 |
field.number |
包含此字段的匹配 |
field.delimiter |
字段提取的分隔符的十进制值 |
regex.expression |
使用的正则表达式 |
regex.type |
要么ERE,要么BRE |
regex.nomatchmode |
若是没有匹配该怎么作 |
regex.match |
所使用的匹配 |
regex.submatch |
所使用的子匹配 |
droplastLf |
若是有一串换行符(LF)则丢弃 |
mandatory |
表示字段的强制性,若是设置为”on”,那么就算为空,这个字段也会在结构化输出的时候一直存在。若是设置为”off”(默认值),那么当为空得时候,这个字段就不会传给结构化输出。这个选项在支持动态结构的输出中颇有用(好比ommongodb) |
spifno1stsp |
用于处理RFC3164 template的专用选项 |
2.子树(subtree)
(1)概念
从rsyslog 7.1.4开始启用的内容。subtree主要用来生成基于完整(CEE)subtree的template。这种模板主要用于知道如何处理层级结构的输出,好比ommongodb,对于这种类型,参数subtree必须被指定以告知要使用哪一个subtree。例如template(name="tpl1" type="subtree" subtree="$1")表示包含全部CEE数据,而template(name="tpl2" type="subtree" subtree="$!usr!tpl2")则只包含以"$!usr!tpl2"开头的subtree。使用这种模板的核心理念是,真实地数据是经过set和unset脚本语句预生成的,同时结果的结构会再模板内部被使用。若是一个完整的subtree须要被直接放到对象的根部(object’s root),则必须使用这种类型。相对于其余全部的模板类型,只有subcontainers可以被生成。注意subtree类型一样能够用于基本文本的输出,如omfile。不过,这种状况下,你是没法指定常量的,所以就没法包含换行符。由此,对于文本输出使用subtree一样被用于作调试或者一些特殊的场合(好比文本将会被JSON解释器所解析)
(2)用例
subtree的典型用例:先建立一个自定义的subtree而后再template中使用,好比:
set $!usr!tpl2!msg = $msg; set $!usr!tpl2!dataflow = fied($msg, 58, 2); template(name="tpl2" type="subtree" subtree="$!usr!tpl2")
这里,咱们假设$msg包含不一样的字段,来自某字段的数据将会被提取出来并存储用以与message一块儿做为字段的内容
3.字符串(string)
包含一个强制的参数string,用来包含要使用的模板字符串,模板字符串是常量和replacement变量的混合字符串。这种变量来自于message或者当最后的字符串到达插件时候生成的动态内容。基于字符串的模板是制定文本内容的一种很好的方法,特别是当对于属性没有复杂操做的状况下,特别适用。
template(name="tpl3" type="string" string="%TIMESTAMP:::date-rfc3339% %HOSTNAME% %syslogtag%%msg:::sp-if-no-1st-sp%%msg:::drop-last-lf%\n" )
上例中,百分号之间的文本将会被rsyslog的property replacer所解释。在nutshell中,它包含了将要使用的属性以及格式化所需的选项和其余处理,这与list模板中的property对象的功能相似(实际上仅仅是使用不一样的语言来描述一样地事情)
全部百分号外的内容都是常量,这上例中,在属性值中间主要含有一些空格,在字符串的最后,使用了一个转义字符。
转义字符容许指定那些没法打印的字符,这与C以及其余语言中得转义字符类似,他们是以一个反斜线引出并在其后跟上一个或多个字符来表示特定的字符,好比“\7”在US-ASCII中表明BEL(响铃),“\n”表明新行。总之与C和perl语言支持的类似,但会有一些限制
4. 插件(plugin)
使用plugin类型的时候,模板是由一个插件(或者被称为”strgen”或者”string generator”)来生成。它的格式是固定的,就像他被编码时候同样。然而这种类型并不灵活,因为它提供了很高的性能(并非说其余类型的模板很缓慢,而是指在那些对实时性要求很高的环境中),因此会被使用。在这种类型中,plugin参数必须被指定,而且要包含插件名用来识别它。注意在模板中,插件必需要被实现加载好,例如:
template(name="tpl4" type="plugin" plugin="mystrgen")
选项是可选的,注意不要混淆模板的选项和属性的选项-属性选项会被属性替换器(property replacer)处理并用于单个属性而非整个模板。模板选项是大小写敏感的,目前模板属性有:
无论何时,绝对不要同时使用多个模板选项,由于会引发未知的故障和逻辑错误
当模板是用以写入数据库的时候,则必须指定要么为sql选项要么为stdsql选项,不然有可能出现SQL注入的问题。须要注意的是,因为在现实状况,有的厂商并不遵照标准的sql规则而引入本身的转义方法,因此一种选项并不能知足全部的工做,所以你必须确保你使用的是正确地格式。若是格式错误,仍然有可能遭遇sql注入的威胁。数据库写入程序会检查模板中存在的SQL选项,若是不存在,那么数据库写入操做就会被禁用,这也主要是为了防止因为你忘记配置sql选项而致使的SQL注入问题。SQL选项对于文件也颇有用,特别是在出于性能考虑,你想要将文件导出到另一台机器的数据库中得状况。对于其余的状况,若是没有特别须要,建议不要使用,由于这会带来一些处理时间上的开销,虽然很少,可是对于某些在这方面敏感的系统来讲,这就显得尤其重要了。对于写入数据库动做来讲,默认状况下使用的是sql选项,因为当前咱们只支持MySQL而且sql选项也兼容了MySQL默认的配置,因此这就是个最佳选择了。固然若是你将NO_BACKSLASH_ESCAPES设置为on的话,则就须要使用stdsql选项以免SQL注意的威胁。
1.为omfile建立动态文件名
template(name="DynFile" type="string" string="/var/log/system-%HOSTNAME%.log")
2.传统格式
传统语法格式以下:
$template name,param[,options]
name:模板名
param:指定模板内容的参数
options:设置模板选项
3.预留的模板名