模板

Templates  模板:

模板是rsyslog的一个关键特性, 它们允许指定任何格式一个用户可能需要。


它们也被用于动态文件命名生成,每个输出在rsyslog 使用模板。


这适用于文件,用户消息等。


数据库writer 期望它的模板是一个合适的SQL语句,因此这是一个高度自定义的。


当没有模板被指定时,你可能会问 所有这些工作证明做,答案是简单的,尽管,

模板兼容stock syslogd 格式是硬编码到rsyslogd.


因此如果没有模板被指定, 我们使用那些硬编码模板之一。搜索“template_”在syslodg.c你会找到硬编码


模板是通过template()语句指定的, 它们可以指定通过 $template legacy statements.


注意: 模板的关键原始是rsyslog 属性,查看rsyslog 属性参考可用的列表。


The template() statement template() 语句:


template() 语法是用于定义模板,注意它是一个静态语句, 这意味着所有的模板是定义当rsyslog 读取配置文件。

因此, 模板不受影响通过如果语句或者代码嵌套的影响


基本的模板结构语句如下:

template(parameters)


除了简单的语法之外,列表模板(下面描述) 支持一个扩展的语法:

template(parameters) { list-descriptions }


每个模板有一个参数名字,指定模板名字, 和一个参数类型,


指定模板类型。 名字参数必须是唯一的,和行为是不可预测的 如果它不是。


类型参数 指定不同的模板类型,不同的类型简单的启用不同方式到指定的模板内容。

默认类型不影响当一个(output) 插件可以处理。

因此使用这个类型最好适用你的需求,下面的类型是可用的;

list
subtree
string
plugin


描述如下:


列表:

在这种情况下,templates 是通过常量和变量的列表生成,那些遵循的模板指定在大括号里。

这是典型是主要的意味着 使用结构意识的输出,像ommongodb。


然而,它也能很好的基于文本的输出。


我们推荐使用这个模式如果更多的复杂的属性替换需要被处理。


在那种情况下,基于列表模板语法是更加简单的相比简单的基于字符串的




列表模板包含模板header(类型="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="
")
    }

此实例是可能的主要针对基于文件输出的:

常量声明:

这提供了一种方式来指定文本方法, 文本是用于字面的。


它是主要倾向于基于文本的输出,这样 一些常量文本可以被包括。


比如, 如果一个复杂的模板是创建用于文件输出,一个通常需要完成通过一个新行,

可以通过一个常量语句介绍,这里有一个实际使用的例子 :

template(name="outfmt" type="list") {
    property(name="$!usr!msgnum")
    constant(value="
")
}


下面的escape 序列是被确认在常量文本:


1.\ 反斜杠


  LF


ooo (三进制数字) 代表数字的值(例如 101 等于“A”).


注意 3个8进制的数字必须给予(与某些语言相反,在1和3之间是有效的)


注意: 如果一个未支持的字符跟着一个反斜杠,这是被视为一个错误,在这种情况下,行为是不可预测的。



借助相同模板的使用用于文本输出和结构的使用,固定文本没有一个“outname” 参数会被忽略当

创建name/value 树用于结构输出。


因此如果你需要一个支持一些常量文本 比如 到mongodb,你必须包含一个outname,可以看到:


template(name="outfmt" type="list") {
    property(name="$!usr!msgnum")
    constant(value="
" outname="IWantThisInMyDB")
}


"常量"语句支持下面的参数:

值--常量值来使用

outname-- output 字段名字(对于结构化输出)


属性声明:

这个语句是用于包含合适的文本。它可以访问所有的属性,Also,选项允许指定只选择合适的部分或者修改它。


它支持下面的参数:


name --- 访问属性的名称

subtree 子树:

在rsyslog 7.1.4 版本可用:

在这种情况下,模板是基于一个完整的subtree生成。 这种模板的类型是最有用的用于outputs,知道如何处理层次结构,像ommongodb. 


在那种类型, parameter subtree 必须被指定,告诉哪个subtree 被使用。


比如template(name=”tpl1” type=”subtree” subtree=”$!”)  包含所有的CEE 数据,


当template(name=”tpl2” type=”subtree” subtree=”$!usr!tpl2”)只包含subtree 开启以$!usr!tpl2.


核心概念当使用这种类型的模板是实际的数据是预制的通过设置和unset 脚本语句,结果结构是然后用于模板内部。


这个方法必须用于如果一个完整的subtree 需要被放置到对象的root.


在所有的其他模本类型,只有字容器可以被生成。注意 那个subtree 类型可以被用于基于文本的输出,像omfile.


然而,你不能有任何能力指定常量变量,因此不能包含行中断。


因此,使用这个模板类型用于文本输出是通常有用的用于debugging or very special cases

(例如,文本解释通过JSON解析)


使用例子:

一个典型的使用例子是首先创建一个自定义的subtree,然后包含到模板,像这个小的例子:


使用例子:

 set $!usr!tpl2!msg = $msg;
set $!usr!tpl2!dataflow = field($msg, 58, 2);
template(name="tpl2" type="subtree" subtree="$!usr!tpl2")


这里,我们假设$msg 包含各种字段,数据从一个字段是被提取好存储 和消息一起 作为字段内容:


字符串:

这个类似于传统的模板语句, 它有一个强制的数字字符串,持有模板字符串被应用。

一个模板字符串是一个固定字符串的混合和替换变量


那些变量从消息或者其他动态内容中获取 当最终的字符串被传递到一个插件被生成时。基于字符串的模板是一个伟大的方式来指定文本内

容,

尤其是如果没有复杂的操作属性是必要的

这是一个基字符串的模板的例子:

template(name="tpl3" type="string"
         string="%TIMESTAMP:::date-rfc3339% %HOSTNAME% %syslogtag%%msg:::sp-if-no-1st-sp%%msg:::drop-last-lf%
"
        )



文本在百分号% 之间是通过rsyslog 属性替代,概括的说, 它包含属性来使用基于用于格式化和进一步处理.



这是非常类似于属性对象 在list 模板(它实际上知识一个不同的语言来表达大多数相同的东西)



百分之一以外的一切都是不变的文本,在上面的例子中,我们我大部分的间隔在属性值之间,


插件:



在这种情况下,模板是通过一个插件(被称为“strgen” or “string generator”)生成。



格式是固定的 因为它是被编码的。

虽然这个是不灵活的, 它提供了优越的性能,经常使用由于那个原因(不是常规的模板是慢的,但是非常苛刻的环境 

最后一点可以有差异).

参考插件的文档对于更详细的细节。

对于这种类型,参数插件必须被指定和必须包含插件的名字 作为它定义本身。


注意插件必须被提前加载被使用在一个模板内 ,配置例子:

template(name="tpl4" type="plugin" plugin="mystrgen")

选项:

<选项> 部分是可选的, 它作为选项影响模板作为一个整体和是模板参数的一部分。查看详细细节如下,


确保不要弄错模板选项使用合适的选项,后者通过适当的替代者处理,应用一个单独的属性,


只有(不是整个模板),模板选项是不区分大小的,当前定义是:

option.sql -- 格式化字符串用于一个SQL语句在MySQL 格式。整个会替换单引号("'") 和反斜杠字符通过它们的(和\)

在每个字段里。


请注意 在MySQL 配置,NO_BACKSLASH_ESCAPES 模式必须关闭对于这个格式工作(这是默认的)


option.stdsql-- 格式化字符串用于一个SQL语句,被发送到一符合标准的 sql server.


这是喜欢单个引号("'")通过2个单引号( (“’‘”)  在每个字符安。


你必须使用stdsql 结合MYSQL 如果在MYSQL 配置了 NO_BACKSLASH_ESCAPES


option.json - 格式化字符串对于一个json语句,这个会替换单引号通过2个单引号在每个字段


option.casesensitive 选项区分大小写-- 对待属性名字引用作为一个敏感的例子。


默认是"off"的, 所有的属性名字引用是第一个转换为小写在模板定义时。


当这个选项开启时,属性名字是查询作为定义在模板内。 使用这个选项如果你有JSON ($!*), local (!.*), or global ($!\*) 


属性 包含大写字母,正常 Rsyslog 属性是大小写敏感的,因此这个选项不是需要的 对于合适的引用那些属性。


使用选项 option.sql, option.stdsql, and option.json 是互斥的,使用多余一个在相同的时间可以导致

不可预知的行为。



无论是sql或者stdsql 选项必须被指定当一个模板被用于写到一个数据库,


否则 注射可能失败。


请注意,由于不幸的事实  几个数据库厂商有侵犯了SQL标准和介绍了它们自己的escape 方法,


它是重要的有一个单独的选项做所有的工作,因此你自己确保你使用了正确的格式,

如果你选择了错误,你仍旧容易受到sql注入。


如果它不存在, 写数据库的操作是被禁用的。


这是保护你免受意外忘记和变的容易受到SQL注入,SQL选项可以是有用的在文件特别是 如果你需要导入它们到数据库

在另外一个机器 由于性能原因。

然而,不要使用它 如果你没有一个真正的需要。


默认的模板对于写数据库动作有一个sql选项集。


比如我们当前支持的MySQL 和sql选项匹配默认的MySQL 配置, 这是一个很好的选择。

然而,如果你启用NO_BACKSLASH_ESCAPES在你的MySQL 配置,你需要支持一个stdsql选项的模板


template (name="TraditionalFormat" type="string"
string="%timegenerated% %HOSTNAME% %syslogtag%%msg%\n"


例子

标准的模板用于写文件:

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="
")
    }


等效字符串模板看起来像这样:

template(name="FileFormat" type="string"
         string= "%TIMESTAMP% %HOSTNAME% %syslogtag%%msg:::sp-if-no-1st-sp%%msg:::drop-last-lf%
"
        )


注意 模板字符串本身必须是一个单行


标准模板用于转发到一个远程机器(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")
    }


创建动态文件名字用于omfile


模板可以用于产生action 使用动态的文件名字。 比如,如果你想要分散syslog 消息从不同的主机到不同的文件(每个主机一个),

你可以定义下面的模板:

template (name="DynFile" type="string" string="/var/log/system-%HOSTNAME%.log")
Legacy example:

$template DynFile,"/var/log/system-%HOSTNAME%.log"

这个模板可以用于当定义一个action,它会导致像 “/var/log/system-localhost.log”

原文地址:https://www.cnblogs.com/zhaoyangjian724/p/6199402.html