Rsyslog初步学习
一、Rsyslog整体架构

Rsyslog消息流:输入模块——>预处理模块——>主队列——>过滤模块——>执行队列——>输出模块
1. 输入模块
输入模块是消息来源

2. 预处理模块
主要解决各种syslog协议实现间的差异
3. 队列模块
负责消息的存储,从Input传入的未经过滤的消息放在主队列,过滤后的消息放入到不同的action queue中,再由执行队列送到各个输出模块
4. 过滤模块
Filter模块处理消息的分析和过滤,rsyslog可以对消息的任何部分进行过滤

5. 输出模块
消息的目的地

6. rsyslog命令的参数

7. 其他概念
基本结构:数据流动过程中内置的基本处理框架,但是对于消息流,是可以高度定制化的。定制工作是通过自定义rsyslog对象来完成的。
消息流和对象概览:消息通过input模块进入rsyslog,接着到ruleset,进行规则匹配,也就是做一些处理,比如写到文件,数据库或者继续转发到远程主机。
处理原则:每个ruleset会包含>=0个规则,一条规则包含一个过滤器和一个动作列表,一个动作列表会包含一个或多个动作
过滤器:控制流量,动作列表不会再出现过滤器
处理顺序:rsyslog.conf中得命令是从上到下一次执行的,所以,如果你停止了对某消息的处理,那么这行之后的命令就不会再被检查和执行了
流程控制语句:
if expr then ... else ...- 条件语句 stop - 停止处理当前消息 call - 调用一个rulese(类似子程序调用) continue - 一个空操作(NOP),很有用。比如在if语句的then部分
流控制也可以通过过滤器条件来实现
数据操作语言:
set - 设置一个用户变量 unset - 删除之前设置的用户变量
二、Rsyslog的作用
- 接收来自多种源的输入
- 传输接收的内容
- 输出到不同类型的目的端
三、Rsyslog的特征
- 多线程
- TCP/SSL/TLS/RELP
- MySQL/PostgreSQL/Oracle等
- 对syslog日志的任何部分进行筛选和过滤
- 完全可控的输出格式
- 适合企业级的日志系统
四、 rsyslog配置相关概念
1. 属性替代
Rsyslog 预定义了一些属性,来代表消息中的信息,我们可以在定义输出格式、动态文件名的时候使用到这些属性。这里面比较重要的属性比如:msg(消息体)、hostname、pri(消息等级和类别)、time(时间有关),属性的名称中以$开头的是从本地系统获得的变量、不带$是从消息中获得变量。
属性替代的语法格式:
%propname:fromChar:toChar:options:fieldname%
属性替换的功能很强大,你可以使用起始字符获取自己所需的字段,也可以使用正则表达式,也可以使用分隔符。举几个例子:为了兼容一个rfc协议,rsyslog规定如果用户输入的msg不是以空格开头,rsyslog会自动补充一个空格,因此如果你希望输出的时候去掉这个空格,就可以使用,举例:
%msg::$% #选取msg变量中,起始位置为2,终止位置为结尾
我们经常需要根据空格来分析字符串,F表示使用字符分割,32是空格的ascii码,例:
%msg:F,:% #按照空格分隔,取第三个子串
正则匹配可以匹配特定的文字和格式,属性替代中还用到了一类特殊的以$!开头的变量,这是使用mmnormalize模块时特有的,可以实现类似于syslog-ng中parser模块的功能。
2. 模板(详细使用见Rsyslog模板文章)
功能:
(1)定义输出的格式
(2)定义omfile模块的动态路径、动态文件。需要用到属性替换
形式:
(1)一般简单格式,可以使用string的形式
(2)复杂的格式,可使用list形式
(3)子树(subtree)
(4)插件(plugin)
3. Ruleset(规则集)
(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: #定义规则2 类似于上 $Ruleset tcp2000 $RulesetCreateMainQueue on Local4.* @@10.0.0.44:
4. Filter模块
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/.log #以字母g到z开头的消息,注意msg开头有空格
5. 队列
队列的种类:主队列和工作队列。从输入模块进入主队列;主队列的消息,经过过滤模块,进入到相应的工作队列队列的四种工作模式。
队列的四种工作模式:

此外,内存队列还可以通过指定一个queuename来添加DA模式,DA模式主要是为了防止意外情况(进程关闭,server端宕机)下,内存队列可以不丢失。
关于队列的配置:
因为 MainMsgQueue 和 ActionQueue 的配置基本一样(除了有些默认值可能不同), 所以这里以MainMsgQueue 为例:
$MainMsgQueueType [FixedArray/LinkedList/Direct/Disk] $MainMsgQueueFileName <name> #针对disk queue的配置,定义队列名,存储队列数据时用的文件名就是这个名称 MainMsgQueueCheckpointInterval <number> #针对disk queue的配置,单位条数,设置在检查点写入相关信息,增加可靠性,但是会降低性能 $MainMsgQueueDequeueBatchSize <number> [default ] #设置多少条队列作为一个batch一起出队,针对一个日志量很大的系统,可以考虑把这个值调高来增加性能,不过要结合可使用内存考虑实际情况
对于DA队列,最有特点就是队列阈值的设置了。主要包括这几个配置:
$MainMsgQueueSize #设置队列的最大大小 $MainMsgQueueDiscardMark <number> [default ] #配合下面的 $MainMsgQueueDiscardSeverity,超过这个watermark后,不重要的日志都会丢弃,包括新进来和已经在队列里的 $MainMsgQueueDiscardSeverity <severity> [default (warning)] -Emergency, -Alert, -Critical, -Error, -Warning, -Notice, -Informational, -Debug $MainMsgQueueHighWaterMark <number> [default ] #设置 high watermark $MainMsgQueueLowWaterMark <number> [default ] #设置 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 , means indefinite] #当队列或硬盘满了,在这个超时时间后新来的日志,设置0可以直接丢弃掉 $MainMsgQueueTimeoutShutdown <number> [number is timeout in ms (1000ms is 1sec!), default (indefinite)] #当队列关闭时,还有数据在进入队列,rsyslog会尽可能在这个timeout周期内处理掉这些数据 $MainMsgQueueTimeoutActionCompletion <number> [number is timeout in ms (1000ms is 1sec!), default , means immediate!] #配置需要多久来处理完当前的数据 $MainMsgQueueSaveOnShutdown [**on**/off] #针对disk queue的配置,当运行中的队列关闭时,会先把队列中的数据存在硬盘中 $MainMsgQueueDequeueSlowdown <number> [number is timeout in microseconds (1000000us is 1sec!), default (no delay). Simple rate-limiting!] # 简单的出队速度限制,单位微秒 $MainMsgQueueImmediateShutdown [on/off] #弃用的选项,当配置的队列大小或硬盘空间满了以后,rsyslogd 会限制数据submitter。配置 $MainMsgQueueTimeoutEnqueue 后,当超过这个时间后新来的日志会被丢弃;设置0为直接丢弃。 #$MainMsgQueueTimeoutShutdown、$MainMsgQueueTimeoutActionCompletion 和 $MainMsgQueueSaveOnShutdown 是在队列终止后可以做的一系列措施。
关于队列的worker thread:
$MainMsgQueueWorkerThreadMinumumMessages <number> [default ] $MainMsgQueueWorkerThreads <number> [num worker threads, default , recommended ] $MainMsgQueueWorkerTimeoutThreadShutdown <number> [number is timeout in ms (1000ms is 1sec!), default ( 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 $ActionResumeInterval # 以下是每个ActionQueue自己的配置 $ActionQueueType LinkedList $ActionQueueFileName da_queue $ActionQueueMaxFileSize 100M # 设置单个disk文件的大小 $ActionQueueMaxDiskSpace 10G # 设置最大占用空间 $ActionQueueDisacdSeverity # 设置忽略的等级 $ActionQueueLowWaterMark # 默认是2000 $ActionQueueHighWatermark # 默认是8000 $ActionQueueDiscardMark # 默认是9750 $ActionQueueSize # 文档没写,测试发现默认是1000 $ActionQueueSaveOnShutdown on *.* @log-center.xxx.com: Main Queue 的默认模式是 FixedArray,Action Queue 的默认模式是 Direct
五、实例
1. TCP+DA模式实现可靠消息传输
tcp协议的不可靠性,比如server端宕机等情况,需要在client端配置一个本地文件,用在server端宕机的情况下,暂时保存消息。需要注意的是。队列名和过滤规则对应,一个队列只能用于一个过滤规则
举例:
$ActionQueueType LinkedList $ActionQueueFileName local3 $ActionResumeRetryCount - $ActionQueueSaveOnShutdown on Local3.* @@10.0.0.44: $ActionQueueType LinkedList $ActionQueueFileName local4 $ActionResumeRetryCount - $ActionQueueSaveOnShutdown on Local4.* @@10.0.0.44:
上例中可将两条过滤规则合成一条:local3.*;local4.*
强调一点:本地队列只有在需要使用的时候才会创建,当后端出现短暂不可用时,rsyslog的内存队列就可以保存消息,内存队列不够用时,才会创建本地队列。
Rsyslog初步学习的更多相关文章
- json2.js的初步学习与了解
json2.js的初步学习与了解,想要学习json的朋友可以参考下. json2.js的初步学习与了解 1.)该js的下载地址是:http://www.json.org/json2.js 2.)在页面 ...
- 老周的ABP框架系列教程 -》 一、框架理论初步学习
老周的ABP框架系列教程 -- 一.框架理论初步学习 1. ABP框架的来源与作用简介 1.1 简介 1.1.1 ABP框架全称为"ASP.NET Boilerplate ...
- 初步学习nodejs,业余用node写个一个自动创建目录和文件的小脚本,希望对需要的人有所帮助
初步学习nodejs,业余用node写个一个自动创建目录和文件的小脚本,希望对需要的人有所帮助,如果有bug或者更好的优化方案,也请批评与指正,谢谢,代码如下: var fs = require('f ...
- EF Codefirst 初步学习(二)—— 程序管理命令 更新数据库
前提:搭建成功codefirst相关代码,参见EF Codefirst 初步学习(一)--设置codefirst开发模式 具体需要注意点如下: 1.确保实体类库程序生成成功 2.确保实体表类库不缺少 ...
- 初步学习python
自计算机诞生以来,也伴随着计算机语言的诞生,现在,全世界的编程语言有600多种,但流行的编程语言也就20多种. Java和C一直占据着前两名.但是近年来伴随着人工智能的发展,Python发展迅猛,以其 ...
- Git的初步学习
前言 感谢! 承蒙关照~ Git的初步学习 为什么要用Git和Github呢?它们的出现是为了用于提交项目和存储项目的,是一种很方便的项目管理软件和网址地址. 接下来看看,一家公司的基本流程图: 集中 ...
- 语法分析器初步学习——LISP语法分析
语法分析器初步学习——LISP语法分析 本文参考自vczh的<如何手写语法分析器>. LISP的表达式是按照前缀的形式写的,比如(1+2)*(3+4)在LISP中会写成(*(+ 1 2)( ...
- 状态保持以及AJAX的初步学习
嘿嘿,今天学习的有点迷茫哦,主要学习把验证码使用在登录页面时间的一些逻辑,学习这个时间并没有那么的迷惑哦,可是自己写程序时间倒是有点反应迟钝,不过还好总是在最后搞清楚啦,另外就是一步一步的学习是接近项 ...
- LinQ的初步学习与总结
嘿嘿,说起来ORM和LinQ,就感觉离我好遥远的,在学校是没有学习的,所以总感觉学习了LinQ就是大神,现在嘛,终于也体会一点,感觉LinQ只是初步学习,没有太难,当然以后使用在项目中就没有这样的简单 ...
随机推荐
- yii学习笔记(2),创建控制器
将网站根目录配置到项目的web目录 打开网站访问的是web/index.php这时打开默认页面 访问一下其他页面,发现浏览器地址的url携带了一个参数 http://www.test.com/inde ...
- 大数据学习--day17(Map--HashMap--TreeMap、红黑树)
Map--HashMap--TreeMap--红黑树 Map:三种遍历方式 HashMap:拉链法.用哈希函数计算出int值. 用桶的思想去存储元素.桶里的元素用链表串起来,之后长了的话转红黑树. T ...
- conda与pip的关系
最近在搭建平台的时候,遇到了conda,具体尝试使用之后觉得conda还是非常好用的.他会交代清楚相互有依赖的包是什么,确认之后才会执行指令.要比pip好很多. 普通按照python 的时候一般都是自 ...
- python paramiko模块和多线程讲解
1.paramiko 实现ssh 登录 import paramiko # 实现ssh登录 ssh_client = paramiko.SSHClient() ssh_client.set_missi ...
- ASP.NET Web Form 与 ASP.NET MVC 区别
Asp.net 微软提供web开发框架或者技术.分Web Form和ASP.NET MVC.下面简单说明各自优缺点及使用场景. Web Form ASP.NET Webform提供了一个类似于winf ...
- 学号20155308 2016-2017-2 《Java程序设计》实验一(Java开发环境的熟悉)实验报告
学号20155308 2016-2017-2 <Java程序设计>实验一(Java开发环境的熟悉)实验报告 一.实验要求 使用JDK编译.运行简单的Java程序. 使用IDEA 编辑.编译 ...
- ruby学习笔记(1)-puts,p,print的区别
ruby学习笔记-puts,p,print的区别 共同点:都是用来屏幕输出的. 不同点:puts 输出内容后,会自动换行(如果内容参数为空,则仅输出一个换行符号):另外如果内容参数中有转义符,输出时将 ...
- HTML 5 +CSS3 + 原生js 做(雪花全屏飘落 + 3d旋转图)
原文:HTML 5 +CSS3 + 原生js 做(雪花全屏飘落 + 3d旋转图) 3d旋转图:主要用css3中transform属性中的rotate,translate;以及用来做舞台效果的 pers ...
- oracle-11g-64位安装和plaql
1.oracle卸载 如果是新装,请跳过此步骤 卸载步骤: 1.停止所有服务 2.用自带删除软件,删除所有目录 3.打开注册表: -->运行regedit,删除HKEY_LOCAL_MACHIN ...
- (转) 前端面试之js相关问题(一)
原帖地址:http://stephenzhao.github.io/2016/08/19/Front-end-Job-Interview-Questions/ 最近我也是经历过面试别人和去面试的人了, ...