rsyslog 配置

作者: Athlon | 来源:发表于2017-06-01 15:50 被阅读128次

    安装 rsyslog 和 logroate 服务

    yum install rsyslog
    yum install logrotate
    

    rsyslog配置文件

      #rsyslog v3 config file   [兼容版本号]
    
      #### MODULES ####    加载模块
      $ModLoad imuxsock.so             # 本地系统日志 (e.g. via logger command) 
      $ModLoad imklog.so               # provides kernel logging support (previously done by rklogd)
    
      # 允许514端口接收使用UDP协议转发过来的日志
      #$ModLoad imudp.so
      #$UDPServerRun 514
      # 允许514端口接收使用TCP协议转发过来的日志
      #$ModLoad imtcp.so
      #$InputTCPServerRun 514
    
      #### GLOBAL DIRECTIVES ####
      # 定义日志格式默认模板  
      $ActionFileDefaultTemplate RSYSLOG_TraditionalFileFormat  
      # File syncing capability is disabled by default. This feature is usually not required,
      # not useful and an extreme performance hit
      #$ActionFileEnableSync on
    
      #### RULES ####
      # 关于内核的所有日志都放到/dev/console(控制台)
      #kern.*                                                 /dev/console
      # 记录所有日志类型的info级别以及大于info级别的信息到 /var/log/messages,但是mail邮件信息,authpriv验证方面的信息和cron时间任务相关的信息除外
      *.info;mail.none;authpriv.none;cron.none                /var/log/messages  
      # authpriv验证相关的所有信息存放在/var/log/secure
      authpriv.*                                              /var/log/secure  
      # 邮件的所有信息存放在/var/log/maillog; 这里有一个-符号, 表示是使用异步的方式记录, 因为日志一般会比较大
      mail.*                                                  -/var/log/maillog  
      # 计划任务有关的信息存放在/var/log/cron
      cron.*                                                  /var/log/cron  
      # 记录所有的大于等于emerg级别信息, 以wall方式发送给每个登录到系统的人(* 代表所有在线用户 )
      *.emerg                                                 * 
      # 记录uucp,news.crit等存放在/var/log/spooler
      uucp,news.crit                                          /var/log/spooler  
      # Save boot messages also to boot.log     启动的相关信息
      local7.*                                                /var/log/boot.log
    
      #  转发规则
      # remote host is: name/ip:port,  port optional (e.g. 192.168.0.1:514)
      *.*                                                     @@remote-host:514                    
      # @@表示通过tcp协议发送    @表示通过udp进行转发
    

    日志级别

    • debug 有调式信息的,日志信息最多
    • info 一般信息的日志,最常用
    • notice 最具有重要性的普通条件的信息
    • warning 警告级别
    • err 错误级别,阻止某个功能或者模块不能正常工作的信息
    • crit 严重级别,阻止整个系统或者整个软件不能正常工作的信息
    • alert 需要立刻修改的信息
    • emerg 内核崩溃等严重信息
    • none 什么都不记录
      从上到下,级别从低到高,记录的信息越来越少

    连接符号

    • .xxx :表示大于等于xxx级别的信息
    • .=xxx:表示等于xxx级别的信息
    • .!xxx:表示在xxx之外的等级的信息

    Actions

    1. 记录到普通文件或设备文件:
      . /var/log/file.log # 绝对路径
      . /dev/pts/0
      logger 命令用于产生日志: logger -p local3.info 'KadeFor is testing the rsyslog and logger'

    2. 转发到远程::
      . @192.168.0.1 # 使用UDP协议转发到192.168.0.1的514(默认)端口
      . @@192.168.0.1:10514 # 使用TCP协议转发到192.168.0.1的10514(默认)端口

    3. 发送给用户(需要在线才能收到)::
      . root
      . root,kadefor,up01 # 使用,号分隔多个用户
      . * # *号表示所有在线用户

    4. 忽略,丢弃::
      local3.* ~ # 忽略所有local3类型的所有级别的日志

    5. 执行脚本::
      local3.* ^/tmp/a.sh # ^号后跟可执行脚本或程序的绝对路径
      # 日志内容可以作为脚本的第一个参数. 可用来触发报警
      注意: 日志记录的顺序有先后关系!

    实例: 过滤特定的日志到文件

    # 过滤日志, 由:号开头
    :msg, contains, “error” /var/log/error.log
    :msg, contains, “error” ~                # 忽略包含error的日志
    :msg, contains, “user nagios”   ~
    :msg, contains, “user kadefor”   ~
    :msg, contains, “module-alsa-sink.c: ALSA woke us up to write new data to the device, but there was actually nothing to write” ~
    local3.*    ~
    &   ~                                     # 忽略所有的日志. 
    

    实例: 使用模板来定义日志格式

    定义默认的日志格式:

    $template myFormat,”%rawmsg%\n”  
    $ActionFileDefaultTemplate myFormat  
    

    如果不要$ActionFileDefaultTemplate myFormat这一行, 就需要像这样来使用模板:
    在日志文件后添加模板名, 并用;号分隔

    $template myFormat,”%rawmsg%\n”  
    authpriv.*      /var/log/secure;myFormat  
    mail.*          /var/log/maillog;myFormat  
    cron.*          /var/log/cron;myFormat  
    *.emerg                                       *  
    uucp,news.crit  /var/log/spooler;myFormat  
    local7.*        /var/log/boot.log;myFormat
    

    实例: remote log 远程发送与接收:

    配置服务端(接收)

    $ModLoad imtcp.so                  # 使用tcp方式
    $InputTCPMaxSessions 500           # tcp接收连接数为500个
    $InputTCPServerRun 514             # tcp接收信息的端口
    
    # 定义一个名为logformat模板, 为信息加上日志时间
    $template logformat, "%TIMESTAMP:::date-mysql% %FROMHOST-IP%%msg%\n"
    # 定义日志文件的名称,按照年月日
    $template DynFile, "/var/log/tlog%$year%%$month%%$day%.log"
    # 把rawmsg(也可以使用msg)日志中包含sdns_log标志的信息写到DynFile定义的日志文件里
    :rawmsg, contains, "sdns_log" ?DynFile;logformat
    # 这个表示丢弃包含sdns_log标志的信息, 一般都加上它, 以免多个日志文件记录重复的日志
    :rawmsg, contains, "sdns_log"  ~ 
    

    配置客户端(发送)
    # 把包含sdns_log的信息通过tcp发到192.168.1.2 @@表示tcp @表示udp
    :rawmsg, contains, “sdns_log” @@192.168.1.2 # 默认514端口
    # 这个表示丢弃包含sdns_log标志的信息,防止这个信息写到本机的/var/log/message
    :rawmsg, contains, “sdns_log” ~
    测试:在客户端上执行 logger -p user.info "sdns_log 34334" 在服务端的/var/log/目录里是否有tlog*日志产生

    如果要把不同服务器发送过来的日志保存到不同的文件, 可以这样操作

    :fromhost-ip, isequal, “192.168.0.160″ /var/log/host160.log
    :FROMHOST-IP, isequal, “192.168.0.161″ /var/log/host161.log
    :FROMHOST-IP, startswith, “192.168.1.” /var/log/network1.log
    :FROMHOST-IP, startswith, “192.168.2.” /var/log/network2.log
    

    属性替代

    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%

    2. 模板
      模板的功能是定义输出格式,或者定义omfile模块的动态路径、动态文件。需要使用上面提到的属性替换。
      模板定义的形式有四种,适用于不同的输出模块,一般简单的格式,可以使用string的形式,复杂的格式,建议使用list的形式,使用list的形式,可以使用一些额外的属性字段(property statement),例如:position.fromposition.end
      如果不指定输出模板,rsyslog会默认使用 RSYSLOG_DEFAULT
      如果你只想输出msg,可以定义模板
      $template t_msg, “%msg\n%”
      如果想按日期保存输出,需要使用动态路径。可以定义模板
      $template f_debug, “/data0/logs/%$year%-%$month%-%$day%/debug.log”

    3. Ruleset
      Ruleset实现的是多实例的功能,可以针对syslog的来源使用不同的过滤规则。需要注意的是,在配置文件中需要先定义ruleset,才可以使用。比较典型的一个例子,针对不同的端口使用不同的过滤规则。

       $Ruleset tcp1999
       $RulesetCreateMainQueue on
       Local3.*      @@10.0.0.44:1999
       $Ruleset tcp2000
       $RulesetCreateMainQueue on
       Local4.*      @@10.0.0.44:2000
      

    在定义好ruleset后,各个输出模块就可以指定自己使用的ruleset了,具体如何指定,可以查看输出模块的手册,一般会有一个ruleset的参数,用来实现这个功能。

    1. Filter模块
      Rsyslog可以使用syslog标准的过滤规则,同时自己添加了一些扩展。比如可以在输出中指定rsyslog自己的处理方式,可以指定输出template,方法是在规则后面添加template的名字,用分号隔开。
      例如我们可以编写一个规则
      Local3.* -/data0/logs/local3.log;t_msg
      #在这个输出中使用t_msg的模板
      Local4.* -?f_local3_test;t_msg
      问号表示要使用模板定义的动态路径.
      除了syslog标准的规则,rsyslog的作者还自己开发了一个叫做rainerscript的脚本语言,来定义更复杂的过滤过则,rainerscript 可以对属性进行 startwithcontains%(取余)等过滤规则,例如
      If $pri-txt == local3.* and $msg contains “abc” then{ #pri为local3,且在消息中包含子串‘abc’
      . -/data0/logs/local3.log;t_msg
      }
      还有第三种方式是使用属性的表示方式,例如
      :msg, regex, "^ [g-z]" /root/rsyslog_worker_dir/2000.log
      # 以字母g到z开头的消息,注意msg开头有个空格
    2. 队列
      队列是rsyslog中比较重要的一个部分,作为使用者,我们需要了解的是队列的种类:主队列工作队列。从输入模块接收的消息会进入主队列,主队列中的消息,经过过滤模块,会进入到相应的工作队列;队列的四种工作模式:direct mode、disk mode、FixedArray mode 和 LinkedList mode,前两种是磁盘队列,更可靠,但是性能也较差,后两种是内存队列,区别是前者是预分配队列长度,后者是动态分配,如果你的系统日志流量比较平稳,可以使用预分配队列,如果日志属于突发型,可以使用动态队列。此外,内存队列还可以通过指定一个queuename来添加DA模式,DA模式主要是为了防止意外情况(进程关闭、server端宕机)下,内存队列可以不丢失。
      通过查看rsyslog的系统命令,可以知道rsyslog对队列进行大量的可配参数,来定义队列的行为。可以根据需要来进行优化。

    相关文章

      网友评论

        本文标题:rsyslog 配置

        本文链接:https://www.haomeiwen.com/subject/yrhefxtx.html