为什么使用rsyslog?

    1.他是POSIX-like系统中标准的logging,有些软件,比如haproxy,只使用syslog。所以你不能完全消除它

    2.通过网络硬件被使用

    3.它有更复杂的设置,但更多的功能比竞争对手的更好。例如,Elastic Filebeat仍然不能使用inofity

    4.低内存的使用。

    5.允许在保存和转发之前更改消息

    6.相比rsyslog的功能更加全面


rsyslog使用的协议为:syslog.

使用rsyslog收集日志_第1张图片

消息格式

    通过网络传输的syslog消息看起来是这样的:

     TIMESTAMP HOST TAG MSG

    PRI:优先级。facility * 8 + severity  

    facility:0-23         severity:级别

    TIMESTAMP:时间格式

    HOST:主机名

    tag:包含生成消息的程序的名称

    msg:消息

    

rsyslog日志收集的主体流程:

    客户端(input--->filter---->output)===网络传输===>服务端(input--->filter---->output)


客户端配置解析:

        input:

                image.png

                主要选项:

                    tag:指定这个值的作用是在template中指定rsyslogtag内容,然后传递给服务端用于区分文件名。

                    facility:可以不指定,默认就是local0,这个数据会传递到服务端用于做条件判断

                涉及到读取通配符设置的日志文件和多行读取:

                     1.为什么使用通配符设置日志文件:如果一个目录下有很多日志文件,你都像传输到远程主机去,此时可以设置如上面的第一行:

                      格式为:

                            使用rsyslog收集日志_第2张图片

                            说明:使用*匹配所有文件,此时匹配的是整个路径,并开启元数据,这样元数据就会附加到消息中。然后再filter的过程中使用re_extract过滤整个路径只剩下文件名,然后将这个文件名附                         加给一个局部属性,最后将这个局部属性附加到template,并和对应的tag部分想结合组成新的tag部分。

                    当然也可以不使用,如第2,3个将指定的日志文件传输到远程主机。

                   

                    2.日志多行处理:

                        使用多行消息的文件imfile提供3个选项

                        readMode=1消息被空字符串分割

                        readMode=2新消息从行首的rhe开始。如果行是从空格或表格开始的,它就是消息的一部分。堆栈跟踪通常是这样的

                        startmsg.regex通过regexp(POSIX Extended)定义新消息

                        前两个选项在inotify模式下有问题,第三个选项可以全部替换为正确的regexp,所以我们会使用它。读取多行日志有一个微妙之处。新消息标记通常放在消息的第一行。因此,在新消息开始之前,我们不能确定最后一条消息是否完整。因为最后一条消息可能永远不会被传输。为了避免这种情况,我们设置参数readTimeout,在此秒数之后,最后一条消息被认为已经完成。

                          使用rsyslog收集日志_第3张图片

    filter  and output:

           上面的input部分已经指定了ruleset规则集,里面可以包含多个操作,操作里面可以引用不同的template,同时可以指定传输的类型,在template中可以指定要传输的日志格式。格式之间可能有空格。

            template有多种用法:

                    1.在客户端指定传输的日志格式

                     2.在服务端指定日志的保存的路径已经文件名

            此处使用RELP模块进行传输而不是UDP或TCP

                    原因:如果消息是使用rsyslog在主机之间传输的,那么可以使用RELP ,l而不是普通的TCP。它是为rsyslog创建的,现在其他一些系统也支持它。例如,它由Logstash和Graylog支持。使用TCP                 进行传输。可以选择使用TLS加密消息。它比普通的TCP syslog更可靠,因为它不会在连接中断时丢失消息。它解决了多行消息的问题。

            使用rsyslog收集日志_第4张图片

            

server:                         

        input:使用imRELP模块接收日志并指定相应的规则集。并且引用指定模块消除msg之前的空格。

            让我们加载所有必要的模块并关闭$EscapeControlCharactersOnReceive,否则我们将在接收到的消息中使用\n而不是新行.

            固定的格式:设置目录和文件的权限。

            如下为指定的格式,一般不需要修改:

             使用rsyslog收集日志_第5张图片       

    filter and    写入新文件:       

        现在让我们创建规则集来解析传入的消息并将其保存到适当的文件和文件夹中。依赖于syslog的服务期望节省消息时间和其他syslog字段。因此,具有标准功能的消息以syslog格式保存。对于具有local0-local7功能的消息,我们将从tag中生成文件名,并保存没有其他syslog字段的纯消息。消息前面有额外空间的问题仍然存在,因为它出现在消息解析阶段。我们会把它剪掉。

        为了提高性能,我们将使用异步写:asyncwrite ="on"和大缓冲区:ioBufferSize=64k。我们不会在每个接收到的消息:flushOnTXEnd="off"之后刷新缓冲区,但是我们将每秒刷新一次,以便在日志服务器上拥有新日志:flushInterval="1"

            说明:消息从上面的imRELP模块进行之后,进入如下的规则集,然后进行判断,并根据客户端传递过来的tag部分然后使用replace和field方法进行分割并赋值个appname和logpath,然后进入操作,类型是写入文件,文件名是根据dynaFile获取,template指定常规模块,将日志写入到文件。

          使用rsyslog收集日志_第6张图片


        如上action里面的dynaFile指定生成动态的文件路径的template。temolate部分如下:

          使用rsyslog收集日志_第7张图片


       另外还有队列,不过多说明。