rsyslog 日志收集

rsyslog 无论在性能还是部署上都优于其它日志收集应用,因系统自带,需要新功能只需要做升级即可,方便部署!

一、Rsyslog特性

  • Multi-threading, high availability
  • TCP, SSL, TLS, RELP
  • MySQL, Redis,Elasticsearch, Oracle and more
  • Filter any part of syslog message
  • Fully configurable output format
  • Encryption and compression transmission
  • Suitable for enterprise-class relay chains

更多rsyslog本身的一些功能介绍,请看我之前写的一个PPT。rsyslog的使用

二、日志收集规划

  • 提前规划日志标准格式、目录,做到日志类型通用、覆盖度广、易处理。

比如:

1
logtime client_ip server_ip domain level http_code url response_time msg
1
27/Apr/2016:15:50:55 1.1.1.1 127.0.0.1 www.elain.org ERROR 499 /elk/rsyslog 0.007 xxxxx

日期也要严格使用统一格式,推荐ISO8601时间格式,日志经过这样规范处理后,无论是在单台上使用awk,cut,sed来查看日志,或是写一些简单实用的日志处理小工具都会比较通用。

当然,如果你非要说不会有单机上去查看日志的情况,那使用纯json格式也是相当不错的,针对ELK来说更是方便,可以直接使用logstash或hangout解析json,反而提高grok的性能。
比如:

1
{"logtime":"value","client_ip":"value","server_ip":"value","domain":"value","level":""value","http_code":"value","url":"value","response_time":""value","msg":"value"}
1
{"logtime":"27/Apr/2016:15:50:55","client_ip":"1.1.1.1","server_ip":"127.0.0.1","domain":"www.elain.org","level":""ERROR","http_code":"499","url":"/elk/rsyslog","response_time":""0.007","msg":"xxxxx"}

当然,你还可以把前面这些固定的字段从json中扔出来,只把msg做成json,但切记,为了方便通用,在日志中使用json格式时不要做多级嵌套,这样大大增加了日志处理的复杂度,且不同日志如果没有明确级数,就搞的不通用了,大大增加了运维复杂度。

  • 使用rsyslog日志收集是尽量保证日志的原始性
    不去做任何处理 ,直接收集入到队列,如kafka、redis,这样做的的好处时,减少日志客户端rsyslog的性能压力,从而不影响所在服务器上正常业务,并且保持原始日志也便于各自业务方处理,自己写的日志自己最熟悉。
  • 日志收集客户端rsyslog 使用守护进程的工具做守护,如supervisor、monit等

三、使用rsyslog收集常见日志配置

  • 单行日志,如nginx app 业务日志等,最常用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
module(load="imfile")    # if you want to tail files
module(load="omkafka")   # lets you send to Kafka

$WorkDirectory /var/lib/rsyslog
$PreserveFQDN on

#nginx access log
input(type="imfile"
      File="/home/work/logs/nginx/*.log"
      Tag="ngx_log_mishop_order"
      PersistStateInterval="1000"
      reopenOnTruncate="on"
      addMetadata="on"
)

template( name="general_log" type="string" string="%hostname% %msg%")

#nginx access log
if ($syslogtag == "ngx_log_mishop_order") then {
    action(
        broker=["c3-b2c-b2cop-efk-kafka01.bj:9092","c3-b2c-b2cop-efk-kafka02.bj:9092","c3-b2c-b2cop-efk-kafka03.bj:9092","c3-b2c-b2cop-efk-kafka04.bj:9092"]
        type="omkafka"
        topic="ngx_log_mishop_order"
        template="general_log"
        confParam=["compression.codec=gzip"]
        partitions.auto="on"
    )
    stop
}
  • 多行日志 如php_slow_log

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
module(load="imfile")    # if you want to tail files
module(load="omkafka")   # lets you send to Kafka

$WorkDirectory /var/lib/rsyslog
$PreserveFQDN on

#php slow log
input(type="imfile"
      File="/home/work/logs/php/php-fpm.log.slow"
      Tag="php_log_slow"
      PersistStateInterval="1000"
      reopenOnTruncate="on"
      addMetadata="on"
      ReadMode="1" #这里是关键,1代表多行日志之间以空格区分
      escapeLF="on"
)

template( name="general_log" type="string" string="%hostname% %msg%")

#php slow log
if ($syslogtag == "php_log_slow") then {
    action(
        broker=["c3-b2c-b2cop-efk-kafka01.bj:9092","c3-b2c-b2cop-efk-kafka02.bj:9092","c3-b2c-b2cop-efk-kafka03.bj:9092","c3-b2c-b2cop-efk-kafka04.bj:9092"]
        type="omkafka"
        topic="php_log_slow"
        template="general_log"
        confParam=["compression.codec=gzip"]
        #errorFile="rsyslog_err.log"
        partitions.auto="on"
    )
    stop
}

ReadMode的具体用法见:
http://www.rsyslog.com/doc/v8-stable/configuration/modules/imfile.html?highlight=readmode

四、使用rsyslog收集日志遇到过的坑

  • 获取主机名问题

如果需要获取主机名时,主机名中带有’.’,如主机名为:www-elain-org-web01.bj
解决方法:在主配置文件rsyslog.conf中添加配置:

1
$PreserveFQDN on
  • rsyslog默认工作目录问题

因rsyslog 默认工作目录是没有设置的,在生成statefile时会无法自动生成
解决方法:在主配置文件rsyslog.conf中添加配置:

1
$WorkDirectory /var/lib/rsyslog
  • 使用logrotate日志切割问题
    很多情况下,我们每台服务器是的日志还是落到本机磁盘上的,在这种情况下,我们通常会使用一些工具来定时切割日志,
    比如使用logrotate,也是我使用中觉得最好用的工具了。我们在使用rsyslog收集时,发现logrotate按小时切割后,rsyslog就不会再发送日志了,通过rsyslog debug和日志文件的观察,发现日志切割后,inode没有改变,但日志文件改变了大小,导致rsyslog无法重新记录iCurrOffs
    解决方法:在子imfile配置中添加配置:
1
reopenOnTruncate="on"

注:此功能要求rsyslog版本在 8.16.0以上
参考:https://github.com/rsyslog/rsyslog/issues/511

 

rsyslog 无论在性能还是部署上都优于其它日志收集应用,因系统自带,需要新功能只需要做升级即可,方便部署!

版本:syslog-8.16.0

download:http://rpms.adiscon.com/v8-stable

因rsyslog 默认工作目录是没有设置的,在生成statefile时会无法自动生成 ,我们需要在主配置文件中添加,也可以添加在子配置文件中

1
2
$WorkDirectory /var/lib/rsyslog
$PreserveFQDN on  #如果需要获取主机名时,主机名中带有’.’,请设置,如主机名为:c1-b2c-shop-web01.bj

以下是收集单行日志示例(nginx access log为例)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
module(load="imfile")    # if you want to tail files
module(load="omkafka")   # lets you send to Kafka

#nginx access log
input(type="imfile"
      File="/home/work/logs/nginx/*.log"
      Tag="ngx_log_shopapi"
      PersistStateInterval="1000"
      reopenOnTruncate=“on”

      addMetadata="on"
)

template( name="general_log" type="string" string="%hostname% %fromhost-ip% %msg%”)

#nginx access log
if ($syslogtag == "ngx_log_shopapi") then {
    action(
        broker=["c3-b2c-b2cop-log-kafka01.bj:9092","c3-b2c-b2cop-log-kafka02.bj:9092","c3-b2c-b2cop-log-kafka03.bj:9092"]
        type="omkafka"
        topic="ngx_log_shopapi"
        template="general_log"
        confParam=["compression.codec=gzip"]
        partitions.auto="on"
              )
    stop
}

注:
reopenOnTruncate=“on” #版本要求8.16.0以上,此配置是为了解决log rotate切割日志后不收集问题
详情见:https://github.com/rsyslog/rsyslog/issues/511

%fromhost-ip #版本要求在8.17.0之后会支持,imfile模块获取主机IP,主要用于docker容器
详情见:https://github.com/rsyslog/rsyslog/issues/545

以下是收集多行日志示例(php slow log为例)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
module(load="imfile")    # if you want to tail files
module(load="omkafka")   # lets you send to Kafka

#php slow log
input(type="imfile"
      File="/home/work/logs/php/php-fpm.log.slow"
      Tag="php_log_slow_v2"
      PersistStateInterval="1000"
      reopenOnTruncate="on"
      addMetadata="on"
      ReadMode="1"
      escapeLF="on"
)

template( name="general_log" type="string" string="%hostname% %fromhost-ip% %msg%")

#php slow log
if ($syslogtag == "php_log_slow_v2") then {
    action(
        broker=["c3-b2c-b2cop-log-kafka01.bj:9092","c3-b2c-b2cop-log-kafka02.bj:9092","c3-b2c-b2cop-log-kafka03.bj:9092"]
        type="omkafka"
        topic="php_log_slow_v2"
        template="general_log"
        confParam=["compression.codec=gzip"]
        #errorFile="rsyslog_err.log"
        partitions.auto="on"
    )
    stop
}

参考文档 :
http://www.rsyslog.com/doc/v8-stable/

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值