请求与响应参数日志记录框架

前言

实际开发中,如果项目权限管控比较严格,自己又上不去服务器查看日志文件,怎么办?而且日志文件查看也比较繁琐。就随便搞一个数据库记录请求参数与响应数据的日志框架。方便自己排查问题排查问题。

设计

  1. 使用AOP切面技术,将controller层的入参与出参,还有错误信息输出到数据库表logger_info中。
  2. 配合日志级别,使得如果不需要,则不开启,或者只输出特定级别的操作。
  3. 启动时,创建日志表。不需要手动创建。
  4. 定时备份日志表,减少单表数据量过大。

根据以上内容工程分成设计如下:
在这里插入图片描述

注: 由于整个项目使用的是mybatis-plus框架,所以添加了servicemapper层,可以使用SQL语句替换

正文

1. 日志实体(日志表)

既然是记录,当然是有记录表了,入参,出参,请求,类,方法,IP,执行时间,都是基本记录。所以就有如下的实体设计。

package com.cah.project.module.logger.domain.entity;

import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.time.LocalDate;

@Data
@TableName(LoggerInfoEntity.TABLE_NAME)
@ApiModel("日志信息")
public class LoggerInfoEntity {
   

    public static final String TABLE_NAME = "logger_info";

    @ApiModelProperty("主键ID")
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;

    @ApiModelProperty("访问的url")
    @TableField("url")
    private String url;

    @ApiModelProperty("类名")
    @TableField("class_name")
    private String className;

    @ApiModelProperty("方法名")
    @TableField("method_name")
    private String methodName;

    @ApiModelProperty("请求的ip地址")
    @TableField("req_ip_adr")
    private String reqIpAdr;

    @ApiModelProperty("响应的ip地址(集群提供)")
    @TableField("rsp_ip_adr")
    private String rspIpAdr;

    @ApiModelProperty("成功标志")
    @TableField("success_ind")
    private Boolean successInd;

    @ApiModelProperty("请求报文头")
    @TableField("req_header")
    private String reqHeader;

    @ApiModelProperty("请求报文体")
    @TableField("req_body")
    private String reqBody;

    @ApiModelProperty("响应报文体")
    @TableField("rsp_body")
    private String rspBody;

    @ApiModelProperty("错误信息")
    @TableField("error_msg")
    private String errorMsg;

    @ApiModelProperty("总耗时")
    @TableField("total_time")
    private Long totalTime;

    @ApiModelProperty("创建时间")
    @TableField(value = "create_time", fill = FieldFill.INSERT)
    private LocalDate createTime;

}

2. 日志打印级别

这里自定义日志的打印级别,分别为:不打印,打印正常,打印错误,全部打印。根据自身需要,自行修改就好了。

package com.cah.project.module
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以通过在过滤器中获取请求参数响应结果并打印日志的方式来实现。 在过滤器中,可以通过HttpServletRequest对象获取请求参数,例如: ```java String queryString = request.getQueryString(); // 获取请求参数 ``` 而获取响应结果则需要在HttpServletResponse对象的输出流中进行捕获,例如: ```java // 获取响应输出流 PrintWriter writer = response.getWriter(); // 创建一个新的输出流 PrintWriter newWriter = new PrintWriter(new OutputStreamWriter(writer, "UTF-8"), true); // 将新输出流设置给HttpServletResponse对象 response.setCharacterEncoding("UTF-8"); response.setContentType("application/json;charset=UTF-8"); response.getWriter().write(result); // result为响应结果 // 捕获输出流中的内容 String responseResult = new String(writer.toString().getBytes("UTF-8")); ``` 在获取到请求参数响应结果后,可以通过日志框架(如log4j、slf4j等)将其打印出来,例如: ```java import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class RequestLoggingFilter implements Filter { private static final Logger logger = LoggerFactory.getLogger(RequestLoggingFilter.class); @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest httpRequest = (HttpServletRequest) request; String queryString = httpRequest.getQueryString(); // 获取请求参数 logger.info("Request URL: {}?{}", httpRequest.getRequestURL(), queryString); HttpServletResponse httpResponse = (HttpServletResponse) response; // 获取响应输出流 PrintWriter writer = httpResponse.getWriter(); // 创建一个新的输出流 PrintWriter newWriter = new PrintWriter(new OutputStreamWriter(writer, "UTF-8"), true); // 将新输出流设置给HttpServletResponse对象 httpResponse.setCharacterEncoding("UTF-8"); httpResponse.setContentType("application/json;charset=UTF-8"); // 捕获输出流中的内容 String responseResult = new String(writer.toString().getBytes("UTF-8")); logger.info("Response: {}", responseResult); // 继续执行过滤器链 chain.doFilter(request, response); } @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void destroy() { } } ``` 以上就是在过滤器中实现请求参数响应结果日志打印的方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值