package cc.mrbird.febs.monitor.service.impl;
|
|
|
import cc.mrbird.febs.common.entity.FebsConstant;
|
import cc.mrbird.febs.common.entity.QueryRequest;
|
import cc.mrbird.febs.common.utils.AddressUtil;
|
import cc.mrbird.febs.common.utils.SortUtil;
|
import cc.mrbird.febs.monitor.entity.SystemLog;
|
import cc.mrbird.febs.monitor.mapper.LogMapper;
|
import cc.mrbird.febs.monitor.service.ILogService;
|
import cc.mrbird.febs.system.entity.User;
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.baomidou.mybatisplus.core.metadata.IPage;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
import lombok.RequiredArgsConstructor;
|
import org.apache.commons.lang3.StringUtils;
|
import org.aspectj.lang.ProceedingJoinPoint;
|
import org.springframework.core.LocalVariableTableParameterNameDiscoverer;
|
import org.springframework.stereotype.Service;
|
import org.springframework.web.multipart.MultipartFile;
|
|
import java.io.Serializable;
|
import java.lang.reflect.Method;
|
import java.util.*;
|
|
/**
|
* @author MrBird
|
*/
|
@Service
|
@RequiredArgsConstructor
|
public class LogServiceImpl extends ServiceImpl<LogMapper, SystemLog> implements ILogService {
|
|
private final ObjectMapper objectMapper;
|
|
@Override
|
public IPage<SystemLog> findLogs(SystemLog systemLog, QueryRequest request) {
|
QueryWrapper<SystemLog> queryWrapper = new QueryWrapper<>();
|
if (StringUtils.isNotBlank(systemLog.getCreateTimeFrom()) &&
|
StringUtils.equals(systemLog.getCreateTimeFrom(), systemLog.getCreateTimeTo())) {
|
systemLog.setCreateTimeFrom(systemLog.getCreateTimeFrom() + " 00:00:00");
|
systemLog.setCreateTimeTo(systemLog.getCreateTimeTo() + " 23:59:59");
|
}
|
if (StringUtils.isNotBlank(systemLog.getUsername())) {
|
queryWrapper.lambda().eq(SystemLog::getUsername, systemLog.getUsername().toLowerCase());
|
}
|
if (StringUtils.isNotBlank(systemLog.getOperation())) {
|
queryWrapper.lambda().like(SystemLog::getOperation, systemLog.getOperation());
|
}
|
if (StringUtils.isNotBlank(systemLog.getLocation())) {
|
queryWrapper.lambda().like(SystemLog::getLocation, systemLog.getLocation());
|
}
|
if (StringUtils.isNotBlank(systemLog.getCreateTimeFrom()) && StringUtils.isNotBlank(systemLog.getCreateTimeTo())) {
|
queryWrapper.lambda()
|
.ge(SystemLog::getCreateTime, systemLog.getCreateTimeFrom())
|
.le(SystemLog::getCreateTime, systemLog.getCreateTimeTo());
|
}
|
|
Page<SystemLog> page = new Page<>(request.getPageNum(), request.getPageSize());
|
SortUtil.handlePageSort(request, page, "createTime", FebsConstant.ORDER_DESC, true);
|
|
return this.page(page, queryWrapper);
|
}
|
|
@Override
|
public void deleteLogs(String[] logIds) {
|
List<String> list = Arrays.asList(logIds);
|
baseMapper.deleteBatchIds(list);
|
}
|
|
@Override
|
public void saveLog(User user, ProceedingJoinPoint point, Method method, String ip, String operation, long start) {
|
SystemLog systemLog = new SystemLog();
|
// 设置 IP地址
|
systemLog.setIp(ip);
|
if (user != null) {
|
systemLog.setUsername(user.getUsername());
|
}
|
// 设置耗时
|
systemLog.setTime(System.currentTimeMillis() - start);
|
// 设置操作描述
|
systemLog.setOperation(operation);
|
// 请求的类名
|
String className = point.getTarget().getClass().getName();
|
// 请求的方法名
|
String methodName = method.getName();
|
systemLog.setMethod(className + "." + methodName + "()");
|
// 请求的方法参数值
|
Object[] args = point.getArgs();
|
// 请求的方法参数名称
|
LocalVariableTableParameterNameDiscoverer u = new LocalVariableTableParameterNameDiscoverer();
|
String[] paramNames = u.getParameterNames(method);
|
if (args != null && paramNames != null) {
|
StringBuilder params = new StringBuilder();
|
params = handleParams(params, args, Arrays.asList(paramNames));
|
systemLog.setParams(params.toString());
|
}
|
systemLog.setCreateTime(new Date());
|
systemLog.setLocation(AddressUtil.getCityInfo(ip));
|
// 保存系统日志
|
save(systemLog);
|
}
|
|
@SuppressWarnings("all")
|
private StringBuilder handleParams(StringBuilder params, Object[] args, List paramNames) {
|
try {
|
for (int i = 0; i < args.length; i++) {
|
if (args[i] instanceof Map) {
|
Set set = ((Map) args[i]).keySet();
|
List<Object> list = new ArrayList<>();
|
List<Object> paramList = new ArrayList<>();
|
for (Object key : set) {
|
list.add(((Map) args[i]).get(key));
|
paramList.add(key);
|
}
|
return handleParams(params, list.toArray(), paramList);
|
} else {
|
if (args[i] instanceof Serializable) {
|
Class<?> aClass = args[i].getClass();
|
try {
|
aClass.getDeclaredMethod("toString", new Class[]{null});
|
// 如果不抛出 NoSuchMethodException 异常则存在 toString 方法 ,安全的 writeValueAsString ,否则 走 Object的 toString方法
|
params.append(" ").append(paramNames.get(i)).append(": ").append(objectMapper.writeValueAsString(args[i]));
|
} catch (NoSuchMethodException e) {
|
params.append(" ").append(paramNames.get(i)).append(": ").append(objectMapper.writeValueAsString(args[i].toString()));
|
}
|
} else if (args[i] instanceof MultipartFile) {
|
MultipartFile file = (MultipartFile) args[i];
|
params.append(" ").append(paramNames.get(i)).append(": ").append(file.getName());
|
} else {
|
params.append(" ").append(paramNames.get(i)).append(": ").append(args[i]);
|
}
|
}
|
}
|
} catch (Exception ignore) {
|
params.append("参数解析失败");
|
}
|
return params;
|
}
|
}
|