一、 Template功能

  • 根据用户需求指定任意格式
  • 动态生成文件名
  • 每个输出都使用了一些模板,包括针对文件的,针对用户消息等

备注:

  • 旧版本:$template
  • 新版本:template()

V6之前是旧格式

V7版本,传统语法与最新配置可在配置文件中混合使用,我们下面学习的是新格式。

二、Template()声明

1.作用

用来定义模板,是一种静态声明,表示所有的模板都会在rsyslog读取配置文件的时候被定义。template不会受到if语句或嵌入配置的影响。

2.基本声明结构

template(parameters)

list templates则是一种扩展的支持   template(parameters) {list-descriptions}

3.template的类型

类型参数指定不同的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是第一个位置)

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, , );

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标准出台的时候,格式可能不会发生改变,但也有可能会发生一些变化
  • RSYSLOG_DebugFormat - 一种特殊的用于调试property故障的格式,不要在生产环境或者远程转发的情况下使用这种格式

Rsyslog的模板template详解的更多相关文章

  1. Jquery 引擎模板 -template详解

    一.1.jTemplate简介 jTemplates是一个基于Jquery的js模板引擎插件.该引擎全部代码由JS实现,可以配合AJAX,JSON一起协同工作,模板内容可以用JS代码,实现了活动更新, ...

  2. 【转】Eclipse Java注释模板设置详解

    Eclipse Java注释模板设置详解   设置注释模板的入口: Window->Preference->Java->Code Style->Code Template 然后 ...

  3. 【转载】 Eclipse注释模板设置详解

     Eclipse注释模板设置详解 网站推荐: 金丝燕网(主要内容是 Java 相关) 木秀林网(主要内容是消息队列)

  4. 【微信小程序】template模板使用详解

    WXML提供模板(template),可以在模板中定义代码片段,然后在不同的地方调用. 模板的作用域: 模板拥有自己的作用域,只能使用 data 传入的数据以及模板定义文件中定义的 <wxs / ...

  5. tp6源码解析-第二天,ThinkPHP6编译模板流程详解,ThinkPHP6模板源码详解

    TP6源码解析,ThinkPHP6模板编译流程详解 前言:刚开始写博客.如果觉得本篇文章对您有所帮助.点个赞再走也不迟 模板编译流程,大概是: 先获取到View类实例(依赖注入也好,通过助手函数也好) ...

  6. discuz默认模板文件结构详解-模板文件夹介绍

    | — template — default   系统内置风格模板(默认风格)| — template — default  – discuz_style_default.xml  风格安装文件,可用 ...

  7. 原生twig模板引擎详解(安装使用)

    最近在学习SSTI(服务器模板注入),所以在此总结一下 0x00 Twig的介绍 什么是Twig? Twig是一款灵活.快速.安全的PHP模板引擎. Twig的特点? 快速:Twig将模板编译为纯粹的 ...

  8. OpenCV模板匹配算法详解

    1 理论介绍 模板匹配是在一幅图像中寻找一个特定目标的方法之一,这种方法的原理非常简单,遍历图像中的每一个可能的位置,比较各处与模板是否“相似”,当相似度足够高时,就认为找到了我们的目标.OpenCV ...

  9. Eclipse注释模板设置详解

    设置注释模板的入口:Window->Preference->Java->Code Style->Code Template 然后展开Comments节点就是所有需设置注释的元素 ...

随机推荐

  1. C# 系统应用之鼠标模拟技术及自动操作鼠标

    游戏程序的操作不外乎两种——键盘输入控制和鼠标输入控制,几乎所有游戏中都使用鼠标来改变角色的位置和方向,本文主要是讲述如何使用C#调用Windows API函数实现鼠标模拟操作的功能.首先通过结合Fi ...

  2. Office 365部分安装及同时安装Visio的方法

    From MWeb Win版本的Office 365安装包默认安装所有组件,没有选择的页面,在安装Office 365后再安装下载的Visio 2016专业版时,会显示计算机上已经安装了即插即用Off ...

  3. 详解LeetCode 137. Single Number II

    Given an array of integers, every element appears three times except for one, which appears exactly ...

  4. 20155236 《信息安全概论》实验二(Windows系统口令破解)实验报告

    20155236 <信息安全概论>实验二(Windows系统口令破解)实验报告 北京电子科技学院(BESTI) 实验报告 课程:信息安全概论 班级:1552 姓名:范晨歌 学号:20155 ...

  5. 2017-2018-1 20155315 《信息安全系统设计基础》加分作业:实现mypwd

    学习pwd命令 man pwd查看 pwd命令用于显示当前工作目录,是Linux下最常用的命令之一.在不太确定当前位置时,就会使用pwd来判定当前目录在文件系统内的确切位置. 环境变量OLDPWD表示 ...

  6. 20155321 2016-2017-2 《Java程序设计》第三周学习总结

    20155321 2016-2017-2 <Java程序设计>第三周学习总结 教材学习内容总结 4.1 类与对象 定义类用class关键字,建立实例用new关键字 一个原始码中可有多个类定 ...

  7. 2016-2017-2 20155322 实验四 Android 开发基础

    2016-2017-2 20155322 实验四 Android 开发基础 实验内容 下载和安装Android Studio 学会使用Android Studio进行简单的Android开发 实验知识 ...

  8. 优步UBER司机全国各地最新奖励政策汇总(持续更新...)

    滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://didi-uber.com/archiv ...

  9. 1130: [POI2008]POD Subdivision of Kingdom

    1130: [POI2008]POD Subdivision of Kingdom https://lydsy.com/JudgeOnline/problem.php?id=1130 分析: 有效状态 ...

  10. springboot 中controller 返回html界面或 jsp界面

    参考链接:https://blog.csdn.net/qq_15260315/article/details/80907056 经尝试,返回html界面没问题,但是返回jsp界面是有问题的,just ...