Rsyslog的模板template详解
⼀、 Template功能
根据⽤户需求指定任意格式
动态⽣成⽂件名
每个输出都使⽤了⼀些模板,包括针对⽂件的,针对⽤户消息等
备注:
旧版本:$template
新版本:template()
V6之前是旧格式
V7版本,传统语法与最新配置可在配置⽂件中混合使⽤,我们下⾯学习的是新格式。
⼆、Template()声明
浏览器json格式化
1.作⽤
⽤来定义模板,是⼀种静态声明,表⽰所有的模板都会在rsyslog读取配置⽂件的时候被定义。template不会受到if语句或嵌⼊配置的影响。
2.基本声明结构
template(parameters)
list templates则是⼀种扩展的⽀持 template(parameters) {list-descriptions}
类型参数指定不同的template类型,不同类型就可以使⽤不同的⽅法来定义template的内容,类型不会影响插件⼯作,合适的template类型会很好的匹配需求。
List
Subtree
String
Plugin
下⾯具体讲⼀下每种类型
三、四种类型的学习
1. list类型
List template是由⼀系列反复出现的内容和变量语句⽣成的,内容通过“{}”包含起来,这种类型⼀般⽤于已知输出结构的情况,⽐
如,ommongodb。建议在有复杂属性替换的情况下使⽤这种类型,⽐较清晰
List template包含template头部(type = "list")和紧接着的⽤”{}”括起来的constant和property部分。
constant:不变的,对反复出现的⽂本进⾏描述
property:描述属性。对于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是第⼀个位置)
<⼀直到这个位置开始包含⼦字符串
field.number包含此字段的匹配
field.delimiter字段提取的分隔符的⼗进制值
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")
五、选项(options)
选项是可选的,注意不要混淆模板的选项和属性的选项-属性选项会被属性替换器(property replacer)处理并⽤于单个属性⽽⾮整个模板。模板选项是⼤⼩写敏感的,⽬前模板属性有:
option.sql - ⽤于为MySQL将字符串格式化为SQL语句,其中的单引号(’)和反斜线()会被对应的转义字
符替换(即“\’”和“\”)。注意在MySQL配置中,必须禁⽤NO_BACKSLASH_ESCAPES模式(默认就是禁⽤的)
option.stdsql - 将字符串格式化为SQL语句以发送给表在哪混的sql服务器。这种⽅式会将字段中的单引号(‘)⽤两个单引号来替换(’‘),如果MySQL配置⽂件中NO_BACKSLASH_ESCAPES设置为on那么就必须使⽤这个stdsql选项
option.json - 将字符串格式化为JSON形式,这种⽅式会讲字段中的单引号(‘)⽤两个单引号(’‘)来替换。
不管什么时候,绝对不要同时使⽤多个模板选项,因为会引起未知的故障和逻辑错误
当模板是⽤以写⼊数据库的时候,则必须指定要么为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.预留的模板名
以”RSYSLOG_”开头的模板名是位rsyslog预留使⽤的,⾃定义的模板不要使⽤这些名字,否则有可能产⽣冲突导致未知故障。下⾯就是⼀直预留共使⽤的系统模板
RSYSLOG_TraditionalFileFormat - 传统风格的使⽤不怎么精确的时间戳的默认⽇志⽂件格式
RSYSLOG_FileFormat - “现代风格”的⽇志⽂件格式,与TraditionalFileFormat类似,但是使⽤的是更⾼精度的时间戳和时区信息RSYSLOG_TraditionalForwardFormat - 传统风格的转发格式,时间戳精度低,通常⽤于将⽇志消息转发给其他的syslogd或者低于
3.12.5版本的rsyslogd
RSYSLOG_SysklogdFileFormat - sysklogd兼容的⽇志格式。如果使⽤选项SpaceLFOnReceive
on,EscapeControlCharactersOnReceive off和$DropTrailingLFOnReception off,那么⽇志格式就会遵从sysklogd的⽇志格式RSYSLOG_ForwardFormat - 类似传统的风格,但是有更⾼精度的时间戳和时区信息。建议在将⽇志消息转发给3.12.5或更⾼的rsyslog版本的时候使⽤
RSYSLOG_SyslogProtocol23Format - 在IETF的internet-draft ietf-syslog-protocol-23中指定的格式,可能会成为新的RFC⽇志标准格式。这种格式加⼊了⼀些改进。rsyslog的消息分析程序(message parser)可以读懂这种格式,所以它可以在最近版本的rsyslog中使⽤,对于不⽀持的syslog版本可能会直接拒绝这种格式,所以使⽤之前最好检查⼀下。【注】在最终的RFC标准出台的时候,格式可能不会发⽣改变,但也有可能会发⽣⼀些变化
故障的格式,不要在⽣产环境或者远程转发的情况下使⽤这种格式
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论