徒手从零搭建一套ELK日志平台

在复杂的企业应用系统中,系统的服务每天都会产生很多的日志信息,如果没有一套高效记录和搜索日志的平台,那么开发人员和运维人员都无法定位服务和处理线上问题。因此一套优秀的日志分析平台是每个公司必备的系统之一。目前市面比较成熟方式是使用ELK搭建一套日志平台。

ELK日志分析平台使用fileBeat和Logstash收集和解析系统运行中产生的各种日志数据,采用ElasticSearch存储日志信息,通过Kibana可视化平台在海量数据中查询我们需要的信息。ELK方便我们定位分析系统问题。

下面我们基于FileBeat、Kafka、 Logst ash、 ElasticSearch 、Kibana搭建一套完整的日志分析平台。

1、日志平台整体的架构

日志的分析的流程:

(1)通过FileBeat采集服务器上的日志,然后将采集好的日志推送到Kafka中。此时为什么不直接将采集的日志推送到Logstash呢?因为logstash在并发量很大的时候容易丢失数据,所以为了保证数据不丢失我们采用Kafka将流量消峰然后把数据推送给Logstash消费。

(2)kafka将队列中的日志数据给Logstash消费,Logstash将数据做定制化处理,处理好数据后再推送到ES指定的索引中。

(3)ES收到Logstash推送的数据之后存储对于索引的分片中,由于ES自身的特性,针对海量数据处理能力还是很优秀的。

(4)开发人员或运维人员通过Kinaba可视化平台查询ES中的数据。

2、搭建日志分析平台

(1)fileBeat

filebeat可以实现从本地/远程服务器提取日志文件内容,它可以保证日志文件的内容将至少传递一次到配置的输出并且没有数据丢失。

下载地址:https://www.elastic.co/cn/downloads/past-releases#filebeat

核心配置:

filebeat.inputs: 
- type: log 
  enabled: true    #true表示当前的paths会被监听  false表示不监听 
  paths: 
    - /usr/local/oms/logs/access.log* 
#给当前的监听到的日志增加一个标签名称 
  tags: ["oms"] 
output.kafka: 
  codec.format: 
    string: '%{[@timestamp]} %{[message]}' 
#自己kafka的服务地址 
  hosts: ["192.168.201.12:9092"]   
  topic: 'oms-log-topic' 
#控制分区行为 
  partition.round_robin: 
    reachable_only: false 
#kafka的请求确认等级 
  required_acks: 1 
#kafka的压缩 
  compression: gzip 
#kafka最大消息大小设置 
  max_message_bytes: 1000000

(2)Logstash

Logstash就是一个web容器,它主要是用来做日志的搜集、分析和过滤, Logstash 支持大量的数据获取方式。

下载地址:https://www.elastic.co/cn/downloads/past-releases/logstash-7-8-0

核心配置:

input { 
  kafka { 
#kafka集群配置只需要在地址后面添加一个逗号分隔 
    bootstrap_servers => "192.168.201.12:9092" 
    topics => ["oms-log-topic"] 
    group_id => "logstash-group" 
    consumer_threads => 3 
    codec => "json" 
  } 
} 

output { 
  elasticsearch { 
    hosts => ["http://192.168.201.25:9200"] 
    index => "%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}" 
  } 
}

(3)Kibana配置

Kibana 针对大规模数据快速运行数据分析,以实现可观测性、安全和搜索(官方的解释)。

下载地址:https://www.elastic.co/cn/downloads/past-releases#kibana

核心配置:

vi kibana.yaml 
#-----------修改内容----------- 
server.port: 5601 
server.host: "0.0.0.0" 
elasticsearch.hosts: ["http://192.168.201.25:9200"] 

备注: 
server.host: "0.0.0.0" :如果我们需要把kibana服务给远程主机访问只需要 
在这个配置里面填写远程那台主机的ip地址,如果我们希望所有的远程主机都可以访问 
我们就填写0.0.0.0

完成以上的组件搭建和核心配置之后,我们就完成采集到日志的数据,通过Kibana来实现日志的可视化。

最后就是配置项目的日志存放地址(目的就是让fileBeat采集指定位置文件数据)

日志的配置:

<?xml version="1.0" encoding="UTF-8"?> 
<configuration> 
    <property name="LOG_HOME" value="/usr/local/oms/logs"/> 
    <!-- 访问日志 appender  --> 
    <appender name="ACCESS" class="ch.qos.logback.core.rolling.RollingFileAppender"> 
        <File>${LOG_HOME}/access.log</File> 
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy"> 
            <!-- daily rollover --> 
            <FileNamePattern>/${LOG_HOME}/access.%d{yyyy-MM-dd}.log</FileNamePattern> 
            <!-- keep 30 days' worth of history --> 
            <maxHistory>30</maxHistory> 
        </rollingPolicy> 
        <encoder> 
            <Pattern>[%d{yyyy-MM-dd HH:mm:ss}] [%level] [%X{traceId}] [%thread] %logger{35} - %msg %n</Pattern> 
        </encoder> 
    </appender> 
    <root level="INFO"> 
         <appender-ref ref="ACCESS"/> 
     </root> 
</configuration>

在Kibana上可以看到日志:

总结:以上就是我们利用了ELK搭建一套日志平台,此日志平台实时性高、扩展性强、数据可视化分析功能丰富;在搭建的时候需要注意FileBeat、Kafka、 Logst ash、 ElasticSearch 、Kibana版本的对应。

3