✨ Introducing new features.#1908 日志功能新增时间过滤条件 区分租户隔离

✨ Introducing new features.#1908 日志功能新增时间过滤条件 区分租户隔离
This commit is contained in:
pig666 committed 2020-10-16 18:14:06 +08:00
1 parent cf1d4c8f06
commit 7dbe446bef
14 files changed
+159 -32

No files matched your search

@@ -17,7 +17,7 @@
package com.pig4cloud.pigx.auth.handler; package com.pig4cloud.pigx.auth.handler;
import com.pig4cloud.pigx.admin.api.entity.SysLog; import com.pig4cloud.pigx.admin.api.dto.SysLogDTO;
import com.pig4cloud.pigx.admin.api.feign.RemoteLogService; import com.pig4cloud.pigx.admin.api.feign.RemoteLogService;
import com.pig4cloud.pigx.common.core.constant.CommonConstants; import com.pig4cloud.pigx.common.core.constant.CommonConstants;
import com.pig4cloud.pigx.common.core.constant.SecurityConstants; import com.pig4cloud.pigx.common.core.constant.SecurityConstants;
@@ -61,7 +61,7 @@ public class PigxAuthenticationFailureEventHandler implements AuthenticationFail
public void handle(AuthenticationException authenticationException, Authentication authentication, public void handle(AuthenticationException authenticationException, Authentication authentication,
HttpServletRequest request, HttpServletResponse response) { HttpServletRequest request, HttpServletResponse response) {
String username = authentication.getName(); String username = authentication.getName();
SysLog sysLog = SysLogUtils.getSysLog(request, username); SysLogDTO sysLog = SysLogUtils.getSysLog(request, username);
sysLog.setTitle(username + "用户登录"); sysLog.setTitle(username + "用户登录");
sysLog.setType(CommonConstants.STATUS_LOCK); sysLog.setType(CommonConstants.STATUS_LOCK);
sysLog.setParams(username); sysLog.setParams(username);
@@ -17,7 +17,7 @@
package com.pig4cloud.pigx.auth.handler; package com.pig4cloud.pigx.auth.handler;
import com.pig4cloud.pigx.admin.api.entity.SysLog; import com.pig4cloud.pigx.admin.api.dto.SysLogDTO;
import com.pig4cloud.pigx.admin.api.feign.RemoteLogService; import com.pig4cloud.pigx.admin.api.feign.RemoteLogService;
import com.pig4cloud.pigx.common.core.constant.SecurityConstants; import com.pig4cloud.pigx.common.core.constant.SecurityConstants;
import com.pig4cloud.pigx.common.core.util.WebUtils; import com.pig4cloud.pigx.common.core.util.WebUtils;
@@ -56,7 +56,7 @@ public class PigxAuthenticationSuccessEventHandler implements AuthenticationSucc
@Override @Override
public void handle(Authentication authentication, HttpServletRequest request, HttpServletResponse response) { public void handle(Authentication authentication, HttpServletRequest request, HttpServletResponse response) {
String username = authentication.getName(); String username = authentication.getName();
SysLog sysLog = SysLogUtils.getSysLog(request, username); SysLogDTO sysLog = SysLogUtils.getSysLog(request, username);
sysLog.setTitle(username + "用户登录"); sysLog.setTitle(username + "用户登录");
sysLog.setParams(username); sysLog.setParams(username);
String header = request.getHeader(HttpHeaders.AUTHORIZATION); String header = request.getHeader(HttpHeaders.AUTHORIZATION);
@@ -10,10 +10,17 @@ public interface KeyStrResolver {
/** /**
* 字符串加工 * 字符串加工
* @param in 输入字符串 *
* @param in 输入字符串
* @param split 分割符 * @param split 分割符
* @return 输出字符串 * @return 输出字符串
*/ */
String extract(String in, String split); String extract(String in, String split);
/**
* 字符串获取
*
* @return 模块返回字符串
*/
String key();
} }
@@ -13,7 +13,8 @@ public class TenantKeyStrResolver implements KeyStrResolver {
/** /**
* 传入字符串增加 租户编号:in * 传入字符串增加 租户编号:in
* @param in 输入字符串 *
* @param in 输入字符串
* @param split 分割符 * @param split 分割符
* @return * @return
*/ */
@@ -22,4 +23,14 @@ public class TenantKeyStrResolver implements KeyStrResolver {
return TenantContextHolder.getTenantId() + split + in; return TenantContextHolder.getTenantId() + split + in;
} }
/**
* 返回当前租户ID
*
* @return
*/
@Override
public String key() {
return String.valueOf(TenantContextHolder.getTenantId());
}
} }
@@ -20,6 +20,7 @@
package com.pig4cloud.pigx.common.log; package com.pig4cloud.pigx.common.log;
import com.pig4cloud.pigx.admin.api.feign.RemoteLogService; import com.pig4cloud.pigx.admin.api.feign.RemoteLogService;
import com.pig4cloud.pigx.common.core.util.KeyStrResolver;
import com.pig4cloud.pigx.common.log.aspect.SysLogAspect; import com.pig4cloud.pigx.common.log.aspect.SysLogAspect;
import com.pig4cloud.pigx.common.log.event.SysLogListener; import com.pig4cloud.pigx.common.log.event.SysLogListener;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
@@ -49,8 +50,8 @@ public class LogAutoConfiguration {
} }
@Bean @Bean
public SysLogAspect sysLogAspect(ApplicationEventPublisher publisher) { public SysLogAspect sysLogAspect(ApplicationEventPublisher publisher, KeyStrResolver resolver) {
return new SysLogAspect(publisher); return new SysLogAspect(publisher,resolver);
} }
} }
@@ -19,10 +19,12 @@
package com.pig4cloud.pigx.common.log.aspect; package com.pig4cloud.pigx.common.log.aspect;
import com.pig4cloud.pigx.admin.api.dto.SysLogDTO;
import com.pig4cloud.pigx.common.core.util.KeyStrResolver;
import com.pig4cloud.pigx.common.log.annotation.SysLog; import com.pig4cloud.pigx.common.log.annotation.SysLog;
import com.pig4cloud.pigx.common.log.event.SysLogEvent; import com.pig4cloud.pigx.common.log.event.SysLogEvent;
import com.pig4cloud.pigx.common.log.util.SysLogUtils; import com.pig4cloud.pigx.common.log.util.SysLogUtils;
import lombok.AllArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.SneakyThrows; import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.ProceedingJoinPoint;
@@ -37,11 +39,14 @@ import org.springframework.context.ApplicationEventPublisher;
*/ */
@Slf4j @Slf4j
@Aspect @Aspect
@AllArgsConstructor @RequiredArgsConstructor
public class SysLogAspect { public class SysLogAspect {
private final ApplicationEventPublisher publisher; private final ApplicationEventPublisher publisher;
private final KeyStrResolver tenantKeyStrResolver;
@SneakyThrows @SneakyThrows
@Around("@annotation(sysLog)") @Around("@annotation(sysLog)")
public Object around(ProceedingJoinPoint point, SysLog sysLog) { public Object around(ProceedingJoinPoint point, SysLog sysLog) {
@@ -49,14 +54,15 @@ public class SysLogAspect {
String strMethodName = point.getSignature().getName(); String strMethodName = point.getSignature().getName();
log.debug("[类名]:{},[方法]:{}", strClassName, strMethodName); log.debug("[类名]:{},[方法]:{}", strClassName, strMethodName);
com.pig4cloud.pigx.admin.api.entity.SysLog logVo = SysLogUtils.getSysLog(); SysLogDTO logDTO = SysLogUtils.getSysLog();
logVo.setTitle(sysLog.value()); logDTO.setTitle(sysLog.value());
// 发送异步日志事件 // 发送异步日志事件
Long startTime = System.currentTimeMillis(); Long startTime = System.currentTimeMillis();
Object obj = point.proceed(); Object obj = point.proceed();
Long endTime = System.currentTimeMillis(); Long endTime = System.currentTimeMillis();
logVo.setTime(endTime - startTime); logDTO.setTime(endTime - startTime);
publisher.publishEvent(new SysLogEvent(logVo)); logDTO.setTenantId(Integer.parseInt(tenantKeyStrResolver.key()));
publisher.publishEvent(new SysLogEvent(logDTO));
return obj; return obj;
} }
@@ -19,7 +19,7 @@
package com.pig4cloud.pigx.common.log.event; package com.pig4cloud.pigx.common.log.event;
import com.pig4cloud.pigx.admin.api.entity.SysLog; import com.pig4cloud.pigx.admin.api.dto.SysLogDTO;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Getter; import lombok.Getter;
@@ -30,6 +30,6 @@ import lombok.Getter;
@AllArgsConstructor @AllArgsConstructor
public class SysLogEvent { public class SysLogEvent {
private final SysLog sysLog; private final SysLogDTO sysLog;
} }
@@ -19,7 +19,7 @@
package com.pig4cloud.pigx.common.log.event; package com.pig4cloud.pigx.common.log.event;
import com.pig4cloud.pigx.admin.api.entity.SysLog; import com.pig4cloud.pigx.admin.api.dto.SysLogDTO;
import com.pig4cloud.pigx.admin.api.feign.RemoteLogService; import com.pig4cloud.pigx.admin.api.feign.RemoteLogService;
import com.pig4cloud.pigx.common.core.constant.SecurityConstants; import com.pig4cloud.pigx.common.core.constant.SecurityConstants;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
@@ -41,7 +41,7 @@ public class SysLogListener {
@Order @Order
@EventListener(SysLogEvent.class) @EventListener(SysLogEvent.class)
public void saveSysLog(SysLogEvent event) { public void saveSysLog(SysLogEvent event) {
SysLog sysLog = event.getSysLog(); SysLogDTO sysLog = event.getSysLog();
remoteLogService.saveLog(sysLog, SecurityConstants.FROM_IN); remoteLogService.saveLog(sysLog, SecurityConstants.FROM_IN);
} }
@@ -22,7 +22,7 @@ package com.pig4cloud.pigx.common.log.util;
import cn.hutool.core.util.URLUtil; import cn.hutool.core.util.URLUtil;
import cn.hutool.extra.servlet.ServletUtil; import cn.hutool.extra.servlet.ServletUtil;
import cn.hutool.http.HttpUtil; import cn.hutool.http.HttpUtil;
import com.pig4cloud.pigx.admin.api.entity.SysLog; import com.pig4cloud.pigx.admin.api.dto.SysLogDTO;
import com.pig4cloud.pigx.common.core.constant.CommonConstants; import com.pig4cloud.pigx.common.core.constant.CommonConstants;
import lombok.experimental.UtilityClass; import lombok.experimental.UtilityClass;
import org.springframework.security.core.Authentication; import org.springframework.security.core.Authentication;
@@ -42,10 +42,10 @@ import java.util.Objects;
@UtilityClass @UtilityClass
public class SysLogUtils { public class SysLogUtils {
public SysLog getSysLog() { public SysLogDTO getSysLog() {
HttpServletRequest request = ((ServletRequestAttributes) Objects HttpServletRequest request = ((ServletRequestAttributes) Objects
.requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest(); .requireNonNull(RequestContextHolder.getRequestAttributes())).getRequest();
SysLog sysLog = new SysLog(); SysLogDTO sysLog = new SysLogDTO();
sysLog.setCreateBy(Objects.requireNonNull(getUsername())); sysLog.setCreateBy(Objects.requireNonNull(getUsername()));
sysLog.setType(CommonConstants.STATUS_NORMAL); sysLog.setType(CommonConstants.STATUS_NORMAL);
sysLog.setRemoteAddr(ServletUtil.getClientIP(request)); sysLog.setRemoteAddr(ServletUtil.getClientIP(request));
@@ -57,8 +57,8 @@ public class SysLogUtils {
return sysLog; return sysLog;
} }
public SysLog getSysLog(HttpServletRequest request, String username) { public SysLogDTO getSysLog(HttpServletRequest request, String username) {
SysLog sysLog = new SysLog(); SysLogDTO sysLog = new SysLogDTO();
sysLog.setCreateBy(username); sysLog.setCreateBy(username);
sysLog.setType(CommonConstants.STATUS_NORMAL); sysLog.setType(CommonConstants.STATUS_NORMAL);
sysLog.setRemoteAddr(ServletUtil.getClientIP(request)); sysLog.setRemoteAddr(ServletUtil.getClientIP(request));
@@ -4,6 +4,7 @@ import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty; import io.swagger.annotations.ApiModelProperty;
import lombok.Data; import lombok.Data;
import javax.validation.constraints.NotBlank;
import java.time.LocalDateTime; import java.time.LocalDateTime;
/** /**
@@ -17,15 +18,81 @@ import java.time.LocalDateTime;
public class SysLogDTO { public class SysLogDTO {
/** /**
* 查询日志类型 * 编号
*/ */
@ApiModelProperty(value = "日志类型") private Long id;
/**
* 日志类型
*/
@NotBlank(message = "日志类型不能为空")
private String type; private String type;
/**
* 日志标题
*/
@NotBlank(message = "日志标题不能为空")
private String title;
/**
* 创建者
*/
private String createBy;
/**
* 更新时间
*/
private LocalDateTime updateTime;
/**
* 操作IP地址
*/
private String remoteAddr;
/**
* 用户代理
*/
private String userAgent;
/**
* 请求URI
*/
private String requestUri;
/**
* 操作方式
*/
private String method;
/**
* 操作提交的数据
*/
private String params;
/**
* 执行时间
*/
private Long time;
/**
* 异常信息
*/
private String exception;
/**
* 服务ID
*/
private String serviceId;
/** /**
* 创建时间区间 [开始时间,结束时间] * 创建时间区间 [开始时间,结束时间]
*/ */
@ApiModelProperty(value = "创建时间区间")
private LocalDateTime[] createTime; private LocalDateTime[] createTime;
/**
* 租户编号
*/
private Integer tenantId;
} }
@@ -19,7 +19,7 @@
package com.pig4cloud.pigx.admin.api.feign; package com.pig4cloud.pigx.admin.api.feign;
import com.pig4cloud.pigx.admin.api.entity.SysLog; import com.pig4cloud.pigx.admin.api.dto.SysLogDTO;
import com.pig4cloud.pigx.common.core.constant.SecurityConstants; import com.pig4cloud.pigx.common.core.constant.SecurityConstants;
import com.pig4cloud.pigx.common.core.constant.ServiceNameConstants; import com.pig4cloud.pigx.common.core.constant.ServiceNameConstants;
import com.pig4cloud.pigx.common.core.util.R; import com.pig4cloud.pigx.common.core.util.R;
@@ -42,6 +42,6 @@ public interface RemoteLogService {
* @return succes、false * @return succes、false
*/ */
@PostMapping("/log/save") @PostMapping("/log/save")
R<Boolean> saveLog(@RequestBody SysLog sysLog, @RequestHeader(SecurityConstants.FROM) String from); R<Boolean> saveLog(@RequestBody SysLogDTO sysLog, @RequestHeader(SecurityConstants.FROM) String from);
} }
@@ -21,7 +21,6 @@ package com.pig4cloud.pigx.admin.controller;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.pig4cloud.pigx.admin.api.dto.SysLogDTO; import com.pig4cloud.pigx.admin.api.dto.SysLogDTO;
import com.pig4cloud.pigx.admin.api.entity.SysLog;
import com.pig4cloud.pigx.admin.api.vo.PreLogVO; import com.pig4cloud.pigx.admin.api.vo.PreLogVO;
import com.pig4cloud.pigx.admin.service.SysLogService; import com.pig4cloud.pigx.admin.service.SysLogService;
import com.pig4cloud.pigx.common.core.util.R; import com.pig4cloud.pigx.common.core.util.R;
@@ -52,7 +51,8 @@ public class SysLogController {
/** /**
* 简单分页查询 * 简单分页查询
* @param page 分页对象 *
* @param page 分页对象
* @param sysLog 系统日志 * @param sysLog 系统日志
* @return * @return
*/ */
@@ -63,6 +63,7 @@ public class SysLogController {
/** /**
* 删除日志 * 删除日志
*
* @param id ID * @param id ID
* @return success/false * @return success/false
*/ */
@@ -74,17 +75,19 @@ public class SysLogController {
/** /**
* 插入日志 * 插入日志
*
* @param sysLog 日志实体 * @param sysLog 日志实体
* @return success/false * @return success/false
*/ */
@Inner @Inner
@PostMapping("/save") @PostMapping("/save")
public R save(@Valid @RequestBody SysLog sysLog) { public R save(@Valid @RequestBody SysLogDTO sysLog) {
return R.ok(sysLogService.save(sysLog)); return R.ok(sysLogService.saveLog(sysLog));
} }
/** /**
* 批量插入前端异常日志 * 批量插入前端异常日志
*
* @param preLogVoList 日志实体 * @param preLogVoList 日志实体
* @return success/false * @return success/false
*/ */
@@ -39,6 +39,7 @@ public interface SysLogService extends IService<SysLog> {
/** /**
* 批量插入前端错误日志 * 批量插入前端错误日志
*
* @param preLogVoList 日志信息 * @param preLogVoList 日志信息
* @return true/false * @return true/false
*/ */
@@ -46,10 +47,18 @@ public interface SysLogService extends IService<SysLog> {
/** /**
* 分页查询日志 * 分页查询日志
*
* @param page * @param page
* @param sysLog * @param sysLog
* @return * @return
*/ */
Page getLogByPage(Page page, SysLogDTO sysLog); Page getLogByPage(Page page, SysLogDTO sysLog);
/**
* 插入日志
*
* @param sysLog 日志对象
* @return true/false
*/
Boolean saveLog(SysLogDTO sysLog);
} }
@@ -31,7 +31,11 @@ import com.pig4cloud.pigx.admin.api.vo.PreLogVO;
import com.pig4cloud.pigx.admin.mapper.SysLogMapper; import com.pig4cloud.pigx.admin.mapper.SysLogMapper;
import com.pig4cloud.pigx.admin.service.SysLogService; import com.pig4cloud.pigx.admin.service.SysLogService;
import com.pig4cloud.pigx.common.core.constant.CommonConstants; import com.pig4cloud.pigx.common.core.constant.CommonConstants;
import com.pig4cloud.pigx.common.data.tenant.TenantBroker;
import com.pig4cloud.pigx.common.data.tenant.TenantContextHolder;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.List; import java.util.List;
@@ -50,6 +54,7 @@ public class SysLogServiceImpl extends ServiceImpl<SysLogMapper, SysLog> impleme
/** /**
* 批量插入前端错误日志 * 批量插入前端错误日志
*
* @param preLogVoList 日志信息 * @param preLogVoList 日志信息
* @return true/false * @return true/false
*/ */
@@ -85,4 +90,22 @@ public class SysLogServiceImpl extends ServiceImpl<SysLogMapper, SysLog> impleme
return baseMapper.selectPage(page, wrapper); return baseMapper.selectPage(page, wrapper);
} }
/**
* 插入日志
*
* @param sysLog 日志对象
* @return true/false
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean saveLog(SysLogDTO sysLog) {
TenantBroker.applyAs(sysLog::getTenantId, tenantId -> {
TenantContextHolder.setTenantId(tenantId);
SysLog log = new SysLog();
BeanUtils.copyProperties(sysLog, log, "createTime");
return baseMapper.insert(log);
});
return Boolean.TRUE;
}
} }