基于ELK打造强大的日志收集分析系统(springboot2+logback+logstash+elasticsearch+kibana)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/moshowgame/article/details/98851656

前言

上一代的日志分析系统springboot+log4j+flume+kafka仿佛还是昨天,现在已经流行起了新一代的springboot2+logback+logstash+elasticsearch的日志分析系统,借助es强大的生态圈以及全文搜索能力,实现日志收集/分析/检索不再是难事。

日志收集分为两种情况:

  • (本文)logback直接输出到logstash,通过Tcp/Socket等传输(网络开销),当量太大时Logstash会做一个缓存队列处理,减少了filebeat去读取抓取日志的步骤。
  • logback输出日志到日志文件,filebeat实时抓取日志文件(性能开销),再传输到logstash。

第二种情况的旧版flume方案就存在很大的缺点:在日志的产生端LogServer服务器重,部署FlumeAgent,然后实时监控产生的日志,再发送至Kafka。每一个FlumeAgent都占用了较大的系统资源,有时候LogServer性能开销大,CPU资源尤其紧张,所以实时收集分析日志,就必须交给一个更轻量级占用资源更少的日志收集框架,例如filebeat

什么是ELK?

在这里插入图片描述
功能上看,ElasticSearch负责数据的存储和检索,Kibana提供图形界面便于管理,Logstash是个日志中转站负责给ElasticSearch输出信息。

在这里插入图片描述
流程上看,Logstash收集AppServer产生的Log,并存放到ElasticSearch集群中,而Kibana则从ES集群中查询数据生成图表,再返回给Browser。

Logstash部分


下载&安装logstash

  1. logstash可以从以下地址下载,logstash和elasticsearch的版本要匹配,因为我们用的es是6.8.1,所以这里用了6.8.1的logstash,如果你是7.3.0则用7.3.0对应起来即可。
wget https://artifacts.elastic.co/downloads/logstash/logstash-6.8.1.tar.gz
  1. 这个包无论是windows或者linux都可用,解压即用
  2. (Linux下)cd到logstash目录下的bin目录,输入 sh ./logstash -e 'input { stdin { } } output { stdout {} }' ,输入任意命令测试是否成功,这是标准手动输入输出模式。

配置logstash

  1. 进入bin目录,copy一份logstash-sample.conf文件并重命名为到logstash.conf(或者直接新建一个logstash.conf文件),修改为以下内容(先注释掉elasticsearch部分,查看控制台是否输出,判断logback->logstash是否生效!!!):
# Logback -> Logstash -> Elasticsearch pipeline.
# by zhengkai.blog.csdn.net
input {
  tcp {
  
    host => "127.0.0.1"
    port => 9250
    mode => "server"
    tags => ["tags"]
    codec => json_lines
    }
}

output {
  #控制台直接输出
  stdout{
    codec => rubydebug
  }
  #可以注释掉elasticsearch部分,查看控制台是否输出,判断logback->logstash是否生效,@zhengkai.blog.csdn.net
   elasticsearch {
     hosts => ["127.0.0.1:9200"]
     action => "index"
     index => "mylog"
   }

}

  1. 修改pipelines.yml文件
 - pipeline.id: test
   pipeline.workers: 1
   pipeline.batch.size: 1
   #config.string: "input { stdin { } } output { stdout {} }"
   path.config: "/SWDTOOLS/logstash-6.8.1/config/logstash.conf"
  1. 运行logstash.bat(windows) ,logstash.sh(linux)

补充一点,output配置中的ElasticSearch部分是通过logstash-output-elasticsearch插件的方式实现的,链接是官方插件手册,可供查询详细配置 https://www.elastic.co/guide/en/logstash/6.8/plugins-outputs-elasticsearch.html

ElasticSearch部分


ElasticSearch下载和运行

ElasticSearch

关于es部分,可以之前的文章pringBoot2整合ElasticSearch(包含ElasticSearch入门+spring-boot-starter-data-elasticsearch)

  1. 下载 wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.8.1.zip,当然如果太慢可以自己换aria2下载,(另外,如果从官网https://www.elastic.co/cn/downloads/elasticsearch下载Elasticsearch,下载到的版本太新,7.X可能存在兼容性问题,最好Logstash和ElasticSearch一样都是6.8.1版本)
  2. 进入/bin目录,chmod +x elasticsearch 进行授权
  3. 无需额外配置,可以以默认配置运行
  4. 运行./elasticsearch -d即可(Ubuntu直接运行 sh elasticsearch 会报错,在Windows下运行 elasticsearch.bat 则没问题)
moshow@moshow-ThinkCentre-M900:~/Development/Environment/elasticsearch-6.8.1/bin$ sh elasticsearch
elasticsearch: 17: elasticsearch: source: not found
elasticsearch: 1: elasticsearch: : Permission denied
elasticsearch: 21: elasticsearch: Bad substitution
  1. 打开http://localhost:9200/验证是否成功
{
  "name" : "bOUWfou",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "l0CZWkdcTdCo6pZFO_jU4A",
  "version" : {
    "number" : "6.8.1",
    "build_flavor" : "default",
    "build_type" : "tar",
    "build_hash" : "1fad4e1",
    "build_date" : "2019-06-18T13:16:52.517138Z",
    "build_snapshot" : false,
    "lucene_version" : "7.7.0",
    "minimum_wire_compatibility_version" : "5.6.0",
    "minimum_index_compatibility_version" : "5.0.0"
  },
  "tagline" : "You Know, for Search"
}

SpringBoot&Logback部分


Maven依赖

<!-- https://mvnrepository.com/artifact/net.logstash.logback/logstash-logback-encoder -->
<dependency>
	<groupId>net.logstash.logback</groupId>
	<artifactId>logstash-logback-encoder</artifactId>
	<version>5.3</version>
</dependency>

Logback TCP Appenders配置

在这里插入图片描述

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <include resource="org/springframework/boot/logging/logback/base.xml" />

    <appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        <destination>127.0.0.1:9250</destination>
        <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder" />
    </appender>

    <root level="INFO">
        <appender-ref ref="LOGSTASH" />
        <appender-ref ref="CONSOLE" />
    </root>

</configuration>

Controller

  • (Suggest)使用lombok的@Slf4j注解,可以直接log.info()/log.error()调用slf4j进行输出
  • (不建议)或者使用原生private final Logger log = LoggerFactory.getLogger(getClass());
import cn.hutool.core.date.DateUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;


@RestController
@Slf4j
public class DemoController {

    @GetMapping
    public Object index(){
        String msg="Oh My God ,System Error when "+ DateUtil.now();
        log.error(msg);
        return ResponseEntity.ok(msg);
    }
}
  • 查看Logstash控制台输出情况
    在这里插入图片描述

LogStash::Outputs::ElasticSearch::HttpClient::Pool::HostUnreachableError问题

  • es无法连接情况,多数是es不可用或者有代理之类的情况:
    在这里插入图片描述

Kibana部分


下载&安装

  1. wget或者aria2c下载6.8.1版的Kibana
    wget https://artifacts.elastic.co/downloads/kibana/kibana-6.8.1-linux-x86_64.tar.gz

  2. 解压文件 tar -xzf kibana-6.8.1-linux-x86_64.tar.gz

  3. 进入kibana的bin目录,运直接./bin/kibana
    在这里插入图片描述

  4. 访问 http://localhost:5601/app/kibana
    在这里插入图片描述

  5. 建立一个新IndexPatten,Filter选择时间戳即可在这里插入图片描述在这里插入图片描述

  6. 查看已经建立的index patten,Time Filter by Timestamp,时间过滤器按照指定的时间段展示搜索结果。设置了 index contains time-based events 和 time-field 的索引模式可以使用时间过滤器。

在这里插入图片描述
Index Patten索引模式

要使用Kibana,就需要通过配置一个或多个索引模式来告诉它您想探索的 Elasticsearch 索引(相当于创建es连接)。创建连接之后可以:

  • Discover中以交互方式探索您的数据。
  • Visualize中以图表,表格,仪表,标签云等形式显示数据。
  • Canvas演示文稿中展示您的数据。
  • 如果您的数据包含地理数据,请使用地图Maps将其可视化。

另外,

  • 如果您的索引中含有一个时间戳字段,并且您想将这个字段用于执行基于时间比较的操作,请选择 索引含有带时间戳的事件 选项,Kibana 会读取索引映射并列出包含时间戳的所有字段,从中选择您需要的字段即可(例如@TimeStamp)。
  • 默认情况下,Kibana 会限制基于时间的索引模式的通配符扩展,(因为这意义不大,且浪费时间,尽量用正常的比较操作)符,范围为当前选定时间内的索引数据。点击“当搜索时不要展开索引模式”选项来禁用此行为(即不走时间索引)。

Discover数据探索模块

数据探索(Discover)页面负责交互式地探索es数据:

  • 可以访问与选定索引模式匹配的每个索引中的每个文档。
  • 可以提交搜索请求、过滤搜索结果、查看文档数据。
  • 还可以看到与搜索查询匹配的文档数,并获取字段值的统计信息。
  • 如果索引模式中配置了时间字段,您还可以在这个页面的顶部看到基于时间分布的文档数量柱状图。

在这里插入图片描述
Timelion时序控件

时序控件(Timelion)是一款时间序列数据可视化工具,它可以将多种独立的数据源合并呈现到一张视图上。它是由一个简单的表达式语言驱动的,用来检索时间序列数据,执行计算得出复杂问题的答案,并可视化结果。
Timelion 可以让您轻松获得如下问题的答案:

  • 过去某段时间页面的 UV 量是多少?
  • 本周五和上周五的流量有多少差异?
  • 本站今天来自日本的访客占多少百分比?
  • 标普500指数过去10天的移动平均值是多少?
  • 过去两年所有的搜索请求总量有多少?

更多详情可以访问官方使用手册 https://www.elastic.co/guide/cn/kibana/current/timelion-create.html

.es(index=metricbeat-*, timefield='@timestamp', metric='avg:system.cpu.user.pct')

在这里插入图片描述

效果演示

  1. 打开 http://localhost:9999/logstash/ ,看到 Oh My God ,System Error when 2019-08-10 18:35:00 的返回信息。
    在这里插入图片描述
  2. 查看Logstash控制台,发现stdout输出以及没有es报错提示。
    在这里插入图片描述
  3. 用插件elasticsearch-head查看ElasticSearch,默认连接地址localhost:9200,看到日志传输成功
    在这里插入图片描述
  4. 进入Kibana的Discover模块进行搜索 http://localhost:5601/app/kibana#/discover
    在这里插入图片描述

后言

关于探索Kibana更多功能可以查看官方的中文手册 https://www.elastic.co/guide/cn/kibana/current/index.html

猜你喜欢

转载自blog.csdn.net/moshowgame/article/details/98851656
今日推荐