SpringBoot整合ELK做日志(超完整)(下)

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: SpringBoot整合ELK做日志(超完整)(下)

安装Logstash

我准备将Logstash安装在 /opt/server 文件夹下,我们已经创建了这个文件夹,所以直接解压文件(注意切换到root用户):

# 注意执行前使用 Ctrl + D 退出 elk 用户并使用root用户运行
# 来到安转包存放目录
cd /usr/local/src/
# 解压文件到指定文件夹
tar -zxvf logstash-7.17.7-linux-x86_64.tar.gz -C /opt/server/

同样来到 /opt/server 文件夹下,将 logstash-7.17.7 文件夹以及下面的文件的所有权授予给 elk:

cd /opt/server/
chown elk:elk -R logstash-7.17.7/

执行结果:

同样我们需要修改一下 config/logstash.yml 配置文件,需要修改的内容:

# 节点的名称,取一个好听的名字(需要取消注释)
node.name: test-log
# pipeline 配置文件的路径,可自行修改,最好是空文件夹(需要取消注释)
path.config: /opt/server/logstash-7.17.7/config/conf/*.conf

同样为了避免内存不足的问题,我们需要修改一下 config/jvm.options 配置文件,在文件中添加这几行代码(参数可以根据自己的内存大小自行修改):

-Xms256m
-Xmx256m
-Xmn128m

加上后如图:

然后我们再到我们上面 path.config 后面配置的文件夹(我配置的文件夹是/opt/server/logstash-7.17.7/config/conf/)中创建一个 test-log.conf 文件,文件内容为:

input {
  tcp {
    mode => "server"
    port => 4560
  }
}
filter {}
output {
  elasticsearch {
    action => "index"
    hosts  => ["192.168.3.233:9200"]
    index  => "test-log"
  }
}

文件中包含了以下几个模块:

  • input:日志的输出来源,我们将暴露一个4560端口接收来自SpringBoot的日志
  • filter:日志的过滤器,暂时不配置
  • output:日志的输出目的地,我们将日志输出到elasticsearch中进行保存,如果有多个es可以在中括号当中填写多个,以逗号隔开,其中index配置的test-log即为存储日志用到的索引名称,可自行修改

然后我们切换到elk用户去启动logstash:

cd logstash-7.17.7/
su elk
bin/logstash

看到这两个输出内容代表Logstash启动成功:

我们可以按照上面的方法将Logstash转换为后台运行:

nohup bin/logstash >> /dev/null &

编写SpringBoot项目

到现在为止我们已经完成了服务端的搭建,现在我们开始编写SpringBoot项目去整合到ELK当中

初始化SpringBoot项目

我们去到 https://start.spring.io/ 初始化一个SpringBoot项目,相信你们会操作这里就不再过多赘述:

修改代码

将项目导入到idea或则其他的开发工具,并在 pom.xml 里面多添加一个 logback 整合 logstash 的依赖:

<dependency>
    <groupId>net.logstash.logback</groupId>
    <artifactId>logstash-logback-encoder</artifactId>
    <version>7.3</version>
</dependency>

如图:

然后我们来到 application.yaml 文件中添加下面几个配置:

server:
  port: 8080
log:
  # logstash 地址和端口,注意修改
  logstash-host: 192.168.3.233:4560

接下来我们在 resources 目录下创建一个 logback-spring.xml 配置文件,其中的内容为:

<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true" scanPeriod="60 seconds" debug="false">
    <!-- 日志存放路径 -->
    <property name="log.path" value="logs/test-log"/>
    <!-- 日志输出格式 -->
    <property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n"/>
    <!-- 读取SpringBoot配置文件获取logstash的地址和端口 -->
    <springProperty scope="context" name="logstash-host" source="log.logstash-host"/>
    <!-- 控制台输出 -->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>${log.pattern}</pattern>
        </encoder>
    </appender>
    <!-- 系统日志输出 -->
    <appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}/info.log</file>
        <!-- 循环政策:基于时间创建日志文件 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 日志文件名格式 -->
            <fileNamePattern>${log.path}/info.%d{yyyy-MM-dd}.log</fileNamePattern>
            <!-- 日志最大的历史 7天 -->
            <maxHistory>7</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${log.pattern}</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!-- 过滤的级别 -->
            <level>INFO</level>
            <!-- 匹配时的操作:接收(记录) -->
            <onMatch>ACCEPT</onMatch>
            <!-- 不匹配时的操作:拒绝(不记录) -->
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
    <appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${log.path}/error.log</file>
        <!-- 循环政策:基于时间创建日志文件 -->
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- 日志文件名格式 -->
            <fileNamePattern>${log.path}/error.%d{yyyy-MM-dd}.log</fileNamePattern>
            <!-- 日志最大的历史 60天 -->
            <maxHistory>60</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>${log.pattern}</pattern>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <!-- 过滤的级别 -->
            <level>ERROR</level>
            <!-- 匹配时的操作:接收(记录) -->
            <onMatch>ACCEPT</onMatch>
            <!-- 不匹配时的操作:拒绝(不记录) -->
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
    <!-- 将日志文件输出到Logstash -->
    <appender name="logstash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
        <!-- 获取logstash地址作为输出的目的地 -->
        <destination>${logstash-host}</destination>
        <encoder chatset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder"/>
    </appender>
    <!-- 系统模块日志级别控制  -->
    <logger name="com.greateme" level="info"/>
    <!-- Spring日志级别控制  -->
    <logger name="org.springframework" level="warn"/>
    <root level="info">
        <appender-ref ref="console"/>
    </root>
    <!--系统操作日志-->
    <root level="info">
        <appender-ref ref="file_info"/>
        <appender-ref ref="file_error"/>
        <appender-ref ref="logstash"/>
    </root>
</configuration>

重点讲讲下面几行代码

<!-- 读取SpringBoot配置文件获取logstash的地址和端口 -->
<springProperty scope="context" name="logstash-host" source="log.logstash-host"/>

这一行代码是用于读取 application.yaml 配置文件中的 log.logstash-host 属性,然后生成一个 logback 的属性,用于输出日志所用

<!-- 将日志文件输出到Logstash -->
<appender name="logstash" class="net.logstash.logback.appender.LogstashTcpSocketAppender">
    <!-- 获取logstash地址作为输出的目的地 -->
    <destination>${logstash-host}</destination>
    <encoder chatset="UTF-8" class="net.logstash.logback.encoder.LogstashEncoder"/>
</appender>

这几行代码就是配置输出日志到logstash的代码

编写Controller

我们来创建一个Controller来测试输出一些日志:

TestLogController.java

package com.greateme.log.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/**
 * <p>
 * 测试日志的Controller
 * </p>
 *
 * @author XiaoHH
 * @version 1.0.0
 * @date 2023-04-26 22:59:13
 * @file TestLogController.java
 */
@RestController
public class TestLogController {
    /**
     * 获取日志输出对象
     */
    private static final Logger log = LoggerFactory.getLogger(TestLogController.class);
    /**
     * 测试输出log的访问方法
     */
    @GetMapping("/testLog")
    public String testLog() {
        log.error("测试输出一个日志");
        return "success";
    }
}

编写完成后项目的目录结构为:

我们来启动项目,我们可以发现启动时就输出了八条日志:

我们来到kibana查询一下索引列表:

然后再看看里面的数据,发现的确新增了8条内容:

我们编写了一个Controller也会输出日志,我们访问试试:

上面日志输出成功了,我们再来看看es里面的数据:

同时也可以看到日志的内容可以看到我们自定义输出的日志:

代码仓库地址:

https://gitcode.net/m0_51510236/test-log

好了SpringBoot整合ELK就整合完毕了,以后再也不要一台台服务器登陆上去查看日志了,祝你们编码开心!

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
2月前
|
存储 消息中间件 网络协议
日志平台-ELK实操系列(一)
日志平台-ELK实操系列(一)
|
2天前
|
存储 监控 安全
|
4天前
|
JSON Java 数据库
SpringBoot项目使用AOP及自定义注解保存操作日志
SpringBoot项目使用AOP及自定义注解保存操作日志
20 1
|
26天前
|
Java Maven Spring
SpringBoot日志整合
SpringBoot日志整合
16 2
|
1月前
|
数据采集 监控 Java
SpringBoot日志全方位超详细手把手教程,零基础可学习 日志如何配置及SLF4J的使用......
本文是关于SpringBoot日志的详细教程,涵盖日志的定义、用途、SLF4J框架的使用、日志级别、持久化、文件分割及格式配置等内容。
76 0
SpringBoot日志全方位超详细手把手教程,零基础可学习 日志如何配置及SLF4J的使用......
|
25天前
|
SQL XML 监控
SpringBoot框架日志详解
本文详细介绍了日志系统的重要性及其在不同环境下的配置方法。日志用于记录系统运行时的问题,确保服务的可靠性。文章解释了各种日志级别(如 info、warn、error 等)的作用,并介绍了常用的日志框架如 SLF4J 和 Logback。此外,还说明了如何在 SpringBoot 中配置日志输出路径及日志级别,包括控制台输出与文件输出的具体设置方法。通过这些配置,开发者能够更好地管理和调试应用程序。
|
2月前
|
运维 NoSQL Java
SpringBoot接入轻量级分布式日志框架GrayLog技术分享
在当今的软件开发环境中,日志管理扮演着至关重要的角色,尤其是在微服务架构下,分布式日志的统一收集、分析和展示成为了开发者和运维人员必须面对的问题。GrayLog作为一个轻量级的分布式日志框架,以其简洁、高效和易部署的特性,逐渐受到广大开发者的青睐。本文将详细介绍如何在SpringBoot项目中接入GrayLog,以实现日志的集中管理和分析。
197 1
|
26天前
|
XML JSON Java
Logback 与 log4j2 性能对比:谁才是日志框架的性能王者?
【10月更文挑战第5天】在Java开发中,日志框架是不可或缺的工具,它们帮助我们记录系统运行时的信息、警告和错误,对于开发人员来说至关重要。在众多日志框架中,Logback和log4j2以其卓越的性能和丰富的功能脱颖而出,成为开发者们的首选。本文将深入探讨Logback与log4j2在性能方面的对比,通过详细的分析和实例,帮助大家理解两者之间的性能差异,以便在实际项目中做出更明智的选择。
165 3
|
26天前
|
存储 缓存 关系型数据库
MySQL事务日志-Redo Log工作原理分析
事务的隔离性和原子性分别通过锁和事务日志实现,而持久性则依赖于事务日志中的`Redo Log`。在MySQL中,`Redo Log`确保已提交事务的数据能持久保存,即使系统崩溃也能通过重做日志恢复数据。其工作原理是记录数据在内存中的更改,待事务提交时写入磁盘。此外,`Redo Log`采用简单的物理日志格式和高效的顺序IO,确保快速提交。通过不同的落盘策略,可在性能和安全性之间做出权衡。
1601 14
|
21天前
|
Python
log日志学习
【10月更文挑战第9天】 python处理log打印模块log的使用和介绍
20 0