为你的SpringBoot服务赋一个高大上的线上日志系统(ELK)

2,649 阅读2分钟

PK创意闹新春,我正在参加「春节创意投稿大赛」,详情请看:春节创意投稿大赛

前言

日志是一个完整系统必不可少的组件,你会将日志输出到什么地方呢?控制台 or 文件?这些都是比较简单直接的方式,但恐怕都不是好的办法。因为日志数据量巨大,后期问题排查就要抓耳挠腮了。还有,每次抓取日志都远程要到服务器上,既不方便也不符合码农极客精神的追求。所以我们需要的是一个既可以高效搜索又可以随时随地抓取的日志系统,目前业界比较流行的方案是 ELK(Elasticsearch + Logstash + Kibana)。

ELK搭建

以下 ELK 安装部署都是采用 Docker 容器的方式,不了解 Docker 的朋友需要先去熟悉一下!

ELK镜像拉取

docker pull elasticsearch
docker pull logstash
docker pull kibana

此命令会从 Docker 仓库拉取 ELK 的最新镜像,目前版本是 7.10.2

ELK容器创建

1、Elasticsearch 容器创建运行

docker run --name elasticsearch \
-p 9200:9200 \
-p 9300:9300 \
-e "discovery.type=single-node" \ # 单节点模式
-e ES_JAVA_OPTS="-Xms256m -Xmx256m" \ # 初始内存和最大内存
-d elasticsearch

2、Kibana 容器创建运行

docker run --name kibana \
-p 5601:5601 \
-e ELASTICSEARCH_HOSTS=http://部署ES服务IP地址:9200 \
-d kibana

3、Logstash 容器创建运行

创建 /usr/local/docker/logstash/logstash.conf 配置文件,内容为

input {
  tcp {
    mode => "server"
    host => "0.0.0.0"
    port => 4560
  }
}
output {
  elasticsearch {
    hosts => ["部署ES服务IP地址:9200"]
    action => "index"
    codec => json
    index => "today-log-%{+YYYY.MM.dd}"
  }
}
docker run --name logstash \
-p 4560:4560 \
-v /usr/local/docker/logstash/logstash.conf:/usr/share/logstash/pipeline/logstash.conf \ # 挂载logstash的配置文件
-d logstash

至此,ELK 的安装部署已经全部完成,看看它们的运行情况吧

docker ps

image.png

SpringBoot输出日志

1、Logstash 依赖

<dependency>
    <groupId>net.logstash.logback</groupId>
    <artifactId>logstash-logback-encoder</artifactId>
    <version>5.3</version>
</dependency>

2、创建 src/main/resource/logback-spring.xml 输出日志到 Logstash

<?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"/>
​
    <appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        <destination>部署Logstash服务的IP地址:4560</destination>
        <encoder charset="UTF-8" class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
            <providers>
                <!--自定义日志输出格式-->
                <pattern>
                    <pattern>
                        {
                        "project": "today",
                        "level": "%level",
                        "pid": "${PID:-}",
                        "thread": "%thread",
                        "class": "%logger",
                        "message": "%message",
                        "stack_trace": "%exception{20}"
                        }
                    </pattern>
                </pattern>
            </providers>
        </encoder>
    </appender>
    
    <root level="INFO">
        <appender-ref ref="LOGSTASH"/>
    </root>
    
</configuration>

访问 Kibana 查看日志

启动 SpringBoot 服务后浏览器访问 Kibana

http://部署Kibana服务IP:5601

image.png

image.png