fix(log): 优化API日志记录和查询功能

- 实现响应体结构化解析,根据RTYPE字段判断请求状态
- 修复前端查询条件触发时机和日期格式化问题
This commit is contained in:
yangyufu
2026-06-11 14:01:47 +08:00
parent d63437e01b
commit 6011afc791
4 changed files with 39 additions and 18 deletions

View File

@@ -1,6 +1,8 @@
package org.nl.modules.logging.aspect; package org.nl.modules.logging.aspect;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil; import cn.hutool.json.JSONUtil;
import com.alibaba.fastjson2.JSONObject;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Around;
@@ -69,12 +71,29 @@ public class ApiLogAspect {
Object result = joinPoint.proceed(); Object result = joinPoint.proceed();
JSONObject jsonObject = JSONObject.parseObject(JSONUtil.toJsonStr(result));
JSONObject jsonObject1 = jsonObject.getJSONObject("body");
if(null == jsonObject1){
logEntity.setResponseStatus(400);
logEntity.setStatus("FAIL");
logEntity.setErrorMsg("返回信息为空,请确认!");
logEntity.setResponseBody("返回信息为空,请确认!");
}else{
String rtype = jsonObject1.getString("RTYPE");
if(rtype.equalsIgnoreCase("E")){
logEntity.setResponseStatus(400);
logEntity.setStatus("FAIL");
logEntity.setErrorMsg(JSONUtil.toJsonStr(result));
logEntity.setResponseBody(JSONUtil.toJsonStr(result));
}else{
logEntity.setResponseStatus(200);
logEntity.setStatus("SUCCESS");
logEntity.setResponseBody(JSONUtil.toJsonStr(result));
}
}
long costTime = System.currentTimeMillis() - startTime; long costTime = System.currentTimeMillis() - startTime;
logEntity.setCostTime(costTime); logEntity.setCostTime(costTime);
logEntity.setResponseStatus(200);
logEntity.setStatus("SUCCESS");
logEntity.setResponseBody(JSONUtil.toJsonStr(result));
return result; return result;
} catch (Throwable throwable) { } catch (Throwable throwable) {

View File

@@ -71,12 +71,14 @@ public class SysApiLogController {
wrapper.eq(SysApiLog::getStatus, query.getStatus()); wrapper.eq(SysApiLog::getStatus, query.getStatus());
} }
if (query.getBeginTime() != null && !query.getBeginTime().isEmpty()) { if (query.getBegin_time() != null && !query.getBegin_time().isEmpty()) {
wrapper.ge(SysApiLog::getCreateTime, query.getBeginTime()); String beginTime = query.getBegin_time() + " 00:00:00";
wrapper.ge(SysApiLog::getCreateTime, beginTime);
} }
if (query.getEndTime() != null && !query.getEndTime().isEmpty()) { if (query.getEnd_time() != null && !query.getEnd_time().isEmpty()) {
wrapper.le(SysApiLog::getCreateTime, query.getEndTime()); String endTime = query.getEnd_time() + " 23:59:59";
wrapper.le(SysApiLog::getCreateTime, endTime);
} }
if (query.getKeyword() != null && !query.getKeyword().isEmpty()) { if (query.getKeyword() != null && !query.getKeyword().isEmpty()) {

View File

@@ -24,9 +24,9 @@ public class ApiLogQuery extends PageQuery {
private String status; private String status;
private String beginTime; private String begin_time;
private String endTime; private String end_time;
private String keyword; private String keyword;

View File

@@ -17,7 +17,6 @@
placeholder="请输入关键字查询" placeholder="请输入关键字查询"
class="filter-item" class="filter-item"
style="width: 200px;" style="width: 200px;"
@keyup.enter.native="crud.toQuery"
/> />
</el-form-item> </el-form-item>
<el-form-item label="接口走向"> <el-form-item label="接口走向">
@@ -27,7 +26,6 @@
size="mini" size="mini"
placeholder="请选择" placeholder="请选择"
class="filter-item" class="filter-item"
@change="crud.toQuery"
> >
<el-option label="出站" :value="0" /> <el-option label="出站" :value="0" />
<el-option label="入站" :value="1" /> <el-option label="入站" :value="1" />
@@ -56,7 +54,6 @@
size="mini" size="mini"
placeholder="请选择" placeholder="请选择"
class="filter-item" class="filter-item"
@change="crud.toQuery"
> >
<el-option <el-option
v-for="item in bizCodeList" v-for="item in bizCodeList"
@@ -73,7 +70,6 @@
size="mini" size="mini"
placeholder="请选择" placeholder="请选择"
class="filter-item" class="filter-item"
@change="crud.toQuery"
> >
<el-option label="SUCCESS" value="SUCCESS" /> <el-option label="SUCCESS" value="SUCCESS" />
<el-option label="FAIL" value="FAIL" /> <el-option label="FAIL" value="FAIL" />
@@ -83,11 +79,10 @@
<el-date-picker <el-date-picker
v-model="query.createTime" v-model="query.createTime"
type="daterange" type="daterange"
value-format="yyyy-MM-dd HH:mm:ss" range-separator=""
start-placeholder="开始日期" start-placeholder="开始日期"
end-placeholder="结束日期" end-placeholder="结束日期"
:default-time="['00:00:00', '23:59:59']" value-format="yyyy-MM-dd"
@change="crud.toQuery"
/> />
</el-form-item> </el-form-item>
<rrOperation /> <rrOperation />
@@ -212,11 +207,16 @@ export default {
name: 'SysApiLog', name: 'SysApiLog',
components: { rrOperation, crudOperation, pagination }, components: { rrOperation, crudOperation, pagination },
cruds() { cruds() {
const today = new Date()
const year = today.getFullYear()
const month = String(today.getMonth() + 1).padStart(2, '0')
const day = String(today.getDate()).padStart(2, '0')
const dateStr = `${year}-${month}-${day}`
return CRUD({ return CRUD({
title: '接口日志', title: '接口日志',
url: 'api/sysApiLog', url: 'api/sysApiLog',
query: { query: {
createTime: [new Date(), new Date()] createTime: [dateStr, dateStr]
} }
}) })
}, },