Rsyslog消息流:输入模块——>预处理模块——>主队列——>过滤模块——>执行队列——>输出模块正则表达式
输入模块是消息来源数据库
主要解决各类syslog协议实现间的差别后端
负责消息的存储,从Input传入的未通过滤的消息放在主队列,过滤后的消息放入到不一样的action queue中,再由执行队列送到各个输出模块多线程
Filter模块处理消息的分析和过滤,rsyslog能够对消息的任何部分进行过滤架构
消息的目的地框架
基本结构:数据流动过程当中内置的基本处理框架,可是对于消息流,是能够高度定制化的。定制工做是经过自定义rsyslog对象来完成的。tcp
消息流和对象概览:消息经过input模块进入rsyslog,接着到ruleset,进行规则匹配,也就是作一些处理,好比写到文件,数据库或者继续转发到远程主机。性能
处理原则:每一个ruleset会包含>=0个规则,一条规则包含一个过滤器和一个动做列表,一个动做列表会包含一个或多个动做测试
过滤器:控制流量,动做列表不会再出现过滤器spa
处理顺序:rsyslog.conf中得命令是从上到下一次执行的,因此,若是你中止了对某消息的处理,那么这行以后的命令就不会再被检查和执行了
流程控制语句:
if expr then ... else ...- 条件语句 stop - 中止处理当前消息 call - 调用一个rulese(相似子程序调用) continue - 一个空操做(NOP),颇有用。好比在if语句的then部分
流控制也能够经过过滤器条件来实现
数据操做语言:
set - 设置一个用户变量 unset - 删除以前设置的用户变量
Rsyslog 预约义了一些属性,来表明消息中的信息,咱们能够在定义输出格式、动态文件名的时候使用到这些属性。这里面比较重要的属性好比:msg(消息体)、hostname、pri(消息等级和类别)、time(时间有关),属性的名称中以$开头的是从本地系统得到的变量、不带$是从消息中得到变量。
属性替代的语法格式:
%propname:fromChar:toChar:options:fieldname%
属性替换的功能很强大,你可使用起始字符获取本身所需的字段,也可使用正则表达式,也可使用分隔符。举几个例子:为了兼容一个rfc协议,rsyslog规定若是用户输入的msg不是以空格开头,rsyslog会自动补充一个空格,所以若是你但愿输出的时候去掉这个空格,就可使用,举例:
%msg:2:$% #选取msg变量中,起始位置为2,终止位置为结尾
咱们常常须要根据空格来分析字符串,F表示使用字符分割,32是空格的ascii码,例:
%msg:F,32:3% #按照空格分隔,取第三个子串
正则匹配能够匹配特定的文字和格式,属性替代中还用到了一类特殊的以$!开头的变量,这是使用mmnormalize模块时特有的,能够实现相似于syslog-ng中parser模块的功能。
功能:
(1)定义输出的格式
(2)定义omfile模块的动态路径、动态文件。须要用到属性替换
形式:
(1)通常简单格式,可使用string的形式
(2)复杂的格式,可以使用list形式
(3)子树(subtree)
(4)插件(plugin)
(1)实现多实例功能
(2)针对syslog的来源使用不一样的过滤规则
(3)须要在配置文件中先定义ruleset,才可使用
举例:针对不一样端口使用不一样的过滤规则
#定义规则:以local3开头的全部日志发送到10.0.0.44的1999端口,以local4开头的日志发送到10.0.0.44的2000端口 $Ruleset tcp1999 $RulesetCreateMainQueue on Local3.* @@10.0.0.44:1999 #定义规则2 相似于上 $Ruleset tcp2000 $RulesetCreateMainQueue on Local4.* @@10.0.0.44:2000
rsyslog可以使用rsyslog标准的过滤规则,同时本身添加了一些扩展。好比在输出中指定rsyslog本身的处理方式,能够指定输出模板(template)
使用方法:在规则(ruleset)后面添加模板的名字,用分号隔开
举例:
#第一种方式:将local3.*的日志保存到所指目录中,输出处理使用t_msg模块 Local3.* -/data0/logs/local3.log;t_msg #?问号表示使用模板定义的动态路径 Local4.* -?f_local3_test;t_msg #第二种方式 #除了syslog标准的规则,rsyslog的做者还本身开发了一个叫作rainerscript的脚本语言,来定义更复杂的过滤规则,rainerscript能够对 #属性进行startwith、contains、%(取余)等过滤规则 if $pri-txt == local3.* and $msg contains "abc" then { *.* -/data0/logs/local3.log;t_msg } #这个例子表示若是pri是local3,且在消息中包含子串‘abc’ #第三种方式:使用属性的表示方式 :msg, regex, "^ [g-z]" /root/rsyslog_worker_dir/2000.log #以字母g到z开头的消息,注意msg开头有空格
队列的种类:主队列和工做队列。从输入模块进入主队列;主队列的消息,通过过滤模块,进入到相应的工做队列队列的四种工做模式。
队列的四种工做模式:
此外,内存队列还能够经过指定一个queuename来添加DA模式,DA模式主要是为了防止意外状况(进程关闭,server端宕机)下,内存队列能够不丢失。
关于队列的配置:
由于 MainMsgQueue 和 ActionQueue 的配置基本同样(除了有些默认值可能不一样), 因此这里以MainMsgQueue 为例:
$MainMsgQueueType [FixedArray/LinkedList/Direct/Disk] $MainMsgQueueFileName <name> #针对disk queue的配置,定义队列名,存储队列数据时用的文件名就是这个名称 MainMsgQueueCheckpointInterval <number> #针对disk queue的配置,单位条数,设置在检查点写入相关信息,增长可靠性,可是会下降性能 $MainMsgQueueDequeueBatchSize <number> [default 32] #设置多少条队列做为一个batch一块儿出队,针对一个日志量很大的系统,能够考虑把这个值调高来增长性能,不过要结合可以使用内存考虑实际状况
对于DA队列,最有特色就是队列阈值的设置了。主要包括这几个配置:
$MainMsgQueueSize #设置队列的最大大小 $MainMsgQueueDiscardMark <number> [default 9750] #配合下面的 $MainMsgQueueDiscardSeverity,超过这个watermark后,不重要的日志都会丢弃,包括新进来和已经在队列里的 $MainMsgQueueDiscardSeverity <severity> [default 4 (warning)] 0-Emergency, 1-Alert, 2-Critical, 3-Error, 4-Warning, 5-Notice, 6-Informational, 7-Debug $MainMsgQueueHighWaterMark <number> [default 8000] #设置 high watermark $MainMsgQueueLowWaterMark <number> [default 2000] #设置 low watermark $MainMsgQueueMaxFileSize <size_nbr> [default 1m] #针对disk状况下,单个文件的最大大小 $MainMsgQueueMaxDiskSpace #控制占用硬盘总空间大小
DA 对于阈值处理的逻辑比较有意思,并非单纯的内存满了就开始使用硬盘。首先,有 low watermark 和 high watermark 这两个概念。
若是队列大小达到 high watermark,队列开始写数据到disk 若是队列大小降到 low watermark,中止写入disk(直到再次达到 high watermark); 或者 disk queue 队列为空(即da队列里的数据处理完),这两种状况都会进入in-memory 模式
关于终止队列的一些处理配置:
$MainMsgQueueTimeoutEnqueue [number is timeout in ms (1000ms is 1sec!), default 2000, 0 means indefinite] #当队列或硬盘满了,在这个超时时间后新来的日志,设置0能够直接丢弃掉 $MainMsgQueueTimeoutShutdown <number> [number is timeout in ms (1000ms is 1sec!), default 0 (indefinite)] #当队列关闭时,还有数据在进入队列,rsyslog会尽量在这个timeout周期内处理掉这些数据 $MainMsgQueueTimeoutActionCompletion <number> [number is timeout in ms (1000ms is 1sec!), default 1000, 0 means immediate!] #配置须要多久来处理完当前的数据 $MainMsgQueueSaveOnShutdown [**on**/off] #针对disk queue的配置,当运行中的队列关闭时,会先把队列中的数据存在硬盘中 $MainMsgQueueDequeueSlowdown <number> [number is timeout in microseconds (1000000us is 1sec!), default 0 (no delay). Simple rate-limiting!] # 简单的出队速度限制,单位微秒 $MainMsgQueueImmediateShutdown [on/off] #弃用的选项,当配置的队列大小或硬盘空间满了之后,rsyslogd 会限制数据submitter。配置 $MainMsgQueueTimeoutEnqueue 后,当超过这个时间后新来的日志会被丢弃;设置0为直接丢弃。 #$MainMsgQueueTimeoutShutdown、$MainMsgQueueTimeoutActionCompletion 和 $MainMsgQueueSaveOnShutdown 是在队列终止后能够作的一系列措施。
关于队列的worker thread:
$MainMsgQueueWorkerThreadMinumumMessages <number> [default 100] $MainMsgQueueWorkerThreads <number> [num worker threads, default 1, recommended 1] $MainMsgQueueWorkerTimeoutThreadShutdown <number> [number is timeout in ms (1000ms is 1sec!), default 60000 (1 minute)]
每一个队列(direct queue除外)都有一个工做线程池(worker thread pool). 初始时,是没有worker thread的,当有消息来是,会自动启动一个. “$MainMsgQueueWorkerThreadMinumumMessages” 配置一个worker thread处理的消息大小, $MainMsgQueueWorkerThreads 配置work thread的上限值。
好比设置一个worker thread的最小处理消息大小是100个,当小于100个是,只有一个worker,当超过100个,小于200个时,会有两个worker...
以上配置要注意单位, 默认值,Main Queue 和 Action Queue 可能有些配置的默认值不同。
另外全部指明针对disk的配置,都是包括 disk queue 和 DA queue.
更多配置参考这里:
在通常状况下,大部分的配置均可以直接使用默认的配置,这里给出一份Action使用DA队列的配置:
# 这两个是全局的 $ActionResumeRetryCount 3 $ActionResumeInterval 10 # 如下是每一个ActionQueue本身的配置 $ActionQueueType LinkedList $ActionQueueFileName da_queue $ActionQueueMaxFileSize 100M # 设置单个disk文件的大小 $ActionQueueMaxDiskSpace 10G # 设置最大占用空间 $ActionQueueDisacdSeverity 3 # 设置忽略的等级 $ActionQueueLowWaterMark 5000 # 默认是2000 $ActionQueueHighWatermark 15000 # 默认是8000 $ActionQueueDiscardMark 30000 # 默认是9750 $ActionQueueSize 80000 # 文档没写,测试发现默认是1000 $ActionQueueSaveOnShutdown on *.* @log-center.xxx.com:514 Main Queue 的默认模式是 FixedArray,Action Queue 的默认模式是 Direct
1. TCP+DA模式实现可靠消息传输
tcp协议的不可靠性,好比server端宕机等状况,须要在client端配置一个本地文件,用在server端宕机的状况下,暂时保存消息。须要注意的是。队列名和过滤规则对应,一个队列只能用于一个过滤规则
举例:
$ActionQueueType LinkedList $ActionQueueFileName local3 $ActionResumeRetryCount -1 $ActionQueueSaveOnShutdown on Local3.* @@10.0.0.44:1999 $ActionQueueType LinkedList $ActionQueueFileName local4 $ActionResumeRetryCount -1 $ActionQueueSaveOnShutdown on Local4.* @@10.0.0.44:1999
上例中可将两条过滤规则合成一条:local3.*;local4.*
强调一点:本地队列只有在须要使用的时候才会建立,当后端出现短暂不可用时,rsyslog的内存队列就能够保存消息,内存队列不够用时,才会建立本地队列。