🎨 日志调整,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; package com.your.packages.admin;
import com.hccake.ballcat.commom.log.access.annotation.EnableAccessLog; 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.job.annotation.EnableXxlJob;
import com.hccake.ballcat.common.swagger.annotation.EnableSwagger2Aggregator; import com.hccake.ballcat.common.swagger.annotation.EnableSwagger2Aggregator;
import com.hccake.simpleredis.EnableSimpleCache; import com.hccake.simpleredis.EnableSimpleCache;
@@ -16,6 +17,7 @@ import org.springframework.boot.web.servlet.ServletComponentScan;
@EnableXxlJob @EnableXxlJob
@EnableSwagger2Aggregator @EnableSwagger2Aggregator
@EnableAccessLog @EnableAccessLog
@EnableOperationLog
@ServletComponentScan("com.hccake.ballcat.admin.oauth.filter") @ServletComponentScan("com.hccake.ballcat.admin.oauth.filter")
@SpringBootApplication(scanBasePackages = {"com.hccake.ballcat.admin", "com.your.packages.admin"}) @SpringBootApplication(scanBasePackages = {"com.hccake.ballcat.admin", "com.your.packages.admin"})
@MapperScan(basePackages = {"com.hccake.ballcat.**.mapper", "com.your.packages.**.mapper"}) @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.baomidou.mybatisplus.extension.service.IService;
import com.hccake.ballcat.admin.modules.log.model.entity.AdminOperationLog; 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 * @author hccake
* @date 2019-10-15 20:42:32 * @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; package com.hccake.ballcat.admin.modules.log.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; 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.mapper.AdminOperationLogMapper;
import com.hccake.ballcat.admin.modules.log.model.entity.AdminOperationLog; 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.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; import org.springframework.stereotype.Service;
/** /**
@@ -18,15 +15,4 @@ import org.springframework.stereotype.Service;
@Service @Service
public class OperationLogAdminServiceImpl extends ServiceImpl<AdminOperationLogMapper, AdminOperationLog> implements OperationLogAdminService { 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.autoconfigure.condition.ConditionalOnWebApplication;
import org.springframework.boot.web.servlet.FilterRegistrationBean; import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/** /**
* @author Hccake * @author Hccake
@@ -16,11 +15,10 @@ import org.springframework.context.annotation.Configuration;
* @date 2019/10/15 18:20 * @date 2019/10/15 18:20
*/ */
@Slf4j @Slf4j
@Configuration
@ConditionalOnWebApplication @ConditionalOnWebApplication
@RequiredArgsConstructor @RequiredArgsConstructor
public class AccessLogAutoConfiguration { public class AccessLogAutoConfiguration {
private final AccessLogHandler accessLogService; private final AccessLogHandler<?> accessLogService;
@Bean @Bean
@ConditionalOnClass(AccessLogHandler.class) @ConditionalOnClass(AccessLogHandler.class)

View File

@@ -20,7 +20,7 @@ import java.io.IOException;
*/ */
@AllArgsConstructor @AllArgsConstructor
public class AccessLogFilter extends OncePerRequestFilter { public class AccessLogFilter extends OncePerRequestFilter {
private final AccessLogHandler accessLogService; private final AccessLogHandler<?> accessLogService;
/** /**
* Same contract as for {@code doFilter}, but guaranteed to be * 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 * <p>Provides HttpServletRequest and HttpServletResponse arguments instead of the
* default ServletRequest and ServletResponse ones. * default ServletRequest and ServletResponse ones.
* *
* @param request * @param request 请求信息
* @param response * @param response 请求体
* @param filterChain * @param filterChain 过滤器链
*/ */
@Override @Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { 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; package com.hccake.ballcat.commom.log.mdc;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication; 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.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.core.Ordered;
/** /**
* @author Hccake * @author Hccake
* @version 1.0 * @version 1.0
* @date 2020/5/25 17:29 * @date 2020/5/25 17:29
*/ */
@Configuration @Slf4j
@ConditionalOnWebApplication @ConditionalOnWebApplication
public class TraceIdAutoConfiguration { public class TraceIdAutoConfiguration {
@Bean @Bean
public TraceIdMvcConfigurer traceIdMvcConfigurer(){ public FilterRegistrationBean<TraceIdFilter> traceIdFilterRegistrationBean(){
return new TraceIdMvcConfigurer(); 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.aspect.OperationLogAspect;
import com.hccake.ballcat.commom.log.operation.event.OperationLogListener; 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.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/** /**
* @author Hccake * @author Hccake
* @version 1.0 * @version 1.0
* @date 2019/10/15 18:20 * @date 2019/10/15 18:20
*/ */
@Configuration
public class OperationLogAutoConfiguration { public class OperationLogAutoConfiguration {
/** /**
* 注册日志保存事件监听器 * 注册日志保存事件监听器
* @return * @return OperationLogListener
*/ */
@Bean @Bean
@ConditionalOnBean(OperationLogSaveService.class) @ConditionalOnBean(OperationLogHandler.class)
public OperationLogListener operationLogListener() { public OperationLogListener operationLogListener(OperationLogHandler operationLogHandler) {
return new OperationLogListener(); return new OperationLogListener(operationLogHandler);
} }
/** /**
* 注册操作日志Aspect * 注册操作日志Aspect
* @return * @return OperationLogAspect
*/ */
@Bean @Bean
@ConditionalOnBean(OperationLogSaveService.class) @ConditionalOnBean(OperationLogHandler.class)
public OperationLogAspect operationLogAspect() { public OperationLogAspect operationLogAspect() {
return new OperationLogAspect(); return new OperationLogAspect();
} }

View File

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

View File

@@ -1,8 +1,8 @@
package com.hccake.ballcat.commom.log.operation.event; 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 lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.event.EventListener; import org.springframework.context.event.EventListener;
import org.springframework.core.annotation.Order; import org.springframework.core.annotation.Order;
import org.springframework.scheduling.annotation.Async; import org.springframework.scheduling.annotation.Async;
@@ -12,15 +12,14 @@ import org.springframework.scheduling.annotation.Async;
* 异步监听日志事件 * 异步监听日志事件
*/ */
@Slf4j @Slf4j
@RequiredArgsConstructor
public class OperationLogListener { public class OperationLogListener {
private final OperationLogHandler operationLogHandler;
@Autowired
private OperationLogSaveService operationLogSaveService;
@Async @Async
@Order @Order
@EventListener(OperationLogEvent.class) @EventListener(OperationLogEvent.class)
public void saveSysLog(OperationLogEvent event) { 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 * @version 1.0
* @date 2019/10/15 19:57 * @date 2019/10/15 19:57
*/ */
public interface OperationLogSaveService { public interface OperationLogHandler {
/** /**
* 保存操作日志 * 保存操作日志
* @param operationLogDTO * @param operationLogDTO 操作日志传输对象
* @return true/false
*/ */
boolean saveLog(OperationLogDTO operationLogDTO); void saveLog(OperationLogDTO operationLogDTO);
} }