ELK是Elastic公司的三个组件,三个组件共同配合实现日志收集。
Elasticsearch是实时全文搜索和分析引擎,提供搜集、分析、存储数据三大功能;是一套开放REST和JAVA API等结构提供高效搜索功能,可扩展的分布式系统。它构建于Apache Lucene搜索引擎库之上。
Logstash是一个用来搜集、分析、过滤日志的工具。它支持几乎任何类型的日志,包括系统日志、错误日志和自定义应用程序日志。它可以从许多来源接收日志,这些来源包括 syslog、消息传递(例如 RabbitMQ)和JMX,它能够以多种方式输出数据,包括电子邮件、websockets和Elasticsearch。
Kibana是一个基于Web的图形界面,用于搜索、分析和可视化存储在 Elasticsearch指标中的日志数据。它利用Elasticsearch的REST接口来检索数据,不仅允许用户创建他们自己的数据的定制仪表板视图,还允许他们以特殊的方式查询和过滤数据。
1.1下载logstash
https://www.elastic.co/downloads/logstash
1.2解压logstash的zip压缩包
1.3进入bin目录,新建文件logstash_default.conf
input {
stdin{
}
}
output {
stdout{
}
}
1.4在bin目录下新建文件run_default.bat
1.5 cmd控制台启动logstash
logstash -f logstash_default.conf
1.6在浏览器访问http://localhost:9600/
成功启动logstash
安装elasticsearch7.6和elasticsearch
2.1下载安装elasticsearch
https://www.elastic.co/cn/downloads/elasticsearch
2.2解压es的压缩包
进入bin目录,双击elasticsearch.bat脚本,es便开始安装
2.3打开浏览器,访问http://localhost:9200/
成功启动elasticsearch
2.4安装ElasticSearch5.6.8 Head插件
2.4.1安装nodejs
从https://nodejs.org/en/download/下载msi走安装流程。
2.4.2安装grunt
grunt是一种构建工具,类似于Maven,可以进行打包压缩、测试、执行等等的工作.
head插件就是通过grunt启动的,因此需要安装grunt.
#切换到E:\Node下.
npm install -g grunt-cli
#-g代表全局安装.
2.4.3把head插件从GitHub上clone下来
git clone git://github.com/mobz/elasticsearch-head.git
2.4.4通过elasticsearch.bat启动,访问http://localhost:9100/
3.1点击kibana官网下载,https://www.elastic.co/downloads/kibana
kibana的版本和elasticsearch的版本和必须一致.
3.2进入kibana的bin目录,双击kibana.bat
3.3访问 http://localhost:5601
1. 创建logstash.conf配置文件
在bin目录下创建logstash.conf,文件内容为:
input {
tcp {
mode => "server"
host => "0.0.0.0"
port => 4560
codec => json_lines
}
}
output {
elasticsearch {
hosts => "localhost:9200"
index => "springboot-logstash-%{+YYYY.MM.dd}"
}
}
2. 启动logstash
logstash -f logstash.conf
1. 添加依赖
Pom文件中引入下列依赖
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.1.9.RELEASE</version>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-core</artifactId>
<version>9.0.31</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.1.9.RELEASE</version>
</dependency>
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>6.3</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
</dependency>
2. 创建logback-spring.xml文件
新建一个logback-spring.xml文件,配置logback日志信息,注意这里配置的destination属性,输出的要和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/base.xml"/>
<springProperty scope="context" name="appName" source="spring.application.name"/>
<!-- 日志在工程中的输出位置 -->
<property name="LOG_FILE" value="${BUILD_FOLDER:-build}/${appName}"/>
<!-- 控制台的日志输出样式 -->
<property name="CONSOLE_LOG_PATTERN" value="%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p}) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%15.15t]){faint} %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}}"/>
<!-- 控制台输出 -->
<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>INFO</level>
</filter>
<!-- 日志输出编码 -->
<encoder>
<pattern>${
CONSOLE_LOG_PATTERN}</pattern>
<charset>utf8</charset>
</encoder>
</appender>
<!--logstash配置-->
<appender name="LOGSTASH" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
<destination>127.0.0.1:4560</destination>
<!-- 日志输出编码 -->
<encoder charset="UTF-8" class="net.logstash.logback.encoder.LoggingEventCompositeJsonEncoder">
<providers>
<timestamp>
<timeZone>UTC</timeZone>
</timestamp>
<pattern>
<pattern>
{
"logLevel": "%level",
"serviceName": "${springAppName:-}",
"pid": "${PID:-}",
"thread": "%thread",
"class": "%logger{40}",
"rest": "%message"
}
</pattern>
</pattern>
</providers>
</encoder>
<!--<encoder charset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder"/>-->
</appender>
<root level="INFO">
<appender-ref ref="LOGSTASH"/>
<appender-ref ref="CONSOLE"/>
</root>
</configuration>
3. 创建controller类
package com.skz.boot.controller;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @author Rockey
* @description controller测试类
* @date 2020/3/4 9:41
*/
@Slf4j
@RestController
public class LogController {
@GetMapping("/test")
public String showLog() {
log.info("日志测试。ELK简单实现日志收集");
return "helloWorld";
}
}
4. 创建启动类
package com.skz.boot;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* @author Rockey
* @description 启动类
* @date 2020/3/3 15:20
*/
@SpringBootApplication
public class LogApplication {
public static void main(String[] args) {
SpringApplication.run(LogApplication.class, args);
}
}
运行启动类,启动服务
5. 完整项目结构
6. 测试
6.1在浏览器中执行test请求
6.2kibana中查看索引
打开kibana管理页面,添加刚刚创建的索引:
将springboot-logstash-2020.03.4放入输入框,点击next step
接下来在浏览器多次访问刚刚在项目中输出日志的方法,查询控制台,如下所示
然后在进入kibana查看(点击左侧导航栏第一个标签),可以看到不光是日志内容,还有自定义的属性也显示出来了.
至此,我们在SpringBoot中整合了ELK实现日志的收集。