下载ELK+Filebeat
ElasticSearch:https://www.elastic.co/cn/downloads/elasticsearch
Logstash:https://www.elastic.co/cn/downloads/logstash
Kibana:https://www.elastic.co/cn/downloads/kibana
Filebeat:https://www.elastic.co/cn/downloads/beats/filebeat
ElasticSearch
- 解压zip文件;
- 进入config文件夹,可以看见elasticsearch-plugins.example.yml文件,这个文件是官方给出的配置文件的一个示例,我们需要根据这个文件创建一个自己的配置文件;
- 创建elasticsearch.yml文件,配置以下内容:
xpack.security.enabled: false
xpack.security.enrollment.enabled: false
xpack.security.http.ssl:
enabled: false # 注意这里改成false
keystore.path: certs/http.p12
xpack.security.transport.ssl:
enabled: true
verification_mode: certificate
keystore.path: certs/transport.p12
truststore.path: certs/transport.p12
cluster.initial_master_nodes: ["xxxxxx"] # xxxxxx表示集群节点的名字
http.host: 0.0.0.0
http.cors.enabled: true # 跨域配置
http.cors.allow-origin: "*"
- 保存并退出;
- 进入到bin目录下,这个目录下的elasticsearch.bat就是我们需要执行的脚本文件,可以直接双击运行;也可以通过cmd命令运行:
elasticsearch.bat
- ElasticSearch的默认端口为9200,启动后访问localhost:9200即可查看是否启动成功。
Logstash
- 解压zip文件;
- 进入config文件夹,可以看见logstash-sample.conf文件,这个文件是官方给出的配置文件的一个示例,我们需要根据这个文件创建一个自己的配置文件;
- 创建logstash.conf文件,配置以下内容:
input {
beats {
port => 4560 # 记住这个端口,一会需要在filebeat里面配置
}
}
output {
stdout{ codec => rubydebug { metadata => true }}
elasticsearch { # 输出到es中
hosts => ["localhost:9200"]
index => "elk-demo-%{+YYYY.MM.dd}" # 注册到es中的数据视图名字
}
}
- 保存并退出;
- 进入到bin目录下,在当前路径下打开cmd窗口,运行以下命令:
logstash -f ./config/logstash.conf
- logstash默认端口是9600,启动后访问localhost:9600即可查看是否启动成功。
kibana
- 解压zip文件;
- 进入到bin目录下,这个目录下的kibana.bat就是我们需要执行的脚本文件,可以直接双击运行;也可以通过cmd命令运行;
- kibana默认端口是5601,启动后访问localhost:5601即可查看是否启动成功。
filebeat
- 解压zip文件;
- filebeat.yml文件即是配置文件,修改此文件:
filebeat.inputs:
- type: log
enabled: true # 是否开启日志收集 如果为false则不收集
paths: # 需要监控的文件路径 可配置多个
- D:\elk\logs\warn\*.log
- D:\elk\logs\info\*.log
- D:\elk\logs\error\*.log
- D:\elk\logs\*.log
multiline: # 对收集到的日志格式进行调整
pattern: '^\d{4}-\d{1,2}-\d{1,2}'
negate: true
match: after
tail_files: true # filebeat默认读取log文件会一次性从头读取所有数据,当读取文件持续更新时,每次从头读取会重复读取以前的历史数据。tail_files配置项只保证第一次读取时从文件末尾开始,不读首行内容
output.logstash:
hosts: ["localhost:4560"] # logstash中配置的端口
- 保存并退出;
- 通过命令启动filebeat
.\filebeat -e -c filebeat.yml
搭建SpringBoot项目
- 引入相关依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.3.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- logback -->
<dependency>
<groupId>net.logstash.logback</groupId>
<artifactId>logstash-logback-encoder</artifactId>
<version>6.3</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-core</artifactId>
<version>1.2.3</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.35</version>
</dependency>
</dependencies>
- 配置logback.xml文件
<configuration>
<timestamp key="bySecond" datePattern="yyyy-MM-dd'T'HH:mm:ss"/>
<!-- 日志目录 -->
<property name="LOG_HOME" value="D:/elk/logs"/>
<appender name="INFO_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!--
返回DENY,日志将立即被抛弃不再经过其他过滤器;
返回NEUTRAL,有序列表里的下个过滤器接着处理日志;
返回ACCEPT,日志会被立即处理,不再经过剩余过滤器
-->
<level>INFO</level>
<onMatch>NEUTRAL</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<!-- 按照每天生成日志文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件输出名 -->
<fileNamePattern>${LOG_HOME}/info/%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志保留天数 -->
<MaxHistory>7</MaxHistory>
<totalSizeCap>10GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>[%d][%-5level][%thread][%logger][%X{TRACE_ID}][%msg]%n</pattern>
</encoder>
</appender>
<appender name="WARN_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!--
返回DENY,日志将立即被抛弃不再经过其他过滤器;
返回NEUTRAL,有序列表里的下个过滤器接着处理日志;
返回ACCEPT,日志会被立即处理,不再经过剩余过滤器
-->
<level>WARN</level>
<onMatch>NEUTRAL</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<!-- 按照每天生成日志文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件输出名 -->
<fileNamePattern>${LOG_HOME}/warn/%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志保留天数 -->
<MaxHistory>7</MaxHistory>
<totalSizeCap>10GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>[%d][%-5level][%thread][%logger][%X{TRACE_ID}][%msg]%n</pattern>
</encoder>
</appender>
<appender name="ERROR_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.LevelFilter">
<!--
返回DENY,日志将立即被抛弃不再经过其他过滤器;
返回NEUTRAL,有序列表里的下个过滤器接着处理日志;
返回ACCEPT,日志会被立即处理,不再经过剩余过滤器
-->
<level>ERROR</level>
<onMatch>NEUTRAL</onMatch>
<onMismatch>DENY</onMismatch>
</filter>
<!-- 按照每天生成日志文件 -->
<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<!-- 日志文件输出名 -->
<fileNamePattern>${LOG_HOME}/error/%d{yyyy-MM-dd}.log</fileNamePattern>
<!-- 日志保留天数 -->
<MaxHistory>7</MaxHistory>
<totalSizeCap>10GB</totalSizeCap>
</rollingPolicy>
<encoder>
<pattern>[%d][%-5level][%thread][%logger][%X{TRACE_ID}][%msg]%n</pattern>
</encoder>
</appender>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>[%d][%-5level][%thread][%logger][%X{TRACE_ID}][%msg]%n</pattern>
</encoder>
</appender>
<!-- 仅针对这个Controller收集日志 -->
<logger name="org.example.controller.ElkController">
<appender-ref ref="INFO_FILE"/>
<appender-ref ref="WARN_FILE"/>
<appender-ref ref="ERROR_FILE"/>
</logger>
<root level="INFO">
<appender-ref ref="STDOUT"/>
</root>
</configuration>
- 将logback.xml配置到application.yml文件中
logging:
config: classpath:logback.xml
- 创建ElkController
@RestController
@Slf4j
@RequestMapping("/elk")
public class ElkController {
private final static Logger logger = LoggerFactory.getLogger(ElkController.class);
private final String LoggerTemplate = "code:{},msg:{},param:{}";
@GetMapping("/logs")
public R testLogs(){
logger.warn("这是一条warn测试"); // 这条记录会在warn文件夹下
logger.info("这是一条info测试"); // 这条记录会在info文件夹下
try {
int i = 5 / 0;
}catch (Exception e){
logger.error(LoggerTemplate,200,"这是一条error测试",e); // 这条记录会在error文件夹下
}
return R.ok("200","操作成功");
}
}
- 运行该项目,并通过postman发请求后,在日志存放的路径下就可以看见收集到的日志:
- 进入到kibana中配置数据视图
然后保存 - 到discover中查看收集到的日志