🎨 日志调整,TraceId修改使用Filter,拦截器方案执行时机会在AccessLogFilter之后
This commit is contained in:
@@ -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"})
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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> {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -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);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -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());
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -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();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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})
|
||||||
|
|||||||
@@ -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());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user