【MapSheep】
[好记性不如烂笔头]

简介

  1. 引言
  • 在排查线上异常的过程中,查询日志总是必不可缺的一部分。现今大多采用的微服务架构,日志被分散在不同的机器上,使得日志的查询变得异常困难。
  • 工欲善其事,必先利其器。如果此时有一个统一的实时日志分析平台,那可谓是雪中送碳,必定能够提高我们排查线上问题的效率。本文带您了解一下开源的实时日志分析平台 ELK 的搭建及使用。

  1. 介绍
  • ElasticSearch:分布式,RESTful风格的搜索和分析
    • 全文搜索;提供搜集、分析、存储数据三大功能,是一套开放REST和JAVA API等结构提供高效搜索功能,可扩展的分布式系统。它构建于Apache Lucene搜索引擎库之上。
  • Logstash:采集、转换、充实、然后输出
    • 是服务器端数据处理管道,能够同时从多个来源采集、转换数据,然后将数据发送到诸如 Elasticsearch 等"存储库"中。
  • Kibana:实现数据可视化,在Elastic Stack中进行导航
    • 让运维同学在PC端使用图形和图表对数据进行可视化。
  1. 三者关系
  • Logstash把数据从"NGINX"、"SpringBoot"中取出, 并保存到ES中,然后由Kibana在在ES中取出数据在页面上展示。

  1. 介绍三大组件
  • E

  • L

  • K


  1. ELK 实现方案


  1. ELK 的大致工作流程


操作使用

  1. 在 Spring Boot 中使用 ELK
  • 首先我们需要创建一个 Spring Boot 的项目,之前我写过一篇文章介绍 如何使用 AOP 来统一处理 Spring Boot 的 Web 日志 ,本文的 Spring Boot 项目就建立在这篇文章的基础之上。
  • 修改并部署 Spring Boot 项目
  • 在项目 resources 目录下创建 spring-logback.xml 配置文件。
<?xml version="1.0" encoding="UTF-8"?>  
<configuration debug="false">  
    <contextName>Logback For demo Mobile</contextName>  
    <property name="LOG_HOME" value="/log" />  
    <springProperty scope="context" name="appName" source="spring.application.name"  
                    defaultValue="localhost" />  
    ...  
  
    <appender name="ROLLING_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">  
        ...  
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">  
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{25} ${appName} -%msg%n</pattern>  
        </encoder>  
        ...  
    </appender>  
    ...  
</configuration>   

  1. 打包并部署 Spring Boot 项目
# 打包命令  
mvn package -Dmaven.test.skip=true  
# 部署命令  
java -jar sb-elk-start-0.0.1-SNAPSHOT.jar 

  1. 生成日志
  • logback 配置文件中我将日志存放在 /log/sb-log.log 文件中,执行 more /log/sb-log.log 命令,出现以下结果表示部署成功。

  1. Shipper 角色的 Logstash 的配置
input {  
    file {  
        path => [  
            # 这里填写需要监控的文件  
            "/log/sb-log.log"  
        ]  
    }  
}  
  
output {  
    # 输出到redis  
    redis {  
        host => "10.140.45.190"   # redis主机地址  
        port => 6379              # redis端口号  
        db => 8                   # redis数据库编号  
        data_type => "channel"    # 使用发布/订阅模式  
        key => "logstash_list_0"  # 发布通道名称  
    }  
}  

  1. Indexer 角色的 Logstash 的配置
input {  
    redis {  
        host      => "192.168.142.131"    # redis主机地址  
        port      => 6379               # redis端口号  
        db        => 8                  # redis数据库编号  
        data_type => "channel"          # 使用发布/订阅模式  
        key       => "sb-logback"  # 发布通道名称  
    }  
}  
  
filter {  
     #定义数据的格式  
     grok {  
       match => { "message" => "%{TIMESTAMP_ISO8601:time} \[%{NOTSPACE:threadName}\] %{LOGLEVEL:level}  %{DATA:logger} %{NOTSPACE:applicationName} -(?:.*=%{NUMBER:timetaken}ms|)"}  
     }  
}  
  
output {  
    stdout {}  
    elasticsearch {  
        hosts => "localhost:9200"  
        index => "logback"  
   }  
}  

  1. ELK 后台启动
[program:elasticsearch]  
environment=JAVA_HOME="/usr/java/jdk1.8.0_221/"  
directory=/home/elk/elk/elasticsearch  
user=elk  
command=/home/elk/elk/elasticsearch/bin/elasticsearch  
  
[program:logstash]  
environment=JAVA_HOME="/usr/java/jdk1.8.0_221/"  
directory=/home/elk/elk/logstash  
user=elk  
command=/home/elk/elk/logstash/bin/logstash -f /home/elk/elk/logstash/indexer-logstash.conf  
  
[program:kibana]  
environment=LS_HEAP_SIZE=5000m  
directory=/home/elk/elk/kibana  
user=elk  
command=/home/elk/elk/kibana/bin/kibana  
  1. 转载出处:https://mp.weixin.qq.com/s/nOVQAZWKzMhGJDOayVuiPA 文章出自: [微信公众号_Java笔记虾]的博客
posted on 2021-07-08 19:50  (Play)  阅读(89)  评论(0编辑  收藏  举报