一、介绍
本项目结合Elasticsearch,Logstash,Kibana组成ELK日志系统,Elasticsearch 负责存放日志信息。Logstash 是服务器端数据处理管道,从日志文件中收集,转换数据,然后将数据发送到 Elasticsearch中。Kibana让用户在 Elasticsearch 中使用图形和图表对数据进行可视化。
1.1 流程图
1.2 官网地址
Elastic Stack官方介绍:
https://www.elastic.co/cn/what-is/elk-stack
1.3 软件版本
Elasticsearch、Logstash、Kibana版本:6.8.10
Spring Boot版本:2.1.8
二、环境搭建
环境在400ToJava:109-Elasticsearch介绍基础上进行修改,添加记录日志功能
2.1 配置
2.1.1 项目结构
项目结构与Elasticsearch结构类似,只在resources
目录中添加一个log4j2.xml
文件作为日志记录规则
2.1.2 日志文件配置
pom.xml
文件中移除Spring Boot项目中自带的logback日志记录工具,添加使用更为方便且功能更全面的log4j2
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.8.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>cn.toj</groupId>
<artifactId>esdemo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>esdemo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<!-- 移除logback依赖 -->
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-logging</artifactId>
</exclusion>
</exclusions>
</dependency>
<!-- 添加log4j2依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
<!-- elasticsearch相关依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
log4j2.xml
文件中分别配置
- info
- warn
- error
- test
四个级别的日志文件,当日期发生改变时,通过配置对前一日的日志信息进行压缩保存,使用前需配置FILE_PATH
常量设置保存位置
<?xml version="1.0" encoding="UTF-8"?>
<!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出-->
<!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数-->
<configuration monitorInterval="5">
<!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->
<!--变量配置-->
<Properties>
<!-- 格式化输出:%date表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度 %msg:日志消息,%n是换行符-->
<!-- %logger{36} 表示 Logger 名字最长36个字符 -->
<property name="LOG_PATTERN" value="%date{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n" />
<!-- 定义日志存储的路径 -->
<property name="FILE_PATH" value="D:\work\code\Project\2020.07\Spring\log" />
<property name="FILE_NAME" value="esdemo" />
</Properties>
<appenders>
<console name="Console" target="SYSTEM_OUT">
<!--输出日志的格式-->
<PatternLayout pattern="${LOG_PATTERN}"/>
<!--控制台只输出level及其以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
</console>
<!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,适合临时测试用-->
<File name="Filelog" fileName="${FILE_PATH}/test.log" append="false">
<PatternLayout pattern="${LOG_PATTERN}"/>
</File>
<!-- 这个会打印出所有的info及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
<RollingFile name="RollingFileInfo" fileName="${FILE_PATH}/info.log" filePattern="${FILE_PATH}/${FILE_NAME}-INFO-%d{yyyy-MM-dd}_%i.log.gz">
<!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
<ThresholdFilter level="info" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="${LOG_PATTERN}"/>
<Policies>
<!--interval属性用来指定多久滚动一次,默认是1 hour-->
<TimeBasedTriggeringPolicy interval="1"/>
<SizeBasedTriggeringPolicy size="10MB"/>
</Policies>
<!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件开始覆盖-->
<DefaultRolloverStrategy max="15"/>
</RollingFile>
<!-- 这个会打印出所有的warn及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
<RollingFile name="RollingFileWarn" fileName="${FILE_PATH}/warn.log" filePattern="${FILE_PATH}/${FILE_NAME}-WARN-%d{yyyy-MM-dd}_%i.log.gz">
<!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
<ThresholdFilter level="warn" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="${LOG_PATTERN}"/>
<Policies>
<!--interval属性用来指定多久滚动一次,默认是1 hour-->
<TimeBasedTriggeringPolicy interval="1"/>
<SizeBasedTriggeringPolicy size="10MB"/>
</Policies>
<!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件开始覆盖-->
<DefaultRolloverStrategy max="15"/>
</RollingFile>
<!-- 这个会打印出所有的error及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档-->
<RollingFile name="RollingFileError" fileName="${FILE_PATH}/error.log" filePattern="${FILE_PATH}/${FILE_NAME}-ERROR-%d{yyyy-MM-dd}_%i.log.gz">
<!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch)-->
<ThresholdFilter level="error" onMatch="ACCEPT" onMismatch="DENY"/>
<PatternLayout pattern="${LOG_PATTERN}"/>
<Policies>
<!--interval属性用来指定多久滚动一次,默认是1 hour-->
<TimeBasedTriggeringPolicy interval="1"/>
<SizeBasedTriggeringPolicy size="10MB"/>
</Policies>
<!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件开始覆盖-->
<DefaultRolloverStrategy max="15"/>
</RollingFile>
</appenders>
<!--Logger节点用来单独指定日志的形式,比如要为指定包下的class指定不同的日志级别等。-->
<!--然后定义loggers,只有定义了logger并引入的appender,appender才会生效-->
<loggers>
<!--过滤掉spring和mybatis的一些无用的DEBUG信息-->
<logger name="org.mybatis" level="info" additivity="false">
<AppenderRef ref="Console"/>
</logger>
<!--监控系统信息-->
<!--若是additivity设为false,则 子Logger 只会在自己的appender里输出,而不会在 父Logger 的appender里输出。-->
<Logger name="org.springframework" level="info" additivity="false">
<AppenderRef ref="Console"/>
</Logger>
<root level="info">
<appender-ref ref="Console"/>
<appender-ref ref="Filelog"/>
<appender-ref ref="RollingFileInfo"/>
<appender-ref ref="RollingFileWarn"/>
<appender-ref ref="RollingFileError"/>
</root>
</loggers>
</configuration>
启动项目,目标目录生成日志文件并且前一日的日志文件压缩保存成功
2.1.3 启动Elasticsearch
Elasticsearch在这个ELK日志收集系统中充当的是日志存储容器,Logstash收集日志并进行处理后交给Elasticsearch进行保存,Kibana访问它来获取信息
进入根目录下的bin目录,双击elasticsearch.bat
启动Elasticsearch,访问localhost:9200
,启动成功
{
"name" : "Do0ma2a",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "ns7XjWczTpC7dA2pI3QEtQ",
"version" : {
"number" : "6.8.10",
"build_flavor" : "default",
"build_type" : "zip",
"build_hash" : "537cb22",
"build_date" : "2020-05-28T14:47:19.882936Z",
"build_snapshot" : false,
"lucene_version" : "7.7.3",
"minimum_wire_compatibility_version" : "5.6.0",
"minimum_index_compatibility_version" : "5.0.0"
},
"tagline" : "You Know, for Search"
}
2.1.4 启动Filebeat
Filebeat记录日志位置并传输给Logstash,在根目录下的filebeat.yml
文件中配置日志地址(已省略英文注释)
filebeat.inputs:
- type: log
enabled: true
paths:
# 使用通配符记录所有后缀名为.log的日志
d:\work\code\Project\2020.07\Spring\log\*.log
filebeat.config.modules:
path: ${path.config}/modules.d/*.yml
reload.enabled: false
setup.template.settings:
index.number_of_shards: 3
setup.kibana:
# 传输给Logstash
output.logstash:
hosts: "localhost:5044"
processors:
- add_host_metadata: ~
- add_cloud_metadata: ~
进入根目录,使用Powershell输入命令,启动filebeat
./filebeat -e -c filebeat.yml -d "publish"
2.1.5 启动Logstash
Logstash从Filebeat处接收日志信息,经过处理,按日期传入到Elasticsearch中,每个日期的信息对应一个索引
配置first-pipeline.conf文件,规定输入、处理及输出
- 输入: 从filebeat输入信息
- 处理: 按日期生成Elasticsearch索引
- 输出:输出到Elasticsearch中
input {
beats {
port => "5044"
}
}
filter {
grok {
match => { "message" => "%{COMBINEDAPACHELOG}"}
}
}
output {
elasticsearch {
hosts => [ "localhost:9200" ]
}
}
bin目录下使用Powershell输入命令进行配置验证
./logstash -f first-pipeline.conf --config.test_and_exit
bin目录下使用Powershell输入命令启动Logstash
./logstash -f first-pipeline.conf --config.reload.automatic
2.1.6 启动Kibana
Logstash启动成功后,所有的日志信息通过Logstash已经按照日期存入Elasticsearch,Kibana作为可视化工具对Elasticsearch中存入的数据进行访问和整理,用户可根据需要进行浏览
进入根目录下的bin目录,双击kibana.bat
启动Kibana
启动成功
三、成果展示
ELK架构启动完毕,下面通过对Kibana进行访问来验证日志收集效果
3.1 日志收集
打开localhost:5601
,进入Kibana界面,在左侧选项卡中选择管理,在Elasticsearch中选择索引管理,可以查看到两日生成的日志已存入Elaticsearch中,每一条log对应索引中的一个文档
创建索引
logstash02020-07-31
,查看根据message中包含JVM,查询所日志,可发现5条数据,即当日共启动该程序5次
message:*JVM*
3.2 Demo下载地址
GitHub项目地址:
https://github.com/diyzhang/42j112-ssmmrz-elkdemo使用Git下载项目的命令:
git clone https://github.com/diyzhang/42j112-ssmmrz-elkdemo.git