• 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:2:$%    #选取msg变量中,起始位置为2,终止位置为结尾

      我们经常需要根据空格来分析字符串,F表示使用字符分割,32是空格的ascii码,例:

    %msg:F,32:3%  #按照空格分隔,取第三个子串

      正则匹配可以匹配特定的文字和格式,属性替代中还用到了一类特殊的以$!开头的变量,这是使用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:1999
    
    #定义规则2 类似于上
    
    $Ruleset    tcp2000
    
    $RulesetCreateMainQueue on
    
    Local4.*    @@10.0.0.44:2000

    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/2000.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 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的内存队列就可以保存消息,内存队列不够用时,才会创建本地队列。

  • 相关阅读:
    移动端链接、点击事件、输入框去除背景高亮
    Quartz.Net与MVC结合定时任务
    Win10上使用SVN遇到的一些问题
    Win7上的ASP.NET MVC3项目在Win10上运行的一个坑
    《SQL必知必会》学习笔记(二)
    《SQL必知必会》学习笔记(一)
    数据库知识总结(表结构操作)
    搭建三层架构(ASP.NET MVC+EF)
    python线程中的全局变量与局部变量
    ADO.NET Entity Framework学习笔录(一)
  • 原文地址:https://www.cnblogs.com/cherishry/p/6774687.html
Copyright © 2020-2023  润新知