首先下载ELK,官网:https://www.elastic.co/cn/
小编这里下载的7.16.1版本,注意,elasticsearch、logstash、kibana的版本要一致,否则可能报错。
需要提前安装JDK1.8。
启动顺序为:Logstash >= Elasticsearch > Kibana
1. Elasticsearch
# 解压
tar -zxvf elasticsearch-7.16.1-linux-x86_64.tar.gz
# 切换目录
cd elasticsearch-7.16.1/
修改配置文件 config/elasticsearch.yml
node.name: node-1
network.host: 192.168.12.128
http.port: 9200
cluster.initial_master_nodes: ["node-1"]
启动es:
# ./bin/elasticsearch -d 加-d后台运行
./bin/elasticsearch
注:若启动时报错不允许root用户启动、权限不足、内存大小与默认配置等问题,请查阅小编的上一篇文章:https://blog.csdn.net/RookiexiaoMu_a/article/details/122023471
启动成功,访问192.168.37.189:9200
2. Logstash
# 解压
tar -zxvf logstash-7.16.1-linux-x86_64.tar.gz
# 切换目录
cd logstash-7.16.1/
修改配置文件 config/logstash.yml,在最后追加:
http.host: "192.168.12.128"
在logstash-7.16.1目录下编辑文件:
vi logstash.conf
输入以下内容:
input {
tcp {
#模式选择为server
mode => "server"
#ip和端口根据自己情况填写,端口默认4560,对应下文logback.xml里appender中的destination
host => "192.168.12.128"
port => 4560
#格式json
codec => json_lines
}
}
filter {
#过滤器,根据需要填写
}
output {
elasticsearch {
action => "index"
#这里是es的地址,多个es要写成数组的形式
hosts => "192.168.12.128:9200"
#用于kibana过滤,可以填项目名称
index => "api_log"
}
}
在logstash-7.16.1目录下使用命令启动:
./bin/logstash -f logstash.conf
访问http://192.168.12.128:9600,成功的话会显示一个JSON串
3. Kibana
# 解压
tar -zxvf kibana-7.16.1-linux-x86_64.tar.gz
# 切换目录
cd kibana-7.16.1-linux-x86_64/
修改配置文件 config/kibana.yml
server.port: 5601
server.host: "0.0.0.0"
# 原默认是30000(30s),酌情修改,也可使用默认
elasticsearch.requestTimeout: 60000
#修改为es的地址【.url的方式会报错】
#elasticsearch.url: http://192.168.12.128:9200
elasticsearch.hosts: ["http://192.168.12.128:9200/"]
elasticsearch.url的方式会报错:
FATAL Error: [elasticsearch.url]: definition for this key is missing
进入kibana-7.16.1-linux-x86_64目录启动:
# 非后台启动
./bin/kibana --allow-root
# 后台启动
nohub ./bin/kibana --allow-root &
kibana也不能使用root用户启动,可以创建一个新用户给予权限启动,也可在启动命令后追加 --allow-root
启动成功访问页面:http://192.168.12.128:5601
3. SpringBoot项目接入ELK日志收集
3.1 新建一个SpringBoot项目,其中一个UserController.java内容如下:
package com.xiaomu.problem.controller;
import com.xiaomu.problem.entity.UserA;
import com.xiaomu.problem.entity.UserB;
import com.xiaomu.problem.service.UserService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.List;
/**
* 用户
*
* @author xiaomu
* @date 2021/12/11 14:04
*/
@Slf4j
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@GetMapping("/test1/{userId}")
public String test1(@PathVariable Long userId) {
UserA user = userService.getUserInfo(userId);
log.warn("UserController.test1 userId:{}, user:{}", userId, user.toString());
return "SUCCESS";
}
}
其中User重写了toString方法。
3.2 logback-spring.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<!--
scan: 当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true。
canPeriod: 设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。
debug: 当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。
-->
<!--<configuration scan="true" scanPeriod="60 seconds" debug="false"></configuration>-->
<configuration debug="false">
<!-- springProperty标签来引用yml的值 -->
<springProperty scope="context" name="log.path" source="spring.application.name"/>
<!--
property标签:配置直接管理属性 我们可以直接改属性的value 格式:${name}
-->
<property name="FILE_LOG_PATTERN" value="logs/${log.path}-log"/>
<!--
日志输出格式:
%-5level
%d{yyyy-MM-dd HH:mm:ss.SSS}日期
%c类的完整名称
%M为method
%L为行号
%thread线程名称
%m或者%msg为信息
%n换行
-->
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level∶级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<property name="pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} %c [%thread] %-5level %msg%n"/>
<appender name="stash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<destination>192.168.12.128:4560</destination>
<encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder"/>
</appender>
<!-- root logger配置 -->
<!-- 日志等级:OFF > FATAL > ERROR > WARN > INFO > DEBUG > ALL【OFF:关闭日志】 -->
<root level="INFO">
<appender-ref ref="stash"/>
</root>
</configuration>
3.3 启动项目访问项目
返回SUCCESS,说明成功!
5. Kibana查看日志
根据步骤走:
创建索引:
这里的name小编实际是填写的api_log*
因为name不能重复,为了演示所以填写的是api*
创建完成之后,点击Discover
接下来我们试试搜索日志,输入:WARN
可以看到日志内容,正是程序中打印的日志。