🎨 日志调整,TraceId修改使用Filter,拦截器方案执行时机会在AccessLogFilter之后

This commit is contained in:
b2baccline
2020-05-25 21:04:13 +08:00
parent 8ee64886b4
commit 06ab3a4d09
14 changed files with 94 additions and 98 deletions

View File

@@ -1,6 +1,7 @@
package com.your.packages.admin;
import com.hccake.ballcat.commom.log.access.annotation.EnableAccessLog;
import com.hccake.ballcat.commom.log.operation.annotation.EnableOperationLog;
import com.hccake.ballcat.common.job.annotation.EnableXxlJob;
import com.hccake.ballcat.common.swagger.annotation.EnableSwagger2Aggregator;
import com.hccake.simpleredis.EnableSimpleCache;
@@ -16,6 +17,7 @@ import org.springframework.boot.web.servlet.ServletComponentScan;
@EnableXxlJob
@EnableSwagger2Aggregator
@EnableAccessLog
@EnableOperationLog
@ServletComponentScan("com.hccake.ballcat.admin.oauth.filter")
@SpringBootApplication(scanBasePackages = {"com.hccake.ballcat.admin", "com.your.packages.admin"})
@MapperScan(basePackages = {"com.hccake.ballcat.**.mapper", "com.your.packages.**.mapper"})

View File

@@ -0,0 +1,30 @@
package com.hccake.ballcat.admin.modules.log.handler;
import com.hccake.ballcat.admin.modules.log.model.entity.AdminOperationLog;
import com.hccake.ballcat.admin.modules.log.service.OperationLogAdminService;
import com.hccake.ballcat.admin.modules.sys.model.converter.OperationLogConverter;
import com.hccake.ballcat.commom.log.operation.model.OperationLogDTO;
import com.hccake.ballcat.commom.log.operation.service.OperationLogHandler;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
/**
* @author Hccake
* @version 1.0
* @date 2020/5/25 20:38
*/
@Component
@RequiredArgsConstructor
public class AdminOperationLogHandler implements OperationLogHandler {
private final OperationLogAdminService operationLogAdminService;
/**
* 保存操作日志
* @param operationLogDTO 操作日志DTO
*/
@Override
public void saveLog(OperationLogDTO operationLogDTO) {
AdminOperationLog adminOperationLog = OperationLogConverter.INSTANCE.dtoToPo(operationLogDTO);
operationLogAdminService.save(adminOperationLog);
}
}

View File

@@ -2,7 +2,6 @@ package com.hccake.ballcat.admin.modules.log.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.hccake.ballcat.admin.modules.log.model.entity.AdminOperationLog;
import com.hccake.ballcat.commom.log.operation.service.OperationLogSaveService;
/**
* 操作日志
@@ -10,6 +9,6 @@ import com.hccake.ballcat.commom.log.operation.service.OperationLogSaveService;
* @author hccake
* @date 2019-10-15 20:42:32
*/
public interface OperationLogAdminService extends IService<AdminOperationLog>, OperationLogSaveService {
public interface OperationLogAdminService extends IService<AdminOperationLog> {
}

View File

@@ -1,12 +1,9 @@
package com.hccake.ballcat.admin.modules.log.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.baomidou.mybatisplus.extension.toolkit.SqlHelper;
import com.hccake.ballcat.admin.modules.log.mapper.AdminOperationLogMapper;
import com.hccake.ballcat.admin.modules.log.model.entity.AdminOperationLog;
import com.hccake.ballcat.admin.modules.log.service.OperationLogAdminService;
import com.hccake.ballcat.admin.modules.sys.model.converter.OperationLogConverter;
import com.hccake.ballcat.commom.log.operation.model.OperationLogDTO;
import org.springframework.stereotype.Service;
/**
@@ -18,15 +15,4 @@ import org.springframework.stereotype.Service;
@Service
public class OperationLogAdminServiceImpl extends ServiceImpl<AdminOperationLogMapper, AdminOperationLog> implements OperationLogAdminService {
/**
* 保存操作日志
*
* @param operationLogDTO
* @return true/false
*/
@Override
public boolean saveLog(OperationLogDTO operationLogDTO) {
AdminOperationLog adminOperationLog = OperationLogConverter.INSTANCE.dtoToPo(operationLogDTO);
return SqlHelper.retBool(baseMapper.insert(adminOperationLog));
}
}

View File

@@ -8,7 +8,6 @@ import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @author Hccake
@@ -16,11 +15,10 @@ import org.springframework.context.annotation.Configuration;
* @date 2019/10/15 18:20
*/
@Slf4j
@Configuration
@ConditionalOnWebApplication
@RequiredArgsConstructor
public class AccessLogAutoConfiguration {
private final AccessLogHandler accessLogService;
private final AccessLogHandler<?> accessLogService;
@Bean
@ConditionalOnClass(AccessLogHandler.class)

View File

@@ -20,7 +20,7 @@ import java.io.IOException;
*/
@AllArgsConstructor
public class AccessLogFilter extends OncePerRequestFilter {
private final AccessLogHandler accessLogService;
private final AccessLogHandler<?> accessLogService;
/**
* Same contract as for {@code doFilter}, but guaranteed to be
@@ -29,9 +29,9 @@ public class AccessLogFilter extends OncePerRequestFilter {
* <p>Provides HttpServletRequest and HttpServletResponse arguments instead of the
* default ServletRequest and ServletResponse ones.
*
* @param request
* @param response
* @param filterChain
* @param request 请求信息
* @param response 请求体
* @param filterChain 过滤器链
*/
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {

View File

@@ -1,21 +1,26 @@
package com.hccake.ballcat.commom.log.mdc;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
/**
* @author Hccake
* @version 1.0
* @date 2020/5/25 17:29
*/
@Configuration
@Slf4j
@ConditionalOnWebApplication
public class TraceIdAutoConfiguration {
@Bean
public TraceIdMvcConfigurer traceIdMvcConfigurer(){
return new TraceIdMvcConfigurer();
public FilterRegistrationBean<TraceIdFilter> traceIdFilterRegistrationBean(){
FilterRegistrationBean<TraceIdFilter> registrationBean =
new FilterRegistrationBean<>(new TraceIdFilter());
registrationBean.setOrder(Ordered.HIGHEST_PRECEDENCE);
return registrationBean;
}
}

View File

@@ -0,0 +1,31 @@
package com.hccake.ballcat.commom.log.mdc;
import cn.hutool.core.util.IdUtil;
import com.hccake.ballcat.commom.log.constant.LogConstant;
import org.slf4j.MDC;
import org.springframework.web.filter.OncePerRequestFilter;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
/**
* @author Hccake
* @version 1.0
* @date 2020/5/25 17:35
* 利用 Slf4J 的 MDC 功能,记录 TraceId
*/
public class TraceIdFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
MDC.put(LogConstant.TRACE_ID, IdUtil.objectId());
try {
filterChain.doFilter(request, response);
} finally {
MDC.remove(LogConstant.TRACE_ID);
}
}
}

View File

@@ -1,33 +0,0 @@
package com.hccake.ballcat.commom.log.mdc;
import cn.hutool.core.util.IdUtil;
import com.hccake.ballcat.commom.log.constant.LogConstant;
import org.slf4j.MDC;
import org.springframework.lang.Nullable;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @author Hccake
* @version 1.0
* @date 2020/5/25 17:35
* 利用 Slf4J 的 MDC 功能,记录 TraceId
*/
public class TraceIdInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
MDC.put(LogConstant.TRACE_ID, IdUtil.objectId());
return super.preHandle(request, response, handler);
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception {
MDC.remove(LogConstant.TRACE_ID);
super.afterCompletion(request, response, handler, ex);
}
}

View File

@@ -1,18 +0,0 @@
package com.hccake.ballcat.commom.log.mdc;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
* @author Hccake
* @version 1.0
* @date 2020/5/25 17:48
*/
public class TraceIdMvcConfigurer implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new TraceIdInterceptor());
}
}

View File

@@ -2,35 +2,33 @@ package com.hccake.ballcat.commom.log.operation;
import com.hccake.ballcat.commom.log.operation.aspect.OperationLogAspect;
import com.hccake.ballcat.commom.log.operation.event.OperationLogListener;
import com.hccake.ballcat.commom.log.operation.service.OperationLogSaveService;
import com.hccake.ballcat.commom.log.operation.service.OperationLogHandler;
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* @author Hccake
* @version 1.0
* @date 2019/10/15 18:20
*/
@Configuration
public class OperationLogAutoConfiguration {
/**
* 注册日志保存事件监听器
* @return
* @return OperationLogListener
*/
@Bean
@ConditionalOnBean(OperationLogSaveService.class)
public OperationLogListener operationLogListener() {
return new OperationLogListener();
@ConditionalOnBean(OperationLogHandler.class)
public OperationLogListener operationLogListener(OperationLogHandler operationLogHandler) {
return new OperationLogListener(operationLogHandler);
}
/**
* 注册操作日志Aspect
* @return
* @return OperationLogAspect
*/
@Bean
@ConditionalOnBean(OperationLogSaveService.class)
@ConditionalOnBean(OperationLogHandler.class)
public OperationLogAspect operationLogAspect() {
return new OperationLogAspect();
}

View File

@@ -10,7 +10,7 @@ import java.lang.annotation.*;
* @version 1.0
* @date 2019/10/15 18:11
*/
@Target(ElementType.METHOD)
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import({OperationLogAutoConfiguration.class})

View File

@@ -1,8 +1,8 @@
package com.hccake.ballcat.commom.log.operation.event;
import com.hccake.ballcat.commom.log.operation.service.OperationLogSaveService;
import com.hccake.ballcat.commom.log.operation.service.OperationLogHandler;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.event.EventListener;
import org.springframework.core.annotation.Order;
import org.springframework.scheduling.annotation.Async;
@@ -12,15 +12,14 @@ import org.springframework.scheduling.annotation.Async;
* 异步监听日志事件
*/
@Slf4j
@RequiredArgsConstructor
public class OperationLogListener {
@Autowired
private OperationLogSaveService operationLogSaveService;
private final OperationLogHandler operationLogHandler;
@Async
@Order
@EventListener(OperationLogEvent.class)
public void saveSysLog(OperationLogEvent event) {
operationLogSaveService.saveLog(event.getOperationLogDTO());
operationLogHandler.saveLog(event.getOperationLogDTO());
}
}

View File

@@ -8,12 +8,11 @@ import com.hccake.ballcat.commom.log.operation.model.OperationLogDTO;
* @version 1.0
* @date 2019/10/15 19:57
*/
public interface OperationLogSaveService {
public interface OperationLogHandler {
/**
* 保存操作日志
* @param operationLogDTO
* @return true/false
* @param operationLogDTO 操作日志传输对象
*/
boolean saveLog(OperationLogDTO operationLogDTO);
void saveLog(OperationLogDTO operationLogDTO);
}