ELK实战二:日志收集利器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

ELK实战一:架构的选择

经常有人在问应该需要哪种架构?要不要使用redis、kafka?它们是怎么的结构去工作的?ELK分别起到了什么作用?接下来根据我的使用经验谈一下目前最常见的两种架构,基本满足于90%以的场景,如有错误之处,还望请指正!

一、数据量小,且数据可靠性要求不强(允许ELK故障时丢失数据)的公司

架构如下:

Logstash -> Elasticsearch -> Kibana

  • 收集客户端: rsyslog/heka/flume/logstash/fluent都行,在这个阶段,客户端收集性能不需要过多的考虑,* 都可以满足,看自己的喜好,值得说的是这样的架构规模因数据量不大,客户端此时可以做解析、过滤日志处理后再入到elasticsearch,前提是一定要保证客户端不能影响到生产环境的业务稳定性。不保证收集客户端的可靠性,可通过 supervisor/monit等工具做守护,添加监控

  • 数据存储、搜索: elasticsearch 配置默认即可满足,至于分片复本默认都可以,视数据重要性决定是否添加复本,如果添加,最多一个复本足矣(添加复本性能下降很大,规模不大,这个问题应该不会出现)

  • 数据展示: kibana 可以根据ES的数据做各种各样的图表来直观展示业务实时状况

二、数据量大,且数据不允许丢失,实时、稳定性要求高的公司

架构如下:

Logstash -> Kafka -> Logstash -> Elasticsearch -> Kibana

  • 收集客户端: 选型上,在上面基础之上同上,在这里就不能像小规模时的在客户端做大量的数据处理了,尽量收集最原始数据给kafka或redis,因数据量达到一定程度,客户端因数据处理策略会体现出压力过大,从而会影响到生产环境业务
    的稳定性

  • 队列: 可选择redis/kafka这类的队列工具,优选kafka,因它的分布式、高可用性、大吞吐的特性,它保证了在高并发下即使ES集群故障,在故障恢复后数据仍可追加;从数据客户端收集的原始日志写入到kafka,可供各种应用消费

  • 数据处理: 可选用logstash/hangout/rsyslog等,优选hangout,性能较logstash好,功能是仿照logstash做的,大部分需求可满足,在这层做数据的解析、过滤等,比如geoip、useragent、json格式化、字段切割/拼接等,按天索引写入elasticsearch(索引建议提前一天以上建立,减少整点自动建立时的高负载),使用curator做定时关闭、删除N天前的索引,如有多索引查询,还可以使用此工具做alias来方便多索引联合查询。

  • 数据存储、搜索: elasticsearch集群,考虑多分片一复本最佳,根据数据大小与搜索频度来调整分片数量,建立索引命名规范,相同类型数据统一建立即mapping模板,添加如bigdesk\marvel\head\kopf这样的监控工具来长期分析性能并调优

  • 数据展示: kibana 根据ES数据做图表,使用elasticdump工具定时备份.kibana索引数据(.kibana是kibana的默认索引名称,里面包含了所有kibana中的配置,如图表、搜索、设置、index pattern等)

以上简单谈了以下两种常见架构,它的使用场景、各层的功能、以及与之相关的一些工具,接下来我会以我们目前使用的架构了逐一讲解。

博客迁移至Hexo

折腾了一天,博客迁移到了hexo,之前使用的wordpress,里面的内容较陈旧,但也算是迁移过来了,只是以前的链接全部失效了,
如果你通过搜索引擎来到了这里,请重新搜索需要的文章,接下来我会陆续写一下最近半年使用的ELK相关内容,目前网络中有各种调优
与部署、配置文件详解,但对入门来说,好多同学都显得很迷茫,我会以主要贴具体的配置文件来讲ELK的实战,配置文件中各参数不会一一解读,请自行搜索。

使用Rsyslog来收集常用日志

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为例)

,