feat: 增加日志存储功能

1. 将日志记录到文件中,按日期和大小滚动生成;
2. 记录http请求和响应信息,不记录请求体和响应体。
This commit is contained in:
曹鹏飞 2024-04-03 17:33:37 +08:00
parent 03803e85ba
commit c915a629bb
7 changed files with 122 additions and 9 deletions

1
.gitignore vendored
View File

@ -1,2 +1,3 @@
target
.idea
logs

View File

@ -1,4 +1,4 @@
#nacos.server-addr=114.132.64.230:8123
nacos.server-addr=192.168.0.194:8848
logging.config=classpath:logback-sit.xml

View File

@ -11,3 +11,4 @@ spring.redis.lettuce.pool.max-active=8
spring.redis.lettuce.pool.max-idle=8
spring.redis.lettuce.pool.min-idle=0
logging.config=classpath:logback-prod.xml

View File

@ -13,4 +13,4 @@ spring.redis.lettuce.pool.max-active=8
spring.redis.lettuce.pool.max-idle=8
spring.redis.lettuce.pool.min-idle=0
logging.level.root=DEBUG
logging.config=classpath:logback-sit.xml

View File

@ -0,0 +1,46 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true" scan="true" scanPeriod="30 seconds">
<!--定义日志文件的存储地址 -->
<Property name="logDir" value="./logs" />
<Property name="splitSize" value="50MB" />
<!-- 控制台日志, 控制台输出 -->
<appender name="Console" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder" charset="UTF-8">
<!--格式化输出:%d表示日期%thread表示线程名%-5level级别从左显示5个字符宽度,%logger:显示类名 %msg日志消息%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %X{traceId} [%thread] %-5level %logger{10} %msg%n</pattern>
</encoder>
</appender>
<!-- 固定窗口滚动策略的日志输出 -->
<appender name="RollingFileAll" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>debug</level>
</filter>
<file>${logDir}/nflg-bom-new.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- 按日期滚动,每天生成一个文件 -->
<fileNamePattern>${logDir}/%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<!-- 保留15天的日志 -->
<maxHistory>15</maxHistory>
<!-- 启动时,是否删除旧的日志文件 -->
<cleanHistoryOnStart>true</cleanHistoryOnStart>
<!-- 单天单个日志最大size -->
<maxFileSize>${splitSize}</maxFileSize>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder" charset="UTF-8">
<!--格式化输出:%d表示日期%thread表示线程名%-5level级别从左显示5个字符宽度%logger:显示类名 %msg日志消息%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %X{traceId} [%thread] %-5level %logger{50} %msg%n</pattern>
</encoder>
</appender>
<!-- 忽略Nacos服务器的INFO日志 -->
<logger name="com.alibaba.nacos" level="WARN" />
<!-- 日志输出级别 -->
<root level="INFO">
<appender-ref ref="Console" />
<appender-ref ref="RollingFileAll" />
</root>
</configuration>

View File

@ -0,0 +1,46 @@
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="true" scan="true" scanPeriod="30 seconds">
<!--定义日志文件的存储地址 -->
<Property name="logDir" value="./logs" />
<Property name="splitSize" value="50MB" />
<!-- 控制台日志, 控制台输出 -->
<appender name="Console" class="ch.qos.logback.core.ConsoleAppender">
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder" charset="UTF-8">
<!--格式化输出:%d表示日期%thread表示线程名%-5level级别从左显示5个字符宽度,%logger:显示类名 %msg日志消息%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %X{traceId} [%thread] %-5level %logger{10} %msg%n</pattern>
</encoder>
</appender>
<!-- 固定窗口滚动策略的日志输出 -->
<appender name="RollingFileAll" class="ch.qos.logback.core.rolling.RollingFileAppender">
<filter class="ch.qos.logback.classic.filter.ThresholdFilter">
<level>debug</level>
</filter>
<file>${logDir}/nflg-bom-new.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- 按日期滚动,每天生成一个文件 -->
<fileNamePattern>${logDir}/%d{yyyy-MM-dd}.%i.log</fileNamePattern>
<!-- 保留15天的日志 -->
<maxHistory>15</maxHistory>
<!-- 启动时,是否删除旧的日志文件 -->
<cleanHistoryOnStart>true</cleanHistoryOnStart>
<!-- 单天单个日志最大size -->
<maxFileSize>${splitSize}</maxFileSize>
</rollingPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder" charset="UTF-8">
<!--格式化输出:%d表示日期%thread表示线程名%-5level级别从左显示5个字符宽度%logger:显示类名 %msg日志消息%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %X{traceId} [%thread] %-5level %logger{50} %msg%n</pattern>
</encoder>
</appender>
<!-- 忽略Nacos服务器的INFO日志 -->
<logger name="com.alibaba.nacos" level="WARN" />
<!-- 日志输出级别 -->
<root level="TRACE">
<appender-ref ref="Console" />
<appender-ref ref="RollingFileAll" />
</root>
</configuration>

View File

@ -1,11 +1,15 @@
package com.nflg.product.base.core.config.fillter;
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.MDC;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.nio.charset.StandardCharsets;
/**
* 请求拦截器
@ -16,13 +20,28 @@ import javax.servlet.http.HttpServletResponse;
@Slf4j
public class HttpInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
response.setCharacterEncoding("UTF-8");
private static final String CHARSET = StandardCharsets.UTF_8.name();
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
response.setCharacterEncoding(CHARSET);
String traceId = IdWorker.getIdStr();
MDC.put("traceId", traceId);
// String body="内容无法显示(" + request.getContentType() + ")";
// if (request.getMethod().equalsIgnoreCase("post") && request.getContentType().contains("json") && request.getContentLength()>0){
// InputStream inputStream = request.getInputStream();
// BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8));
// char[] chars = new char[request.getContentLength()];
// reader.read(chars, 0, chars.length);
// body = String.valueOf(chars);
// }
log.info("HttpRecord Requesturl" + request.getRequestURL() + "method" + request.getMethod());
return true;
}
// }
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) {
//String body = response.getContentType().contains("json") ? response.getOutputStream().toString() : "内容无法显示(" + response.getContentType() + ")";
log.info("HttpRecord Responseurl" + request.getRequestURL() + "status" + response.getStatus());
}
}