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
复制代码
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