mirror of https://gitee.com/stylefeng/roses
【Log】日志模块代码优化
parent
bbc35c8bbd
commit
11723cf6c1
|
@ -1,7 +1,7 @@
|
|||
package cn.stylefeng.roses.kernel.log.api;
|
||||
|
||||
import cn.stylefeng.roses.kernel.db.api.pojo.page.PageResult;
|
||||
import cn.stylefeng.roses.kernel.log.api.pojo.manage.LogManagerParam;
|
||||
import cn.stylefeng.roses.kernel.log.api.pojo.manage.LogManagerRequest;
|
||||
import cn.stylefeng.roses.kernel.log.api.pojo.record.LogRecordDTO;
|
||||
|
||||
import java.util.List;
|
||||
|
@ -19,32 +19,42 @@ public interface LogManagerApi {
|
|||
/**
|
||||
* 查询日志列表
|
||||
*
|
||||
* @param logManagerParam 查询条件
|
||||
* @param logManagerRequest 查询条件
|
||||
* @return 返回查询日志列表
|
||||
* @author fengshuonan
|
||||
* @date 2020/10/28 11:27
|
||||
*/
|
||||
List<LogRecordDTO> queryLogList(LogManagerParam logManagerParam);
|
||||
List<LogRecordDTO> findList(LogManagerRequest logManagerRequest);
|
||||
|
||||
/**
|
||||
* 查询日志列表
|
||||
*
|
||||
* @param logManagerParam 查询条件
|
||||
* @param logManagerRequest 查询条件
|
||||
* @return 返回查询日志列表分页结果
|
||||
* @author luojie
|
||||
* @date 2020/11/3 10:40
|
||||
*/
|
||||
PageResult<LogRecordDTO> queryLogListPage(LogManagerParam logManagerParam);
|
||||
PageResult<LogRecordDTO> findPage(LogManagerRequest logManagerRequest);
|
||||
|
||||
/**
|
||||
* 批量删除日志
|
||||
* <p>
|
||||
* 删除日志条件必须传入开始时间、结束时间、服务名称三个参数
|
||||
*
|
||||
* @param logManagerParam 参数的封装
|
||||
* @param logManagerRequest 参数的封装
|
||||
* @author fengshuonan
|
||||
* @date 2020/10/28 11:47
|
||||
*/
|
||||
void deleteLogs(LogManagerParam logManagerParam);
|
||||
void del(LogManagerRequest logManagerRequest);
|
||||
|
||||
/**
|
||||
* 详情
|
||||
*
|
||||
* @param
|
||||
* @return
|
||||
* @author chenjinlong
|
||||
* @date 2021/2/1 19:47
|
||||
*/
|
||||
LogRecordDTO detail(LogManagerRequest logManagerRequest);
|
||||
|
||||
}
|
|
@ -13,13 +13,23 @@ import java.util.List;
|
|||
public interface LogRecordApi {
|
||||
|
||||
/**
|
||||
* 同步记录日志,也就是记录成功才方法返回
|
||||
* 同步记录日志
|
||||
*
|
||||
* @param logRecordDTO 日志记录的参数
|
||||
* @author fengshuonan
|
||||
* @date 2020/10/27 17:38
|
||||
*/
|
||||
void recordLog(LogRecordDTO logRecordDTO);
|
||||
void add(LogRecordDTO logRecordDTO);
|
||||
|
||||
/**
|
||||
* 异步同步记录日志
|
||||
* 调用本方法直接返回结果之后再异步记录日志
|
||||
*
|
||||
* @param logRecordDTO 日志记录的参数
|
||||
* @author fengshuonan
|
||||
* @date 2020/10/27 17:38
|
||||
*/
|
||||
void addAsync(LogRecordDTO logRecordDTO);
|
||||
|
||||
/**
|
||||
* 批量同步记录日志
|
||||
|
@ -28,15 +38,7 @@ public interface LogRecordApi {
|
|||
* @author majianguo
|
||||
* @date 2020/11/2 下午2:59
|
||||
*/
|
||||
void recordLogByList(List<LogRecordDTO> logRecords);
|
||||
void addBatch(List<LogRecordDTO> logRecords);
|
||||
|
||||
/**
|
||||
* 异步记录日志,调用本方法直接返回结果,之后再异步记录日志
|
||||
*
|
||||
* @param logRecordDTO 日志记录的参数
|
||||
* @author fengshuonan
|
||||
* @date 2020/10/27 17:38
|
||||
*/
|
||||
void recordLogAsync(LogRecordDTO logRecordDTO);
|
||||
|
||||
}
|
|
@ -1,5 +1,6 @@
|
|||
package cn.stylefeng.roses.kernel.log.api.factory;
|
||||
|
||||
import cn.hutool.core.util.IdUtil;
|
||||
import cn.hutool.extra.spring.SpringUtil;
|
||||
import cn.stylefeng.roses.kernel.log.api.constants.LogConstants;
|
||||
import cn.stylefeng.roses.kernel.log.api.context.ServerInfoContext;
|
||||
|
@ -26,6 +27,9 @@ public class LogRecordFactory {
|
|||
public static LogRecordDTO createLogRecord(String name, Object content) {
|
||||
LogRecordDTO logRecordDTO = new LogRecordDTO();
|
||||
|
||||
//设置全局id
|
||||
logRecordDTO.setLogId(IdUtil.getSnowflake(1, 1).nextId());
|
||||
|
||||
// 设置日志名称
|
||||
logRecordDTO.setLogName(name);
|
||||
|
||||
|
|
|
@ -14,7 +14,7 @@ import javax.validation.constraints.NotBlank;
|
|||
*/
|
||||
@EqualsAndHashCode(callSuper = true)
|
||||
@Data
|
||||
public class LogManagerParam extends BaseRequest {
|
||||
public class LogManagerRequest extends BaseRequest {
|
||||
|
||||
/**
|
||||
* 单条日志id
|
|
@ -13,6 +13,11 @@ import java.util.Date;
|
|||
@Data
|
||||
public class LogRecordDTO {
|
||||
|
||||
/**
|
||||
* 日志id
|
||||
*/
|
||||
private Long logId;
|
||||
|
||||
/**
|
||||
* 日志的名称,一般为业务名称
|
||||
*/
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
package cn.stylefeng.roses.kernel.log.modular.manage.controller;
|
||||
|
||||
import cn.stylefeng.roses.kernel.log.api.LogManagerApi;
|
||||
import cn.stylefeng.roses.kernel.log.api.pojo.manage.LogManagerParam;
|
||||
import cn.stylefeng.roses.kernel.log.api.pojo.manage.LogManagerRequest;
|
||||
import cn.stylefeng.roses.kernel.log.db.service.SysLogService;
|
||||
import cn.stylefeng.roses.kernel.resource.api.annotation.ApiResource;
|
||||
import cn.stylefeng.roses.kernel.resource.api.annotation.GetResource;
|
||||
|
@ -43,8 +43,8 @@ public class LogManagerController {
|
|||
* @date 2020/11/3 12:58
|
||||
*/
|
||||
@GetResource(name = "查询日志列表", path = "/logManager/list")
|
||||
public ResponseData list(@RequestBody LogManagerParam logManagerParam) {
|
||||
return new SuccessResponseData(logManagerApi.queryLogList(logManagerParam));
|
||||
public ResponseData list(@RequestBody LogManagerRequest logManagerRequest) {
|
||||
return new SuccessResponseData(logManagerApi.findList(logManagerRequest));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -54,8 +54,8 @@ public class LogManagerController {
|
|||
* @date 2021/1/8 17:36
|
||||
*/
|
||||
@GetResource(name = "查询日志列表", path = "/logManager/page")
|
||||
public ResponseData page(LogManagerParam logManagerParam) {
|
||||
return new SuccessResponseData(logManagerApi.queryLogListPage(logManagerParam));
|
||||
public ResponseData page(LogManagerRequest logManagerRequest) {
|
||||
return new SuccessResponseData(logManagerApi.findPage(logManagerRequest));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -65,8 +65,8 @@ public class LogManagerController {
|
|||
* @date 2020/11/3 13:47
|
||||
*/
|
||||
@PostResource(name = "删除日志", path = "/logManager/delete")
|
||||
public ResponseData delete(@RequestBody @Validated(LogManagerParam.delete.class) LogManagerParam logManagerParam) {
|
||||
logManagerApi.deleteLogs(logManagerParam);
|
||||
public ResponseData delete(@RequestBody @Validated(LogManagerRequest.delete.class) LogManagerRequest logManagerRequest) {
|
||||
logManagerApi.del(logManagerRequest);
|
||||
return new SuccessResponseData();
|
||||
}
|
||||
|
||||
|
@ -77,8 +77,8 @@ public class LogManagerController {
|
|||
* @date 2021/1/11 17:36
|
||||
*/
|
||||
@GetResource(name = "查看日志详情", path = "/logManager/detail")
|
||||
public ResponseData detail(@Validated(LogManagerParam.detail.class) LogManagerParam logManagerParam) {
|
||||
return new SuccessResponseData(sysLogService.detail(logManagerParam));
|
||||
public ResponseData detail(@Validated(LogManagerRequest.detail.class) LogManagerRequest logManagerRequest) {
|
||||
return new SuccessResponseData(logManagerApi.detail(logManagerRequest));
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -142,7 +142,7 @@ public class RequestApiLogRecordAop implements Ordered {
|
|||
ParamsLogAppender.appendAuthedHttpLog(logRecordDTO, params, result);
|
||||
|
||||
// 异步记录日志
|
||||
logRecordApi.recordLogAsync(logRecordDTO);
|
||||
logRecordApi.addAsync(logRecordDTO);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -174,7 +174,7 @@ public class RequestApiLogRecordAop implements Ordered {
|
|||
for (int k = 0; k < args.length; k++) {
|
||||
if (args[k] instanceof Model) {
|
||||
classes[k] = Model.class;
|
||||
} else if (args[k] instanceof MultipartFile) {
|
||||
} else if (args[k] instanceof MultipartFile) {
|
||||
classes[k] = MultipartFile.class;
|
||||
} else {
|
||||
classes[k] = args[k].getClass();
|
||||
|
@ -198,10 +198,10 @@ public class RequestApiLogRecordAop implements Ordered {
|
|||
// 装载参数名称和参数值
|
||||
for (int i = 0; i < parameterNames.length; i++) {
|
||||
// 解决上传文件接口aop记录日志报错
|
||||
if (args[i] instanceof MultipartFile && args[i]!=null) {
|
||||
if (args[i] instanceof MultipartFile && args[i] != null) {
|
||||
// 根据参数名只记录文件名
|
||||
paramMap.put(parameterNames[i], ((MultipartFile) args[i]).getOriginalFilename());
|
||||
}else{
|
||||
} else {
|
||||
paramMap.put(parameterNames[i], args[i]);
|
||||
}
|
||||
|
||||
|
@ -217,10 +217,10 @@ public class RequestApiLogRecordAop implements Ordered {
|
|||
|
||||
// 有异常则不显示参数名称直接返回参数
|
||||
for (int i = 0; i < args.length; i++) {
|
||||
if (args[i] instanceof MultipartFile && args[i]!=null) {
|
||||
if (args[i] instanceof MultipartFile && args[i] != null) {
|
||||
// 根据参数名只记录文件名
|
||||
paramMap.put("args" + i, ((MultipartFile) args[i]).getOriginalFilename());
|
||||
}else {
|
||||
} else {
|
||||
paramMap.put("args" + i, args[i]);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,21 +1,14 @@
|
|||
package cn.stylefeng.roses.kernel.log.db;
|
||||
|
||||
import cn.hutool.core.bean.BeanUtil;
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import cn.stylefeng.roses.kernel.db.api.factory.PageFactory;
|
||||
import cn.stylefeng.roses.kernel.db.api.factory.PageResultFactory;
|
||||
import cn.stylefeng.roses.kernel.db.api.pojo.entity.BaseEntity;
|
||||
import cn.hutool.core.collection.CollUtil;
|
||||
import cn.stylefeng.roses.kernel.db.api.pojo.page.PageResult;
|
||||
import cn.stylefeng.roses.kernel.log.api.LogManagerApi;
|
||||
import cn.stylefeng.roses.kernel.log.api.pojo.manage.LogManagerParam;
|
||||
import cn.stylefeng.roses.kernel.log.api.pojo.manage.LogManagerRequest;
|
||||
import cn.stylefeng.roses.kernel.log.api.pojo.record.LogRecordDTO;
|
||||
import cn.stylefeng.roses.kernel.log.db.entity.SysLog;
|
||||
import cn.stylefeng.roses.kernel.log.db.service.SysLogService;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.transaction.annotation.Transactional;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.util.List;
|
||||
|
@ -36,140 +29,35 @@ public class DbLogManagerServiceImpl implements LogManagerApi {
|
|||
private SysLogService sysLogService;
|
||||
|
||||
@Override
|
||||
public List<LogRecordDTO> queryLogList(LogManagerParam logManagerParam) {
|
||||
PageResult<LogRecordDTO> logRecordDtoPageResult = queryLogListPage(logManagerParam);
|
||||
return logRecordDtoPageResult.getRows();
|
||||
public List<LogRecordDTO> findList(LogManagerRequest logManagerRequest) {
|
||||
List<SysLog> sysLogList = this.sysLogService.findList(logManagerRequest);
|
||||
List<LogRecordDTO> logRecordDTOList = CollUtil.newArrayList();
|
||||
BeanUtil.copyProperties(sysLogList, logRecordDTOList);
|
||||
return logRecordDTOList;
|
||||
}
|
||||
|
||||
@Override
|
||||
public PageResult<LogRecordDTO> queryLogListPage(LogManagerParam logManagerParam) {
|
||||
if (ObjectUtil.isEmpty(logManagerParam)) {
|
||||
return new PageResult<>();
|
||||
}
|
||||
public PageResult<LogRecordDTO> findPage(LogManagerRequest logManagerRequest) {
|
||||
PageResult<SysLog> sysLogPageResult = this.sysLogService.findPage(logManagerRequest);
|
||||
|
||||
LambdaQueryWrapper<SysLog> sysLogLambdaQueryWrapper = new LambdaQueryWrapper<>();
|
||||
|
||||
// 创建查询条件
|
||||
createQueryCondition(logManagerParam, sysLogLambdaQueryWrapper);
|
||||
|
||||
// 查询分页结果
|
||||
Page<SysLog> objectPage = PageFactory.defaultPage();
|
||||
Page<SysLog> page = sysLogService.page(objectPage, sysLogLambdaQueryWrapper);
|
||||
|
||||
PageResult<SysLog> pageResult = PageResultFactory.createPageResult(page);
|
||||
PageResult<LogRecordDTO> logRecordDtoPageResult = new PageResult<>();
|
||||
BeanUtil.copyProperties(pageResult, logRecordDtoPageResult);
|
||||
|
||||
return logRecordDtoPageResult;
|
||||
// 分页类型转换
|
||||
PageResult<LogRecordDTO> logRecordDTOPageResult = new PageResult<>();
|
||||
BeanUtil.copyProperties(sysLogPageResult, logRecordDTOPageResult);
|
||||
return logRecordDTOPageResult;
|
||||
}
|
||||
|
||||
@Transactional(rollbackFor = {Exception.class})
|
||||
@Override
|
||||
public void deleteLogs(LogManagerParam logManagerParam) {
|
||||
if (ObjectUtil.isEmpty(logManagerParam)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// 获取参数
|
||||
String beginDateTime = logManagerParam.getBeginDateTime();
|
||||
String endDateTime = logManagerParam.getEndDateTime();
|
||||
String appName = logManagerParam.getAppName();
|
||||
|
||||
LogManagerParam param = new LogManagerParam();
|
||||
param.setBeginDateTime(beginDateTime);
|
||||
param.setEndDateTime(endDateTime);
|
||||
param.setAppName(appName);
|
||||
|
||||
LambdaQueryWrapper<SysLog> sysLogLambdaQueryWrapper = new LambdaQueryWrapper<>();
|
||||
|
||||
// 创建查询条件
|
||||
createQueryCondition(param, sysLogLambdaQueryWrapper);
|
||||
|
||||
// 删除指定条件日志
|
||||
sysLogService.remove(sysLogLambdaQueryWrapper);
|
||||
public void del(LogManagerRequest logManagerRequest) {
|
||||
this.sysLogService.del(logManagerRequest);
|
||||
}
|
||||
|
||||
/**
|
||||
* 创建查询条件
|
||||
*
|
||||
* @param logManagerParam 日志管理的查询参数
|
||||
* @param sysLogLambdaQueryWrapper mp的查询条件
|
||||
* @author luojie
|
||||
* @date 2020/11/3 11:22
|
||||
*/
|
||||
private void createQueryCondition(LogManagerParam logManagerParam, LambdaQueryWrapper<SysLog> sysLogLambdaQueryWrapper) {
|
||||
|
||||
// 设置查询条件的起始时间和结束时间
|
||||
if (StrUtil.isNotBlank(logManagerParam.getBeginDateTime()) && StrUtil.isNotBlank(logManagerParam.getEndDateTime())) {
|
||||
sysLogLambdaQueryWrapper.between(SysLog::getCreateTime, logManagerParam.getBeginDateTime(), logManagerParam.getEndDateTime());
|
||||
}
|
||||
|
||||
// 根据日志名称查询
|
||||
String name = logManagerParam.getLogName();
|
||||
if (StrUtil.isNotEmpty(name)) {
|
||||
sysLogLambdaQueryWrapper.and(q -> {
|
||||
q.eq(SysLog::getLogName, name);
|
||||
});
|
||||
}
|
||||
|
||||
// 根据服务名称查询
|
||||
String appName = logManagerParam.getAppName();
|
||||
if (StrUtil.isNotEmpty(appName)) {
|
||||
sysLogLambdaQueryWrapper.and(q -> {
|
||||
q.eq(SysLog::getAppName, appName);
|
||||
});
|
||||
}
|
||||
|
||||
// 根据服务端ip查询
|
||||
String serverIp = logManagerParam.getServerIp();
|
||||
if (StrUtil.isNotEmpty(serverIp)) {
|
||||
sysLogLambdaQueryWrapper.and(q -> {
|
||||
q.eq(SysLog::getServerIp, serverIp);
|
||||
});
|
||||
}
|
||||
|
||||
// 根据客户端请求的用户id查询
|
||||
Long userId = logManagerParam.getUserId();
|
||||
if (userId != null) {
|
||||
sysLogLambdaQueryWrapper.and(q -> {
|
||||
q.eq(SysLog::getUserId, userId);
|
||||
});
|
||||
}
|
||||
|
||||
// 根据客户端的ip查询
|
||||
String clientIp = logManagerParam.getClientIp();
|
||||
if (StrUtil.isNotEmpty(clientIp)) {
|
||||
sysLogLambdaQueryWrapper.and(q -> {
|
||||
q.eq(SysLog::getClientIp, clientIp);
|
||||
});
|
||||
}
|
||||
|
||||
// 根据当前用户请求的url查询
|
||||
String url = logManagerParam.getRequestUrl();
|
||||
if (StrUtil.isNotEmpty(clientIp)) {
|
||||
sysLogLambdaQueryWrapper.and(q -> {
|
||||
q.like(SysLog::getRequestUrl, url);
|
||||
});
|
||||
}
|
||||
|
||||
// 查询特定字段
|
||||
sysLogLambdaQueryWrapper.select(
|
||||
SysLog::getLogId,
|
||||
SysLog::getLogName,
|
||||
SysLog::getLogContent,
|
||||
SysLog::getAppName,
|
||||
SysLog::getRequestUrl,
|
||||
SysLog::getServerIp,
|
||||
SysLog::getClientIp,
|
||||
SysLog::getUserId,
|
||||
SysLog::getHttpMethod,
|
||||
SysLog::getClientBrowser,
|
||||
SysLog::getClientOs,
|
||||
BaseEntity::getCreateTime,
|
||||
BaseEntity::getUpdateTime);
|
||||
|
||||
// 根据时间倒序排序
|
||||
sysLogLambdaQueryWrapper.orderByDesc(SysLog::getCreateTime);
|
||||
@Override
|
||||
public LogRecordDTO detail(LogManagerRequest logManagerRequest) {
|
||||
SysLog detail = this.sysLogService.detail(logManagerRequest);
|
||||
LogRecordDTO logRecordDTO = new LogRecordDTO();
|
||||
BeanUtil.copyProperties(detail, logRecordDTO);
|
||||
return logRecordDTO;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -62,17 +62,17 @@ public class DbLogRecordServiceImpl implements LogRecordApi {
|
|||
}
|
||||
|
||||
@Override
|
||||
public void recordLog(LogRecordDTO logRecordDTO) {
|
||||
public void add(LogRecordDTO logRecordDTO) {
|
||||
if (logRecordDTO == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
// 输出日志
|
||||
recordLogByList(CollectionUtil.list(false, logRecordDTO));
|
||||
addBatch(CollectionUtil.list(false, logRecordDTO));
|
||||
}
|
||||
|
||||
@Override
|
||||
public void recordLogByList(List<LogRecordDTO> logRecords) {
|
||||
public void addBatch(List<LogRecordDTO> logRecords) {
|
||||
|
||||
if (ObjectUtil.isEmpty(logRecords)) {
|
||||
return;
|
||||
|
@ -101,7 +101,7 @@ public class DbLogRecordServiceImpl implements LogRecordApi {
|
|||
}
|
||||
|
||||
@Override
|
||||
public void recordLogAsync(LogRecordDTO logRecordDTO) {
|
||||
public void addAsync(LogRecordDTO logRecordDTO) {
|
||||
logManagerThreadPool.executeLog(new TimerTask() {
|
||||
@Override
|
||||
public void run() {
|
||||
|
@ -217,7 +217,7 @@ public class DbLogRecordServiceImpl implements LogRecordApi {
|
|||
}
|
||||
|
||||
// 调用方法刷新到磁盘
|
||||
recordLogByList(cacheAll);
|
||||
addBatch(cacheAll);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -1,9 +1,12 @@
|
|||
package cn.stylefeng.roses.kernel.log.db.service;
|
||||
|
||||
import cn.stylefeng.roses.kernel.log.api.pojo.manage.LogManagerParam;
|
||||
import cn.stylefeng.roses.kernel.db.api.pojo.page.PageResult;
|
||||
import cn.stylefeng.roses.kernel.log.api.pojo.manage.LogManagerRequest;
|
||||
import cn.stylefeng.roses.kernel.log.db.entity.SysLog;
|
||||
import com.baomidou.mybatisplus.extension.service.IService;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 日志记录 service接口
|
||||
*
|
||||
|
@ -12,12 +15,58 @@ import com.baomidou.mybatisplus.extension.service.IService;
|
|||
*/
|
||||
public interface SysLogService extends IService<SysLog> {
|
||||
|
||||
/**
|
||||
* 新增
|
||||
*
|
||||
* @param logManagerRequest 参数对象
|
||||
* @author chenjinlong
|
||||
* @date 2021/1/26 12:52
|
||||
*/
|
||||
void add(LogManagerRequest logManagerRequest);
|
||||
|
||||
/**
|
||||
* 删除
|
||||
*
|
||||
* @param logManagerRequest 参数对象
|
||||
* @author chenjinlong
|
||||
* @date 2021/1/26 12:52
|
||||
*/
|
||||
void del(LogManagerRequest logManagerRequest);
|
||||
|
||||
/**
|
||||
* 删除所有数据
|
||||
*
|
||||
* @param logManagerRequest 参数对象
|
||||
* @author chenjinlong
|
||||
* @date 2021/1/26 12:52
|
||||
*/
|
||||
void delAll(LogManagerRequest logManagerRequest);
|
||||
|
||||
/**
|
||||
* 查看日志详情
|
||||
*
|
||||
* @author TSQ
|
||||
* @date 2021/1/11 17:51
|
||||
*/
|
||||
SysLog detail(LogManagerParam logManagerParam);
|
||||
SysLog detail(LogManagerRequest logManagerParam);
|
||||
|
||||
|
||||
/**
|
||||
* 查询-列表-按实体对象
|
||||
*
|
||||
* @param logManagerParam 参数对象
|
||||
* @author chenjinlong
|
||||
* @date 2021/1/26 12:52
|
||||
*/
|
||||
List<SysLog> findList(LogManagerRequest logManagerParam);
|
||||
|
||||
/**
|
||||
* 查询-列表-分页-按实体对象
|
||||
*
|
||||
* @param logManagerParam 参数对象
|
||||
* @author chenjinlong
|
||||
* @date 2021/1/26 12:52
|
||||
*/
|
||||
PageResult<SysLog> findPage(LogManagerRequest logManagerParam);
|
||||
|
||||
}
|
||||
|
|
|
@ -1,12 +1,22 @@
|
|||
package cn.stylefeng.roses.kernel.log.db.service.impl;
|
||||
|
||||
import cn.stylefeng.roses.kernel.log.api.pojo.manage.LogManagerParam;
|
||||
import cn.hutool.core.bean.BeanUtil;
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import cn.stylefeng.roses.kernel.db.api.factory.PageFactory;
|
||||
import cn.stylefeng.roses.kernel.db.api.factory.PageResultFactory;
|
||||
import cn.stylefeng.roses.kernel.db.api.pojo.page.PageResult;
|
||||
import cn.stylefeng.roses.kernel.log.api.pojo.manage.LogManagerRequest;
|
||||
import cn.stylefeng.roses.kernel.log.db.entity.SysLog;
|
||||
import cn.stylefeng.roses.kernel.log.db.mapper.SysLogMapper;
|
||||
import cn.stylefeng.roses.kernel.log.db.service.SysLogService;
|
||||
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
||||
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
||||
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 日志记录 service接口实现类
|
||||
*
|
||||
|
@ -16,19 +26,89 @@ import org.springframework.stereotype.Service;
|
|||
@Service
|
||||
public class SysLogServiceImpl extends ServiceImpl<SysLogMapper, SysLog> implements SysLogService {
|
||||
|
||||
|
||||
@Override
|
||||
public SysLog detail(LogManagerParam logManagerParam) {
|
||||
return this.querySysLog(logManagerParam);
|
||||
public void add(LogManagerRequest logManagerRequest) {
|
||||
SysLog sysLog = new SysLog();
|
||||
BeanUtil.copyProperties(logManagerRequest, sysLog);
|
||||
this.save(sysLog);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void del(LogManagerRequest logManagerRequest) {
|
||||
SysLog sysLog = this.querySysLogById(logManagerRequest);
|
||||
this.removeById(sysLog.getLogId());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void delAll(LogManagerRequest logManagerRequest) {
|
||||
this.remove(null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public SysLog detail(LogManagerRequest logManagerRequest) {
|
||||
LambdaQueryWrapper<SysLog> queryWrapper = this.createWrapper(logManagerRequest);
|
||||
return this.getOne(queryWrapper, false);
|
||||
}
|
||||
|
||||
|
||||
@Override
|
||||
public List<SysLog> findList(LogManagerRequest logManagerRequest) {
|
||||
LambdaQueryWrapper<SysLog> wrapper = this.createWrapper(logManagerRequest);
|
||||
return this.list(wrapper);
|
||||
}
|
||||
|
||||
@Override
|
||||
public PageResult<SysLog> findPage(LogManagerRequest logManagerRequest) {
|
||||
LambdaQueryWrapper<SysLog> wrapper = createWrapper(logManagerRequest);
|
||||
Page<SysLog> page = this.page(PageFactory.defaultPage(), wrapper);
|
||||
return PageResultFactory.createPageResult(page);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 根据主键id获取对象
|
||||
*
|
||||
* @author chenjinlong
|
||||
* @date 2021/1/26 13:28
|
||||
*/
|
||||
private SysLog querySysLogById(LogManagerRequest logManagerRequest) {
|
||||
SysLog sysLog = this.getById(logManagerRequest.getLogId());
|
||||
return sysLog;
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询日志详细信息
|
||||
* 实体构建queryWrapper
|
||||
*
|
||||
* @author TSQ
|
||||
* @date 2021/1/11 17:54
|
||||
* @author chenjinlong
|
||||
* @date 2021/1/24 22:03
|
||||
*/
|
||||
private SysLog querySysLog(LogManagerParam logManagerParam) {
|
||||
return this.getById(logManagerParam.getLogId());
|
||||
private LambdaQueryWrapper<SysLog> createWrapper(LogManagerRequest logManagerRequest) {
|
||||
LambdaQueryWrapper<SysLog> queryWrapper = new LambdaQueryWrapper<>();
|
||||
|
||||
String beginDateTime = logManagerRequest.getBeginDateTime();
|
||||
String endDateTime = logManagerRequest.getEndDateTime();
|
||||
// SQL条件拼接
|
||||
String name = logManagerRequest.getLogName();
|
||||
String appName = logManagerRequest.getAppName();
|
||||
String serverIp = logManagerRequest.getServerIp();
|
||||
Long userId = logManagerRequest.getUserId();
|
||||
String clientIp = logManagerRequest.getClientIp();
|
||||
String url = logManagerRequest.getRequestUrl();
|
||||
|
||||
queryWrapper.between(!StrUtil.isAllBlank(beginDateTime, endDateTime), SysLog::getCreateTime, beginDateTime, endDateTime);
|
||||
queryWrapper.eq(StrUtil.isNotEmpty(name), SysLog::getLogName, name);
|
||||
queryWrapper.eq(StrUtil.isNotEmpty(appName), SysLog::getAppName, appName);
|
||||
queryWrapper.eq(StrUtil.isNotEmpty(serverIp), SysLog::getServerIp, serverIp);
|
||||
queryWrapper.eq(ObjectUtil.isNotNull(userId), SysLog::getUserId, userId);
|
||||
queryWrapper.eq(StrUtil.isNotEmpty(clientIp), SysLog::getClientIp, clientIp);
|
||||
queryWrapper.eq(StrUtil.isNotEmpty(url), SysLog::getRequestUrl, url);
|
||||
|
||||
// 根据时间倒序排序
|
||||
queryWrapper.orderByDesc(SysLog::getCreateTime);
|
||||
|
||||
return queryWrapper;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -2,18 +2,18 @@ package cn.stylefeng.roses.kernel.log.file;
|
|||
|
||||
import cn.hutool.core.date.DateUtil;
|
||||
import cn.hutool.core.io.FileUtil;
|
||||
import cn.hutool.core.lang.Dict;
|
||||
import cn.hutool.core.util.ObjectUtil;
|
||||
import cn.stylefeng.roses.kernel.auth.api.context.LoginContext;
|
||||
import cn.stylefeng.roses.kernel.db.api.pojo.page.PageResult;
|
||||
import cn.stylefeng.roses.kernel.log.api.LogManagerApi;
|
||||
import cn.stylefeng.roses.kernel.log.api.exception.LogException;
|
||||
import cn.stylefeng.roses.kernel.log.api.pojo.manage.LogManagerParam;
|
||||
import cn.stylefeng.roses.kernel.log.api.pojo.manage.LogManagerRequest;
|
||||
import cn.stylefeng.roses.kernel.log.api.pojo.record.LogRecordDTO;
|
||||
import com.alibaba.fastjson.JSON;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.RandomAccessFile;
|
||||
import java.io.*;
|
||||
import java.text.ParseException;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.ArrayList;
|
||||
|
@ -38,6 +38,8 @@ public class FileLogManagerServiceImpl implements LogManagerApi {
|
|||
|
||||
private final String fileSavePath;
|
||||
|
||||
private Integer total;
|
||||
|
||||
/**
|
||||
* 构造函数
|
||||
*
|
||||
|
@ -48,14 +50,13 @@ public class FileLogManagerServiceImpl implements LogManagerApi {
|
|||
}
|
||||
|
||||
@Override
|
||||
public List<LogRecordDTO> queryLogList(LogManagerParam logManagerParam) {
|
||||
logManagerParam.setPageSize(1000);
|
||||
PageResult<LogRecordDTO> pageResult = queryLogListPage(logManagerParam);
|
||||
public List<LogRecordDTO> findList(LogManagerRequest logManagerParam) {
|
||||
PageResult<LogRecordDTO> pageResult = findPage(logManagerParam);
|
||||
return pageResult.getRows();
|
||||
}
|
||||
|
||||
@Override
|
||||
public PageResult<LogRecordDTO> queryLogListPage(LogManagerParam logManagerParam) {
|
||||
public PageResult<LogRecordDTO> findPage(LogManagerRequest logManagerParam) {
|
||||
|
||||
// 文件日志,必须有AppName,否则文件太多太大
|
||||
if (ObjectUtil.isEmpty(logManagerParam.getAppName())) {
|
||||
|
@ -93,12 +94,12 @@ public class FileLogManagerServiceImpl implements LogManagerApi {
|
|||
// 读取日志
|
||||
List<LogRecordDTO> dtos = readLog(filePath, filePointer, logManagerParam.getPageSize());
|
||||
pageResult.setRows(dtos);
|
||||
|
||||
pageResult.setTotalRows(total);
|
||||
return pageResult;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void deleteLogs(LogManagerParam logManagerParam) {
|
||||
public void del(LogManagerRequest logManagerParam) {
|
||||
|
||||
// 删除操作,必须有appName
|
||||
if (ObjectUtil.isEmpty(logManagerParam.getAppName())) {
|
||||
|
@ -131,6 +132,24 @@ public class FileLogManagerServiceImpl implements LogManagerApi {
|
|||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public LogRecordDTO detail(LogManagerRequest logManagerRequest) {
|
||||
|
||||
// 文件日志,必须有AppName,否则文件太多太大
|
||||
if (ObjectUtil.isEmpty(logManagerRequest.getAppName())) {
|
||||
throw new LogException(APP_NAME_NOT_EXIST);
|
||||
}
|
||||
|
||||
// 文件日志,必须有开始时间,否则文件太多太大
|
||||
if (ObjectUtil.isEmpty(logManagerRequest.getBeginDateTime())) {
|
||||
throw new LogException(BEGIN_DATETIME_NOT_EXIST);
|
||||
}
|
||||
|
||||
// 获取文件路径
|
||||
String filePath = getLogPath(logManagerRequest.getAppName(), logManagerRequest.getBeginDateTime());
|
||||
return this.readLog(filePath, logManagerRequest.getLogId());
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据app名称和日期获取日志文件全路径
|
||||
*
|
||||
|
@ -150,6 +169,49 @@ public class FileLogManagerServiceImpl implements LogManagerApi {
|
|||
return fileAbsolutePath + fileName;
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据id获取日志记录
|
||||
*
|
||||
* @param
|
||||
* @return
|
||||
* @author chenjinlong
|
||||
* @date 2021/2/1 19:54
|
||||
*/
|
||||
private LogRecordDTO readLog(String path, Long logId) {
|
||||
|
||||
// 判断文件是否存在,不存在直接返回Null
|
||||
if (!FileUtil.exist(path)) {
|
||||
return null;
|
||||
}
|
||||
|
||||
LogRecordDTO logRecordDTO = new LogRecordDTO();
|
||||
RandomAccessFile file;
|
||||
try {
|
||||
// 创建随机读文件流
|
||||
file = new RandomAccessFile(path, "r");
|
||||
|
||||
while (true) {
|
||||
|
||||
String str = file.readLine();
|
||||
|
||||
// 读取到的字符串不为空
|
||||
if (ObjectUtil.isNotEmpty(str)) {
|
||||
logRecordDTO = parseObject(str);
|
||||
if (logRecordDTO.getLogId().equals(logId)) {
|
||||
return logRecordDTO;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
} catch (Exception e) {
|
||||
if (log.isDebugEnabled()) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
log.error(e.getMessage());
|
||||
}
|
||||
return logRecordDTO;
|
||||
}
|
||||
|
||||
/**
|
||||
* 从指定的文件指针处,开始读取指定行数的数据
|
||||
*
|
||||
|
@ -191,8 +253,12 @@ public class FileLogManagerServiceImpl implements LogManagerApi {
|
|||
}
|
||||
}
|
||||
|
||||
//获取总行数
|
||||
|
||||
total = getTotalLines(new File(path));
|
||||
|
||||
// 在用户信息中记录当前用户读取的文件指针
|
||||
LoginContext.me().getLoginUser().getOtherInfos().put("filePointer", file.getFilePointer());
|
||||
LoginContext.me().getLoginUser().setOtherInfos(Dict.create().set("filePointer", file.getFilePointer()));
|
||||
|
||||
} catch (Exception e) {
|
||||
if (log.isDebugEnabled()) {
|
||||
|
@ -280,4 +346,21 @@ public class FileLogManagerServiceImpl implements LogManagerApi {
|
|||
return list;
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取总行数
|
||||
*
|
||||
* @param file 日志文件路径
|
||||
* @return 日志总行数
|
||||
* @author chenjinlong
|
||||
* @date 2021/2/1 19:45
|
||||
*/
|
||||
public int getTotalLines(File file) throws IOException {
|
||||
FileReader in = new FileReader(file);
|
||||
LineNumberReader reader = new LineNumberReader(in);
|
||||
reader.skip(Long.MAX_VALUE);
|
||||
int lines = reader.getLineNumber();
|
||||
reader.close();
|
||||
return lines;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -59,14 +59,14 @@ public class FileLogRecordServiceImpl implements LogRecordApi {
|
|||
* @date 2020/10/28 15:53
|
||||
*/
|
||||
@Override
|
||||
public void recordLog(LogRecordDTO logRecordDTO) {
|
||||
public void add(LogRecordDTO logRecordDTO) {
|
||||
|
||||
if (logRecordDTO == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
// 输出日志
|
||||
recordLogByList(CollectionUtil.list(false, logRecordDTO));
|
||||
addBatch(CollectionUtil.list(false, logRecordDTO));
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -77,7 +77,7 @@ public class FileLogRecordServiceImpl implements LogRecordApi {
|
|||
* @date 2020/11/2 下午2:59
|
||||
*/
|
||||
@Override
|
||||
public void recordLogByList(List<LogRecordDTO> list) {
|
||||
public void addBatch(List<LogRecordDTO> list) {
|
||||
|
||||
if (ObjectUtil.isEmpty(list)) {
|
||||
return;
|
||||
|
@ -119,7 +119,7 @@ public class FileLogRecordServiceImpl implements LogRecordApi {
|
|||
}
|
||||
|
||||
@Override
|
||||
public void recordLogAsync(LogRecordDTO logRecordDTO) {
|
||||
public void addAsync(LogRecordDTO logRecordDTO) {
|
||||
logManagerThreadPool.executeLog(new TimerTask() {
|
||||
@Override
|
||||
public void run() {
|
||||
|
@ -242,7 +242,7 @@ public class FileLogRecordServiceImpl implements LogRecordApi {
|
|||
}
|
||||
|
||||
// 调用方法刷新到磁盘
|
||||
recordLogByList(cacheAll);
|
||||
addBatch(cacheAll);
|
||||
|
||||
} catch (Exception e) {
|
||||
|
||||
|
|
|
@ -46,7 +46,7 @@ public interface SysLoginLogService extends IService<SysLoginLog>, LoginLogServi
|
|||
* @author chenjinlong
|
||||
* @date 2021/1/13 10:55
|
||||
*/
|
||||
void delete(SysLoginLogRequest sysLoginLogRequest);
|
||||
void del(SysLoginLogRequest sysLoginLogRequest);
|
||||
|
||||
|
||||
/**
|
||||
|
|
|
@ -79,19 +79,21 @@ public class SysLoginLogServiceImpl extends ServiceImpl<SysLoginLogMapper, SysLo
|
|||
this.save(sysLoginLog);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void delete(SysLoginLogRequest sysLoginLogRequest) {
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public void deleteAll() {
|
||||
this.remove(null);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void del(SysLoginLogRequest sysLoginLogRequest) {
|
||||
SysLoginLog sysLoginLog = this.querySysLoginLogById(sysLoginLogRequest);
|
||||
this.removeById(sysLoginLog.getLlgId());
|
||||
}
|
||||
|
||||
@Override
|
||||
public SysLoginLog detail(SysLoginLogRequest sysLoginLogRequest) {
|
||||
return this.querySysLoginLog(sysLoginLogRequest);
|
||||
LambdaQueryWrapper<SysLoginLog> queryWrapper = this.createWrapper(sysLoginLogRequest);
|
||||
return this.getOne(queryWrapper, false);
|
||||
}
|
||||
|
||||
@Override
|
||||
|
@ -108,7 +110,7 @@ public class SysLoginLogServiceImpl extends ServiceImpl<SysLoginLogMapper, SysLo
|
|||
* @author chenjinlong
|
||||
* @date 2021/1/13 10:50
|
||||
*/
|
||||
private SysLoginLog querySysLoginLog(SysLoginLogRequest sysLoginLogRequest) {
|
||||
private SysLoginLog querySysLoginLogById(SysLoginLogRequest sysLoginLogRequest) {
|
||||
SysLoginLog sysLoginLog = this.getById(sysLoginLogRequest.getLlgId());
|
||||
if (ObjectUtil.isNull(sysLoginLog)) {
|
||||
throw new ServiceException(AppExceptionEnum.APP_NOT_EXIST);
|
||||
|
@ -124,9 +126,12 @@ public class SysLoginLogServiceImpl extends ServiceImpl<SysLoginLogMapper, SysLo
|
|||
*/
|
||||
private LambdaQueryWrapper<SysLoginLog> createWrapper(SysLoginLogRequest sysLoginLogRequest) {
|
||||
LambdaQueryWrapper<SysLoginLog> queryWrapper = new LambdaQueryWrapper<>();
|
||||
|
||||
// SQL条件拼接
|
||||
queryWrapper.eq(StrUtil.isNotBlank(sysLoginLogRequest.getLlgName()), SysLoginLog::getLlgName, sysLoginLogRequest.getLlgName());
|
||||
queryWrapper.ge(StrUtil.isNotBlank(sysLoginLogRequest.getBeginTime()), SysLoginLog::getCreateTime, sysLoginLogRequest.getBeginTime());
|
||||
queryWrapper.le(StrUtil.isNotBlank(sysLoginLogRequest.getEndTime()), SysLoginLog::getCreateTime, sysLoginLogRequest.getEndTime());
|
||||
|
||||
return queryWrapper;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue