Docker搭建ELK
本文将介绍如何使用 Docker 搭建 ELK (Elasticsearch、Logstash、Kibana)。
因为借助于方便的 Docker,完整操作时间不超过 15 分钟。
为了方便搭建,我们使用 https://github.com/deviantony/docker-elk 这个开源项目,这个项目维护了 ELK 技术栈最近的三个版本,也就是 7.x、6.x、5.x ,本文将使用最新版本。
用于开发测试的基础环境使用一台1c2g的虚拟机即可,当然机器资源越多我们的服务运行效率也会越高、相同时间内数据处理能力也就越大。而用于一般生产环境建议根据自己具体情况给予更多资源。
# 搭建流程:Dev环境
# 1. 拉取docker-elk项目
# 创建ELK目录
$ mkdir ELK
$ cd ELK
# 拉取docker-elk项目
$ git clone https://github.com/SleepyOcean/docker-elk.git
# 进入项目目录
$ cd docker-el
2
3
4
5
6
7
8
9
# 2. 启动项目
# 通过docker-compose启动容器。如果没有docker-compose,请先安装docker-compose。
$ docker-compose up
2
启动成功后,需要手动将任务切到后台。
# 3. 重置内建用户密码
$ docker-compose exec -T elasticsearch bin/elasticsearch-setup-passwords auto --batch
# 以下是命令输出
Changed password for user apm_system
PASSWORD apm_system = YkELBJGOT6AxqsPqsi7I
Changed password for user kibana
PASSWORD kibana = FxRwjm5KRYvHhGEnYTM9
Changed password for user logstash_system
PASSWORD logstash_system = A4f5VOfjVWSdi0KAZWGu
Changed password for user beats_system
PASSWORD beats_system = QnW8xxhnn7LMlA7vuI7B
Changed password for user remote_monitoring_user
PASSWORD remote_monitoring_user = OvjEGR13wjkOkIbWqaEM
Changed password for user elastic
PASSWORD elastic = PGevNMuv7PhVnaYg7vJw
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 4. 自定义配置
将密码妥善保存后,我们需要将 docker-compose.yml 配置文件中的 elasticsearch 服务的 ELASTIC_PASSWORD 去掉,这样可以确保服务启动只使用我们刚刚重置后的密码(keystore)。以及需要对 kibana 、 logstash 配置文件中的信息进行替换,将文件中的 elastic 用户的密码进行更新,暂时先修改下面三个文件就可以了:
- kibana/config/kibana.yml
- logstash/config/logstash.yml
- logstash/pipeline/logstash.conf
需要注意的是, logstash pipeline 需要一个高权限账号,当前测试开发过程中,可以使用上面重置后的 elastic 账号和密码,如果是生产使用可以参考官方文档 Configuring Security in Logstash (opens new window)进行操作,分配一个新的专用账号。
配置logstash
此处我的logstash配置如下
input {
beats {
port => 5044
}
tcp {
## 该端口是稍后输出日志的端口定义
port => 5000
}
}
## Add your filters / logstash plugins configuration here
output {
elasticsearch {
hosts => "elasticsearch:9200"
index => "so-server-%{+YYYY.MM.dd}"
user => "elastic"
password => "PGevNMuv7PhVnaYg7vJw"
ecs_compatibility => disabled
}
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
在配置修改完毕后,我们执行 docker-compose restart
重启相关服务。如果日志中没有出现任何 401 或者访问拒绝的内容,说明服务一切正常。
# 5. Spring Boot 集成 ELK
1)在pom.xml
中添加logstash-logback-encoder
依赖
<!--集成logstash-->
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>5.3</version>
</dependency>
2
3
4
5
6
2)在项目的resource目录下添加logback-spring.xml
,让logback日志输出到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"/>
<!--应用名称-->
<property name="APP_NAME" value="so-blog-server"/>
<!--日志文件保存路径-->
<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>192.168.3.101:5000</destination>
<encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder"/>
</appender>
<root level="INFO">
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
<appender-ref ref="LOGSTASH"/>
</root>
</configuration>
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
3)在项目配置文件(application.yml
)中配置logback-spring.xml
路径
...
logging:
config: classpath:logback-spring.xml
...
2
3
4
4)启动项目测试日志
5)在kibana中查看日志
首先新建一个Index pattern,我们设置的index名是springboot-logstatsh-%{+YYYY.MM.dd}
,所以我们创建一个Index pattern名为springboot-logstatsh-*
,然后Time Filter field name选择@timestamp