rsyslog模板-template 动态文件名

4,566 阅读4分钟

介绍

  • 模板是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")