简介

ELK,包含三款产品,Elasticsearch、Logstash、Kibana,可在项目中作为日志框架使用。

各模块的功能如下:

  • 应用服务
    生产日志,通过Logger产生日志并输出。
  • Logstash
    收集日志,通过http接收应用服务产生的日志。
  • Elasticsearch
    为日志提供全文检索功能。
  • kibana
    为Elasticsearch提供图形化界面。

安装过程

elasticsearch、logstash、kibana安装

为了简化安装步骤,本文使用docker-compose安装elk,所以需要先安装好docker与docker-compose。如果想自主安装,可以自行百度。

1. 新建logstash配置文件

我创建的为/opt/elk/logstash/logstash-springboot.conf文件,可以自行调整,但是要和下文docker-compose中的对应上

1
2
3
4
5
6
7
8
9
10
11
12
13
14
input {
tcp {
mode => "server"
host => "0.0.0.0"
port => 4560
codec => json_lines
}
}
output {
elasticsearch {
hosts => "es:9200"
index => "springboot-logstash-%{+YYYY.MM.dd}"
}
}

2. 编写docker-compose.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
version: '3'
services:
elasticsearch:
image: elasticsearch:7.4.2
container_name: elasticsearch
privileged: true
user: root
environment:
- "cluster.name=elasticsearch" #设置集群名称为elasticsearch
- "discovery.type=single-node" #以单一节点模式启动
- "ES_JAVA_OPTS=-Xms512m -Xmx512m" #设置使用jvm内存大小
volumes:
- /opt/elk/elasticsearch/plugins:/usr/share/elasticsearch/plugins #插件文件挂载
- /opt/elk/elasticsearch/data:/usr/share/elasticsearch/data #数据文件挂载
ports:
- 9200:9200
- 9300:9300
logstash:
image: logstash:7.4.2
container_name: logstash
privileged: true
environment:
- TZ=Asia/Shanghai
volumes:
- /opt/elk/logstash/logstash-springboot.conf:/usr/share/logstash/pipeline/logstash.conf #挂载logstash的配置文件
# - /opt/elk/logstash/Gemfile:/usr/share/logstash/Gemfile
depends_on:
- elasticsearch #logstash在elasticsearch启动之后再启动
links:
- elasticsearch:es #可以用es这个域名访问elasticsearch服务
ports:
- 4560:4560
kibana:
image: kibana:7.4.2
container_name: kibana
privileged: true
links:
- elasticsearch:es #可以用es这个域名访问elasticsearch服务
depends_on:
- elasticsearch #kchinaibana在elasticsearch启动之后再启动
environment:
- "elasticsearch.hosts=http://es:9200" #设置访问elasticsearch的地址
ports:
- 5601:5601

注:/opt/elk和elk版本可以换成自己想要的版本,上面还有一行注释掉的Gemfile,这个等会有用,先别取消注释。

3. 执行docker-compose文件

1
2
# 在上述docker-compose.yml的目录下执行docker-compose文件
docker-compose up -d

启动成功稍等一会,你就能通过http://127.0.0.1:5601/访问Kibana了。

4. 修改Gemfile文件

(当然,你要是能挂梯子,可以直接看第五步)

logstash的Gemfile文件默认镜像地址为https://rubygems.org,但是国内好像很能下载成功,所以我们要改一下,直接在docker里修改也始终不行,所以还是用挂载的吧,操作如下:

  • 首先拷贝docker中的文件到本机:
1
docker cp logstash:/usr/share/logstash/Gemfile /opt/elk/logstash
  • 修改文件中的source为https://gems.ruby-china.com/
1
2
# source "https://rubygems.org"
source "https://gems.ruby-china.com/"
  • 此时停止容器并移除通过创建的容器
1
2
# 在上述docker-compose.yml的目录下执行下面的语句
docker-compose down
  • 然后取消docker-compose.yml文件中的Gemfile注释,重新执行下面的语句
1
2
# 在上述docker-compose.yml的目录下执行docker-compose文件
docker-compose up -d

5. 安装logstash插件

1
2
3
4
5
6
7
8
9
10
# 进入logstash容器
docker exec -it logstash /bin/bash
# 进入bin目录
cd /bin/
# 安装插件
logstash-plugin install logstash-codec-json_lines
# 退出容器
exit
# 重启logstash服务
docker restart logstash

logstash-plugin install 以后,不出意外的话,你就会看到下面的成功提示:

image-20210323113549551

当然,要是出现下面的OpenTimeout提示,还是去看看第四步吧

1
ERROR: Something went wrong when installing logstash-codec-json_lines, message: Net::OpenTimeout

Spring Boot 项目搭建

1. 新建logback-spring.xml文件

新建springboot项目,然后在resources/log/下新建logback-spring.xml文件,下面的ip端口改成自己的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="org/springframework/boot/logging/logback/base.xml" />

<appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<destination>192.168.50.97:4560</destination>
<encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder"/>
<!-- 日志输出编码
<encoder charset="UTF-8"
class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
<providers>
<timestamp>
<timeZone>UTC</timeZone>
</timestamp>
<pattern>
<pattern>
{
"logLevel": "%level",
"serviceName": "${springAppName:-}",
"pid": "${PID:-}",
"thread": "%thread",
"class": "%logger{40}",
"rest": "%message"
}
</pattern>
</pattern>
</providers>
</encoder> -->
</appender>

<root level="INFO">
<appender-ref ref="LOGSTASH" />
<appender-ref ref="CONSOLE" />
</root>

</configuration>

2. 修改application.yml文件

1
2
3
# 加入下面的配置,引入日志文件
logging:
config: classpath:log/logback-spring.xml

3. 随便写一个测试接口

1
2
3
4
5
6
7
@GetMapping("/test")
public String test() {
logger.error("一条错误信息");
logger.warn("一条warn信息");
logger.info("一条warn信息");
return "success";
}

Kibana配置

浏览器输入http://127.0.0.1:5601,访问Kibana web界面。进入Management界面,点击index Patterns,然后点击创建一个索引

image-20210323134225736

在下面的界面中输入springboot-logstash-*然后点击Next step,这个springboot-logstash-*是根据上面logstash-springboot.confoutput模块的index属性确定的,要是你修改了,这边也需要做对应的修改。如果这边输入以后,提示没有任何匹配,可以试着先访问一下logstash的地址:http://127.0.0.1:4560/,然后刷新下界面,一般出现箭头处的索引,就基本没啥问题了。

image-20210323134937180

在接下来的页面选择@timestamp,然后点击Create index pattern

image-20210323135147928

此时,访问一下接口,然后就能在Discover模块看到记录的日志信息了。

image-20210323135515617

其他

kibana汉化

要是你不习惯kibana的英文页面,需要汉化,也比较简单,kibana 7.*以上的版本都带了中文语言包,只需要设置一下即可:

1
2
3
4
5
6
7
8
9
10
# 进入kibana容器
docker exec -it kibana /bin/bash
# 进入config文件夹
bash-4.2$ cd config/
# 编辑vi kibana.yml 并加入 i18n.locale: "zh-CN"
bash-4.2$ vi kibana.yml
# 编辑保存完毕 退出容器
bash-4.2$ exit
# 重启kibana
docker restart kibana

修改完的kibana.yml如下:

image-20210323140549131

等待kibana重启完能看到中文界面了。