摘要

日志搜集查看是为了我们能够快捷方便查询问题解决线上问题的关键,特别是在微服务开发中,使用一个日志中心作为日志的存储跟搜索至关重要,一般在微服务中使用的是ELK组建,通过Elasticsearch存储查询日志,通过Logstash收集日志,通过Kibana可视化查看日志。本节我们主要讲解将SpringBoot服务中集成ELK实现日志收集功能。

内容

一.ELK简介

ELK是Elasticsearch+Logstash+Kibana简称

Elasticsearch 是一个分布式的搜索和分析引擎,可以用于全文检索、结构化检索和分析,并能将这三者结合起来。Elasticsearch基于Lucene开发,现在是使用最广的开源搜索引擎之一。

Logstash 简单来说就是一根具备实时数据传输能力的管道,负责将数据信息从管道的输入端传输到管道的输出端,与此同时这根管道还可以让你根据自己的需求在中间加上滤网,Logstash提供了很多功能强大的滤网以满足你的各种应用场景。

Kibana 是一个开源的分析与可视化平台,设计出来用于和Elasticsearch一起使用的。你可以用kibana搜索、查看、交互存放在Elasticsearch索引里的数据,使用各种不同的图标、表格、地图等,kibana能够很轻易的展示高级数据分析与可视化。

二.elk的安装

官网分别下载安装:https://www.elastic.co/cn/dow...
需要提前安装JDK1.8。

启动顺序为:Logstash >= Elasticsearch > Kibana

Logstash

我们按照官网操作:https://www.elastic.co/cn/dow...

解压
# 解压
tar -zxvf logstash-7.13.1-darwin-x86_64.tar.gz

# 修改目录
mv logstash-7.13.1-darwin-x86_64 logstash

# 切换目录
cd logstash
修改配置文件

进入目录下的:config/logstash.yml

#修改
http.host: 127.0.0.1
新建配置文件

vim logstash.conf

input {
  tcp {
    #模式选择为server
    mode => "server"
    #ip和端口根据自己情况填写,端口默认4560,对应下文logback.xml里appender中的destination
    host => "127.0.0.1"
    port => 4560
    #格式json
    codec => json_lines
  }
}
filter {
  #过滤器,根据需要填写
}
output {
  elasticsearch {
    action => "index"
    #这里是es的地址,多个es要写成数组的形式
    hosts  => "127.0.0.1:9200"
    #用于kibana过滤,可以填项目名称
    index  => "applog"
  }
}
启动
 ./bin/logstash -f ./config/logstash.conf

image.png

访问

http://127.0.0.1:9600/
得到结果:

{
    "host": "xiexinmingdeMacBook-Pro.local",
    "version": "7.13.2",
    "http_address": "127.0.0.1:9600",
    "id": "1adacb8f-14be-45a6-a851-f96a6143e992",
    "name": "xiexinmingdeMacBook-Pro.local",
    "ephemeral_id": "2f720f09-b984-4462-bb27-7256a3e962a7",
    "status": "green",
    "snapshot": false,
    "pipeline": {
        "workers": 16,
        "batch_size": 125,
        "batch_delay": 50
    },
    "build_date": "2021-06-10T19:51:49Z",
    "build_sha": "6d32f7df79a7d10d821b4cbff51c47f46d8c67b1",
    "build_snapshot": false
}

Elasticsearch

解压
# 解压
tar -zxvf elasticsearch-7.13.1.tar.gz
# 切换目录
cd elasticsearch-7.13.1/
修改配置文件 config/elasticsearch.yml
network.host: 真实ip:默认127.0.0.1
http.port: 端口:默认9200
启动es
./bin/elasticsearch

jdk如果启动过程中报错:

错误:future versions of Elasticsearch will require Java 11; your Java version from [/usr/local/nlp/java/jdk1.8.0_162/jre] does not meet this requirement.

#这是由于在elastic 到7.0之后 默认要使用JDK11以上 但是我们平时开发使用的一般都是JDK1.8,所以导致启动不成功
#elastic 7.2之后就自带JDK 我们可以再不改名系统本身环境变量的同时,使用elastic自身的JDK
#需要修改elastic的启动文件
vim bin/elasticsearch
 
#配置为elasticsearch自带jdk
export JAVA_HOME=/usr/local/nlp/elasticsearch-7.13.1/jdk
export PATH=$JAVA_HOME/bin:$PATH
 
#添加jdk判断
if [ -x "$JAVA_HOME/bin/java" ]; then
        JAVA="/usr/local/nlp/elasticsearch-7.13.1/jdk/bin/java"
else
        JAVA=`which java`
fi 
访问

http://127.0.0.1:9200/

得到结果:

{
  "name" : "xiexinmingdeMacBook-Pro.local",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "3VWU7eYPTx-yAmRnKuQ4TQ",
  "version" : {
    "number" : "7.13.1",
    "build_flavor" : "default",
    "build_type" : "tar",
    "build_hash" : "9a7758028e4ea59bcab41c12004603c5a7dd84a9",
    "build_date" : "2021-05-28T17:40:59.346932922Z",
    "build_snapshot" : false,
    "lucene_version" : "8.8.2",
    "minimum_wire_compatibility_version" : "6.8.0",
    "minimum_index_compatibility_version" : "6.0.0-beta1"
  },
  "tagline" : "You Know, for Search"
}

Kibana

解压
# 解压
tar -zxvf kibana-7.13.1-linux-x86_64.tar.gz
# 切换目录
cd kibana-7.13.1-linux-x86_64/
修改配置文件:config/logstash.yml.
http.host: "127.0.0.1"
#修改为es的地址
elasticsearch.url: http://127.0.0.1:9200
启动
./bin/kibana

日志:

log   [17:47:12.207] [info][server][Kibana][http] http server running at http://localhost:5601
访问

http://localhost:5601.

三.SpringBoot配置

1.pom.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 <modelVersion>4.0.0</modelVersion>
 <groupId>com.gf</groupId>
 <artifactId>springboot-elk</artifactId>
 <version>0.0.1-SNAPSHOT</version>
 <packaging>jar</packaging>
 <name>springboot-elk</name>
 <description>Demo project for Spring Boot</description>
 <parent>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-parent</artifactId>
 <version>2.1.1.RELEASE</version>
 <relativePath/> <!-- lookup parent from repository -->
 </parent>
 <properties>
 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
 <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
 <java.version>1.8</java.version>
 </properties>
 <dependencies>
 <dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-web</artifactId>
 </dependency>
 <dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-test</artifactId>
 <scope>test</scope>
 </dependency>
 <!-- logback -->
 <dependency>
 <groupId>ch.qos.logback</groupId>
 <artifactId>logback-classic</artifactId>
 </dependency>
 <dependency>
 <groupId>net.logstash.logback</groupId>
 <artifactId>logstash-logback-encoder</artifactId>
 <version>5.2</version>
 </dependency>
 </dependencies>
 <build>
 <plugins>
 <plugin>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-maven-plugin</artifactId>
 <configuration>
 <fork>true</fork>
 </configuration>
 </plugin>
 </plugins>
 </build>
</project>

2.logback.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration>
<configuration>
    <include resource="org/springframework/boot/logging/logback/defaults.xml"/>
    <include resource="org/springframework/boot/logging/logback/console-appender.xml"/>
    <!--应用名称-->
    <property name="APP_NAME" value="ccos-upms"/>
    <!--日志文件保存路径-->
    <property name="LOG_FILE_PATH" value="${LOG_FILE:-${LOG_PATH:-${LOG_TEMP:-${java.io.tmpdir:-/tmp}}}/logs}"/>
    <contextName>${APP_NAME}</contextName>
    <!--每天记录日志到文件appender-->
    <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_FILE_PATH}/${APP_NAME}-%d{yyyy-MM-dd}.log</fileNamePattern>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${FILE_LOG_PATTERN}</pattern>
        </encoder>
    </appender>
    <!--输出到logstash的appender-->
    <appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        <!--可以访问的logstash日志收集端口-->
        <destination>127.0.0.1:4560</destination>
        <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder"/>
    </appender>
    <root>
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="FILE"/>
        <appender-ref ref="LOGSTASH"/>
    </root>
</configuration>

四.测试

运行测试用例后回到kibana界面,Stack Management --> Index Patterns,填入Logstash配置中index的值,此处为applog.
Stack Management:
image.png.
Index Patterns:
image.png

Create index pattern
image.png

image.png.

image.png

Step 2 of 2: Configure settings:
image.png

image.png

回到Discover,image.png


startshineye
91 声望26 粉丝

我在规定的时间内,做到了我计划的事情;我自己也变得自信了,对于外界的人跟困难也更加从容了,我已经很强大了。可是如果我在规定时间内,我只有3分钟热度,哎,我不行,我就放弃了,那么这个就是我自己的问题,因为你自己...