ELK 日志监控平台
1 ELK 简介
ELK是三个开源工具的缩写,分别代表Elasticsearch、Logstash和Kibana。这个组合常被用来整合日志管理和分析
Elasticsearch
: 是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Logstash
: 是一个服务器端的数据处理管道,它可以同时从多个源获取数据,对其进行转换,然后将其发送到一个或多个目的地Kibana
: 是一个基于Web的图形界面,用于查看Elasticsearch的数据。它可以进行数据的可视化,并且提供了一些功能,比如图表、地图、时间线和仪表盘等。

2 ELK 安装
需要先安装java环境
es、kabana、logstash的版本号需要保持一致,本次采用7.2.1版本
2.1 Elasticsearch
2.1.1 下载Elasticsearch
Elasticsearch 下载地址,选择rpm包下载
2.1.2 安装
rpm -ivh elasticsearch-7.2.1-x86_64.rpm
2.1.3 配置
vim /etc/elasticsearch/elasticsearch.yml
# 修改以下配置
node.name: node-1
#日志地址
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
# 供外部访问
network.host: 0.0.0.0
# 端口
http.port: 9200
discovery.seed_hosts: ["127.0.0.1:9200"]
cluster.initial_master_nodes: ["node-1"]
2.1.4 启动
systemctl start elasticsearch
2.1.5 测试
curl localhost:9200

2.2 Kibana
2.2.1 下载
2.2.2 安装
rpm -ivh kibana-7.2.1-x86_64.rpm
2.2.3 配置
vim /etc/kibana/kibana.yml
#修改以下配置
server.port: 5601
server.host: "0.0.0.0"
elasticsearch.hosts: ["http://127.0.0.1:9200"]
#目前没有设置密码,先注释
#elasticsearch.username: "elastic"
#elasticsearch.password: "yDaYCXL6KYgNligMpSwd"
2.3.4 启动
systemctl start kibana
等待一段时间,浏览器访问ip:5601端口

2.3 Logstash
2.3.1 下载
2.3.2 安装
rpm -ivh logstash-7.2.1.rpm
2.3.3 配置
cd /etc/logstash/conf.d
# 创建配置文件
touch logstash.conf
#编辑配置文件
vim logstash.conf
input {
tcp {
host => "0.0.0.0"
port => 9600
mode => "server"
codec => json_lines
}
}
output {
elasticsearch {
hosts => "localhost:9200"
index => "%{[appname]}-%{+YYYY.MM.dd}"
}
}
说明:
input
– 用于定义数据的输入源,即Logstash的数据来源。
tcp
– 用于指定Logstash监听指定的IP和端口,接收 TCP 连接传入的数据。
host
– 监听的主机IP地址,这里的0.0.0.0
表示监听所有可用的网络接口。
port
– 监听的端口号
mode
– 连接模式。
codec
– 数据编码解码方式,json_lines
表示接收到的数据将以JSON行的形式解析。
output
– 用于定义数据的输出目录。
elasticsearch
– 表示将数据输出到Elasticsearch集群。
hosts
– 用于设置Elasticsearch集群的主机地址和端口号。
index
– 用于指定Elasticsearch索引的名称。这里使用 %{[appname]}
表示索引名称从数据中的appname
字段获取。%{+YYYY.MM.dd}
表示在索引中包含日期信息。
2.3.4 启动
systemctl start logstash
#查看启动状态
systemctl status logstash

如果不能正常启动,可能是没有找到java变量,需要改一下启动文件
cd /usr/share/logstash/bin
vim logstash.lib.sh
加入JAVA_HOME环境变量

3 SpringBoot 整合ELK
配置logback,将日志推送到logstash监听的端口。logstash会解析数据插入到Elasticsearch中。
3.1 加入依赖
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>7.2</version>
</dependency>
新增一个Controller,用于测试日志
@RestController
class TestController {
public static final Logger LOGGER = LoggerFactory.getLogger(TestController.class);
@GetMapping("/hello")
public String hello() {
LOGGER.info(UUID.randomUUID().toString() + System.currentTimeMillis());
return "SUCCESS";
}
}
3.2 logback.xml配置
这里只配置了Console和Logstash。本地日志文件请自行引入
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false" scan="true" scanPeriod="60 seconds" packagingData="true">
<!-- ******************** appender:日志目的地 start ******************** -->
<!-- 标准输出:console -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<!-- encoder 默认配置为PatternLayoutEncoder -->
<encoder>
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
</encoder>
</appender>
<!--logback.LogbackDemo:类的全路径 -->
<appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<destination>192.168.163.127:9600</destination>
<encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder" >
<customFields>{"appname":"boot-elk"}</customFields>
</encoder>
</appender>
<root level="info">
<!-- 定义了INFO及以上级别的日志,分别在文件和控制台输出 -->
<level value="info" />
<appender-ref ref="console" />
<appender-ref ref="LOGSTASH" />
</root>
</configuration>
启动项目,多访问几次测试url:localhost:8080/hello
3.3 kibana 创建索引
3.3.1 进入索引管理页面

3.3.2 创建索引

3.3.3 输入索引

3.3.4 完成所有创建

3.3.5 索引字段管理

3.4 kibana搜索日志
3.4.1 进入discover

3.4.2 关键字搜索日志

4 filebeat 收集日志

4.1 下载
4.2 安装
rpm -ivh filebeat-7.2.1-x86_64.rpm
4.3 filebeat配置
例:通过filebeat收集nginx日志、发送到redis、logstash从redis中采集日志
filebeat.inputs:
- type: log
enabled: true
paths:
- /usr/local/nginx/logs/access.log # nginx 日志地址
tags: ["nginx"] # 加上tag,logstash在读取redis数据时,知道是哪一个日志
# 这里可以添加多个,也可以收集到其他日志
output.redis:
hosts: ["127.0.0.1:6379"] # redis地址
password: "redispwd"
db: "0" # redis数据库编号
key: "filebeat-log" # key
4.4 logstash配置
input {
# redis配置
redis {
# redis key的数据类型
data_type => "list"
key => "filebeat-log"
host => "127.0.0.1"
port => 6379
db => 0
password => "redispwd"
}
}
output {
if "nginx" in [tags]{
elasticsearch {
hosts => ["localhost:9200"]
index => "nginx-tx-%{+YYYY.MM.dd}"
}
}
}
4.5 启动filebeat
systemctl start filebeat
4.6 测试
访问nginx后,查看redis数据库
发现日志已经写入到nginx中
kibana查看保存的记录,可以看到记录已经写入