SpringMVC 集成 ELK 搭建日志收集服务器
概述
日志系统中的收集、查询、显示,分别对应于Logstash、Elasticsearch、Kibana。
- Logstash:是一个应用程序日志、事件的传输、处理、管理和搜索的平台
- Elasticsearch:是基于 lucene 的开源搜索引擎
- Kibana:是一个功能强大的 elasticsearch 数据显示客户端
SpingMVC 中的日志收集流程是: SpringMVC 输出日志 -> Logstash 收集 -> Elasticsearch 持久化 -> Kibana 展示
环境
本文的 ELK 都是安装在虚拟机中,为了解释方便,假设虚拟机 ip 地址为 192.168.1.199,下载好的压缩包全部放在 /opt 中,并使用 root 用户登录虚拟机。
配置 Elasticsearch
进入 /opt 目录:
1# 解压 Elasticsearch
2tar -xzvf elasticsearch-5.2.2.tar.gz
3# 重命名
4mv elasticsearch-5.2.2 elasticsearch
修改配置文件,修改主机名称为本机 ip 地址 network.host: 192.168.1.199,这样外部才能通过 ip 地址访问:
1vim elasticsearch/config/elasticsearch.yml
Elasticsearch 不能使用 root 用户启动,因此需要添加新的用户:
1useradd -r -m -s /bin/bash elk # elk 为用户名称
2# 分配权限
3chown -R elk /opt
启动:
1su elk
2elasticsearch/bin/elasticsearch
访问 http://192.168.1.199:9200/ 验证是否正确启动,如果遇到问题可以参考这篇文章:
配置 Kibana
进入 /opt 目录:
1# 解压 配置 Kibana
2tar -xzvf kibana-5.2.2.tar.gz
3# 重命名
4mv kibana-5.2.2 kibana
修改配置文件 kibana/config/kibana.yml ,在最后添加:
1server.port: 8888
2server.host: "192.168.1.199"
3elasticsearch.url: "http://192.168.1.199:9200"
访问 http://192.168.1.199:8888 验证是否正确启动
配置 Logstash
进入 /opt 目录:
1# 解压 配置 Logstash
2tar -xzvf logstash-5.2.2.tar.gz
3# 重命名
4mv logstash-5.2.2 logstash
新建配置文件:
1vim logstash/config/logstash-test.conf
添加内容:
input {
tcp {
host => "192.168.1.199"
port => 8082
mode => "server"
ssl_enable => false
codec => json {
charset => "UTF-8"
}
}
}
output {
elasticsearch {
hosts => "192.168.1.199:9200"
index => "logstash-test"
}
stdout { }
}
表示从 192.168.1.199:8082 收集日志,并发送到 Elasticsearch (192.168.1.199:9200),索引名称为 logstash-test。 启动 Logstash:
1# 进入 Logstash 目录
2cd logstash
3./bin/logstash -f config/logstash-test.conf
启动后,Logstash 会持续监听指定的收集端,我们只需要在程序中把日志发送到 192.168.1.199:8082 即可。
SpringMVC 中配置 logback
添加 maven 依赖:
1 <!-- logback -->
2 <dependency>
3 <groupId>net.logstash.logback</groupId>
4 <artifactId>logstash-logback-encoder</artifactId>
5 <version>4.11</version>
6 </dependency>
7 <dependency>
8 <groupId>ch.qos.logback</groupId>
9 <artifactId>logback-classic</artifactId>
10 <version>1.2.3</version>
11 </dependency>
12 <dependency>
13 <groupId>net.logstash.log4j</groupId>
14 <artifactId>jsonevent-layout</artifactId>
15 <version>1.7</version>
16 </dependency>
在 resource 文件夹中添加配置文件 logback.xml:
1<?xml version="1.0" encoding="UTF-8"?>
2<configuration debug="false">
3
4 <!--定义日志文件的存储地址 勿在 LogBack 的配置中使用相对路径-->
5 <property name="LOG_HOME" value="E:/logs"/>
6
7 <!-- 控制台输出 -->
8 <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
9 <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
10 <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
11 <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
12 </encoder>
13 </appender>
14
15 <!-- 按照每天生成日志文件 -->
16 <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
17 <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
18 <!--日志文件输出的文件名-->
19 <FileNamePattern>${LOG_HOME}/TestWeb.log_%d{yyyy-MM-dd}.log</FileNamePattern>
20 <!--日志文件保留天数-->
21 <MaxHistory>30</MaxHistory>
22 </rollingPolicy>
23 <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
24 <!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
25 <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} - %msg%n</pattern>
26 </encoder>
27 <!--日志文件最大的大小-->
28 <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
29 <MaxFileSize>10MB</MaxFileSize>
30 </triggeringPolicy>
31 </appender>
32
33 <!-- 发送日志到 logstash -->
34 <appender name="stash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
35 <destination>192.168.1.199:8082</destination>
36 <!-- encoder is required -->
37 <encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder"/>
38 </appender>
39
40 <!-- 日志输出级别 -->
41 <root level="INFO">
42 <!-- 只有添加stash关联才会被收集-->
43 <appender-ref ref="stash"/>
44 <appender-ref ref="STDOUT"/>
45 <appender-ref ref="FILE"/>
46 </root>
47
48</configuration>
关键是 stash,只有添加了这个 appender,才能把日志发送给 Logstash。
代码中输出日志
代码中使用 slf4j 获取日志对象,就可以打印日志:
1import org.slf4j.Logger;
2import org.slf4j.LoggerFactory;
3
4private static Logger log = LoggerFactory.getLogger(Test.class);
最后
以上就是 SpringMVC 集成 ELK 的全部操作,输出日志后,刷新 Kibana 页面,就会看到日志信息。
