ELK Stack

简介

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

  1. ELK简介
  • ELK 是一个开源的实时日志分析平台,它主要由 Elasticsearch、Logstash 和 Kiabana 三部分组成。

  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笔记虾]的博客

相关文章

在笔者近 3 年的 Java 一线开发经历中,尤其是一些移动端、用...
这一篇文章拖了有点久,虽然在项目中使用分布式锁的频率比较...
本文梳理总结了一些 Java 互联网项目中常见的 Redis 缓存应用...
书接上回,消息通知系统(notification-system)作为一个独立...
Redis 是目前互联网后端的热门中间件之一,在许多方面都有深...
在Java Spring 项目中,数据与远程数据库的频繁交互对服务器...