SpringBoot 整合ApiBoot Logging 实现监控打印接口的请求日志

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: SpringBoot 整合ApiBoot Logging 实现监控打印接口的请求日志

在日常做项目里,不管是本地调试阶段还是线上正式部署运行阶段, 我们常常需要对接口的被调用做一些参数打印,为了更清晰地去联调以及确认数据。


实现这种场景,无疑第一时间想到的就是aop,配合注解的方式使用,这样确实是个好办法,而且还能更加自由地去监控打印请求接口日志,甚至还能加上一些逻辑校验等。

还有一种就是最普通的,用map接收参数,在每个接口都打印下map。


那么这篇教程里面,介绍的是新的一种方案,实现监控打印请求接口日志, 就是整合ApiBoot Logging 。


先看实战项目最后的结构:


image.png


OK,接下来我们直接开始整合:



首先是pom.xml 文件:


<?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 http://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.6.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.demo</groupId>
    <artifactId>elegant</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>elegant</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
        <api.boot.version>2.1.4.RELEASE</api.boot.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.10</version>
        </dependency>
        <!--ApiBoot Logging-->
        <dependency>
            <groupId>org.minbox.framework</groupId>
            <artifactId>api-boot-starter-logging</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <!--ApiBoot统一版本依赖   @EnableLoggingClient等使用-->
        <dependencies>
            <dependency>
                <groupId>org.minbox.framework</groupId>
                <artifactId>api-boot-dependencies</artifactId>
                <type>pom</type>
                <scope>import</scope>
                <version>${api.boot.version}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>


ApiBoot Logging 核心依赖是:


image.png


接下来是application.yml文件:


#配置项目名称
spring:
 application:
   name: ElegantDemo
#配置端口
server:
  port: 8067
#配置ApiBoot Logging 日志组件
api:
  boot:
    logging:
      show-console-log: true
    #实现美化打印请求日志
      format-console-log-json: true


这里有一点需要提醒下, 里面的配置项目名称和端口是有必要的,因为ApiBoot 在监控每次请求的数据输出时,里面包括了项目名称和端口。


然后是在启动类上加上注解 @EnableLoggingClient :


image.png


可以看到这个注解,Client ,客户端,没错,这个其实也有对应的admin端进行日志上报,但是目前实现对接口请求的日志监控打印,我们只需要使用客户端组件即可。

 

接下来,我们来简单编写几个接口,作为测试,LoggingApiTestController.java:


import com.demo.elegant.pojo.Cat;
import org.springframework.web.bind.annotation.*;
import java.util.Map;
/**
 * @Author : JCccc
 * @CreateTime : 2019/11/25
 * @Description :
 **/
@RestController
public class LoggingApiTestController {
    @GetMapping("/testGet1")
    public String testGet1(@RequestParam("name") String name, @RequestParam("age") Integer age) {
        return  "testGet1:  name is "+ name+" and  age is :"+age;
    }
    @GetMapping("/testGet2")
    public String testGet2(@RequestParam  Map paramMap) {
        return  "testGet2:  name is "+ paramMap.get("name")+" and  age is :"+paramMap.get("age");
    }
    @PostMapping("/testPost1")
    public String testPost1(@RequestBody Cat cat) {
        return  "testPost1:  name is "+ cat.getName()+" and  age is :"+cat.getAge();
    }
    @PostMapping("/testPost2")
    public String testPost2(@RequestBody Map paramMap) {
        return  "testPost2:  name is "+ paramMap.get("name")+" and  age is :"+paramMap.get("age");
    }
}


这里其中一个post方法用到了实体类接收参数,顺便也贴一下 Cat.java:


import lombok.Data;
/**
 * @Author : JCccc
 * @CreateTime : 2019/11/25
 * @Description :
 **/
@Data
public class Cat {
    private String name;
    private Integer age;
}


ok,我们用postman先来调用 ‘/testGet1’ 接口:


image.png


可以看到控制台:


image.png


红色框里面正是这次请求的所有数据,都成功监控打印了。


蓝色框是啥呢,就是前面说的admin组件,我们这里不需要用到admin,所以会有提示说这个日志监控报告没有找到对应的admin服务,没有影响,直接无视就好。


其余接口就不一一调用了,效果都是一样的。


如果觉得这个日志打印下来占行数太多了,那么可以在application.yml里面,将json格式化给设置为false,默认不设置也是false:


image.png设置格式化为false:image.png到这里,其实已经完了,但是我个人有点强迫症,我不想看到那个warn日志,所以稍微操作一哈。


那么我这里简单使用下logback日志框架,顺便对日志文件输出都进行统一性管理:


新建logback.xml,直接放到resources文件夹下(一般的项目想整合logback框架,基本保留这份xml就够用了,拿来即用):


<?xml version="1.0" encoding="UTF-8"?>
<configuration scan="true">
    <!-- 从application.yml 中注入变量  -->
    <!-- <springProperty scope="context" name="LOG_PATH" source="log.home"/> -->
    <!-- <springProperty scope="context" name="APPDIR" source="spring.application.name"/> -->
    <property name="LOG_PATH" value="./logs"/>
    <property name="APPDIR" value="elegant"/>
<!--    <property name="LOG_PATH" value="/usr/java/apache-tomcat-8.5.47"/>-->
<!--    <property name="APPDIR" value="dashboardLog"/>-->
    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>1-%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger - %msg%n</pattern>
            <charset>GBK</charset>
        </encoder>
    </appender>
    <!-- error级别日志文件输出,按日期时间滚动记录输出 -->
    <appender name="FILEERROR" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_PATH}/${APPDIR}/log_error.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_PATH}/${APPDIR}/error/log-error-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>500MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <append>true</append>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger Line:%-3L - %msg%n</pattern>
            <charset>utf-8</charset>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>error</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
    <!-- warn级别日志文件输出,按日期时间滚动记录输出 -->
    <appender name="FILEWARN" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_PATH}/${APPDIR}/log_warn.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_PATH}/${APPDIR}/warn/log-warn-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>2MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <append>true</append>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger Line:%-3L - %msg%n</pattern>
            <charset>utf-8</charset>        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>warn</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
    <!-- info级别日志文件输出,按日期时间滚动记录输出 -->
    <appender name="FILEINFO" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOG_PATH}/${APPDIR}/log_info.log</file>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_PATH}/${APPDIR}/info/log-info-%d{yyyy-MM-dd}.%i.log</fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>2MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
        <append>true</append>
        <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger Line:%-3L - %msg%n</pattern>
            <charset>utf-8</charset>
        </encoder>
        <filter class="ch.qos.logback.classic.filter.LevelFilter">
            <level>info</level>
            <onMatch>ACCEPT</onMatch>
            <onMismatch>DENY</onMismatch>
        </filter>
    </appender>
    <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
        <encoder>
            <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %-5level %logger Line:%-3L - %msg%n</pattern>
        </encoder>
    </appender>
    <!--设置为OFF,即屏蔽; 留下sqltiming作为INFO级别输出-->
<!--    <logger name="jdbc.connection" level="OFF"/>-->
<!--    <logger name="jdbc.resultset" level="OFF"/>-->
<!--    <logger name="jdbc.resultsettable" level="OFF"/>-->
<!--    <logger name="jdbc.audit" level="OFF"/>-->
<!--    <logger name="jdbc.sqltiming" level="OFF"/>-->
<!--    <logger name="jdbc.sqlonly" level="INFO"/>-->
    <!--设置为OFF,即屏蔽-->
    <logger name="org.minbox.framework.logging.client.admin.report.support.LoggingAdminReportSupport" level="OFF"/>
    <!--设置日志打印级别为INFO-->
    <root level="INFO">
        <appender-ref ref="CONSOLE"/>
        <appender-ref ref="FILEINFO"/>
        <appender-ref ref="FILEWARN"/>
        <appender-ref ref="FILEERROR"/>
    </root>
</configuration>

这里面包括配置各种等级日志的打印,生成日志文件,配置文件生成路径,以及个性化屏蔽等,有兴趣可以看看我的注释。

 

其中,我将那个可有可无的warn给直接屏蔽了,


image.png


那么我们重新启动下项目,再调用下接口:


image.png


再看看控制台的输出:


image.png


OK,很满意。


顺带,日志文件也照常输出,而且还能根据日志滚动输出等:


image.png


好,这篇教程就到这吧。

相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
相关文章
|
3月前
|
SQL 监控 druid
springboot-druid数据源的配置方式及配置后台监控-自定义和导入stater(推荐-简单方便使用)两种方式配置druid数据源
这篇文章介绍了如何在Spring Boot项目中配置和监控Druid数据源,包括自定义配置和使用Spring Boot Starter两种方法。
|
18天前
|
Prometheus 监控 Java
如何全面监控所有的 Spring Boot 微服务
如何全面监控所有的 Spring Boot 微服务
32 3
|
2月前
|
监控 Dubbo Java
dubbo学习三:springboot整合dubbo+zookeeper,并使用dubbo管理界面监控服务是否注册到zookeeper上。
这篇文章详细介绍了如何将Spring Boot与Dubbo和Zookeeper整合,并通过Dubbo管理界面监控服务注册情况。
149 0
dubbo学习三:springboot整合dubbo+zookeeper,并使用dubbo管理界面监控服务是否注册到zookeeper上。
|
2月前
|
存储 监控 固态存储
如何监控和优化 WAL 日志文件的存储空间使用?
如何监控和优化 WAL 日志文件的存储空间使用?
|
2月前
|
监控 网络协议 CDN
阿里云国际监控查询流量、用量查询流量与日志统计流量有差异?
阿里云国际监控查询流量、用量查询流量与日志统计流量有差异?
消息中间件 缓存 监控
143 0
logging 日志 模块
logging 日志 模块
|
3月前
|
运维 Kubernetes 监控
Loki+Promtail+Grafana监控K8s日志
综上,Loki+Promtail+Grafana 监控组合对于在 K8s 环境中优化日志管理至关重要,它不仅提供了强大且易于扩展的日志收集与汇总工具,还有可视化这些日志的能力。通过有效地使用这套工具,可以显著地提高对应用的运维监控能力和故障诊断效率。
372 0
|
4月前
|
Java Spring 监控
Spring Boot Actuator:守护你的应用心跳,让监控变得触手可及!
【8月更文挑战第31天】Spring Boot Actuator 是 Spring Boot 框架的核心模块之一,提供了生产就绪的特性,用于监控和管理 Spring Boot 应用程序。通过 Actuator,开发者可以轻松访问应用内部状态、执行健康检查、收集度量指标等。启用 Actuator 需在 `pom.xml` 中添加 `spring-boot-starter-actuator` 依赖,并通过配置文件调整端点暴露和安全性。Actuator 还支持与外部监控工具(如 Prometheus)集成,实现全面的应用性能监控。正确配置 Actuator 可显著提升应用的稳定性和安全性。
161 0
|
4月前
|
SQL 数据库 Java
Hibernate 日志记录竟藏着这些秘密?快来一探究竟,解锁调试与监控最佳实践
【8月更文挑战第31天】在软件开发中,日志记录对调试和监控至关重要。使用持久化框架 Hibernate 时,合理配置日志可帮助理解其内部机制并优化性能。首先,需选择合适的日志框架,如 Log4j 或 Logback,并配置日志级别;理解 Hibernate 的多级日志,如 DEBUG 和 ERROR,以适应不同开发阶段需求;利用 Hibernate 统计功能监测数据库交互情况;记录自定义日志以跟踪业务逻辑;定期审查和清理日志避免占用过多磁盘空间。综上,有效日志记录能显著提升 Hibernate 应用的性能和稳定性。
54 0