This commit is contained in:
2023-03-01 04:45:06 +08:00
parent 80537b08e5
commit 1fdb9d4911
7 changed files with 132 additions and 25 deletions

View File

@@ -34,4 +34,11 @@ public class EsLogController {
return new ResponseEntity<>(esLogService.query(query), HttpStatus.OK); return new ResponseEntity<>(esLogService.query(query), HttpStatus.OK);
} }
@DeleteMapping("/clearLogs")
@ApiOperation("清空日志")
public ResponseEntity<Object> clearLogs(@RequestBody LogQuery query) {
esLogService.clearLogs(query);
return new ResponseEntity<>(HttpStatus.OK);
}
} }

View File

@@ -2,6 +2,7 @@ package org.nl.modules.system.service;
import cn.hutool.db.PageResult; import cn.hutool.db.PageResult;
import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.nl.modules.system.service.dto.LogQuery; import org.nl.modules.system.service.dto.LogQuery;
/** /**
@@ -22,5 +23,10 @@ public interface EsLogService {
* @param logQuery * @param logQuery
* @return * @return
*/ */
PageResult query(LogQuery logQuery); JSONObject query(LogQuery logQuery);
/**
* 清空日志
*/
void clearLogs(LogQuery query);
} }

View File

@@ -21,8 +21,7 @@ import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort; import org.springframework.data.domain.Sort;
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate; import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
import org.springframework.data.elasticsearch.core.aggregation.impl.AggregatedPageImpl; import org.springframework.data.elasticsearch.core.aggregation.impl.AggregatedPageImpl;
import org.springframework.data.elasticsearch.core.query.FetchSourceFilter; import org.springframework.data.elasticsearch.core.query.*;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils; import org.springframework.util.CollectionUtils;
@@ -43,20 +42,42 @@ public class EsLogServiceImpl implements EsLogService {
private final ElasticsearchRestTemplate elasticsearchRestTemplate; private final ElasticsearchRestTemplate elasticsearchRestTemplate;
@Override @Override
public PageResult query(LogQuery logQuery){ public JSONObject query(LogQuery logQuery){
JSONObject res = new JSONObject();
PageResult page = new PageResult(); PageResult page = new PageResult();
if (logQuery != null){ if (logQuery != null){
BoolQueryBuilder query = QueryBuilders.boolQuery(); //requestMethod BoolQueryBuilder query = QueryBuilders.boolQuery(); //requestMethod
extractedParam(logQuery, query); extractedQueryParam(logQuery, query);
Iterable<LogRepositoryDTO> all = esLogRepository.search(query, PageRequest.of(logQuery.getPage()-1,logQuery.getSize(), Sort.by("@timestamp").descending())); Iterable<LogRepositoryDTO> all = esLogRepository.search(query, PageRequest.of(logQuery.getPage()-1,logQuery.getSize(), Sort.by("@timestamp").descending()));
page.addAll(((AggregatedPageImpl) all).getContent()); page.addAll(((AggregatedPageImpl) all).getContent());
page.setTotal((int) ((AggregatedPageImpl) all).getTotalElements()); page.setTotal((int) ((AggregatedPageImpl) all).getTotalElements());
page.setPage(logQuery.getPage()); page.setPage(logQuery.getPage());
page.setPageSize(logQuery.getSize()); page.setPageSize(logQuery.getSize());
res.put("total",page.getTotal());
} }
return page; res.put("page",page);
return res;
} }
@Override
public void clearLogs(LogQuery logQuery) {
BoolQueryBuilder query = QueryBuilders.boolQuery();
extractedParam(logQuery, query);
DeleteQuery deleteQuery = new DeleteQuery();
deleteQuery.setQuery(query);
elasticsearchRestTemplate.delete(deleteQuery,new LogRepositoryDTO().getClass());
}
private void extractedQueryParam(LogQuery logQuery, BoolQueryBuilder query) {
extractedParam(logQuery,query);
if (logQuery.getIsRequest()){
query.must().add(QueryBuilders.existsQuery("requestMethod"));
}
if (logQuery.getFilterSql()){
query.mustNot().add(QueryBuilders.wildcardQuery("logger","org.nl.modules.wql.core.engine.*"));
}
}
private void extractedParam(LogQuery logQuery, BoolQueryBuilder query) { private void extractedParam(LogQuery logQuery, BoolQueryBuilder query) {
if (StringUtils.isNotEmpty(logQuery.getLogLevel())){ if (StringUtils.isNotEmpty(logQuery.getLogLevel())){
@@ -65,12 +86,6 @@ public class EsLogServiceImpl implements EsLogService {
if (StringUtils.isNotEmpty(logQuery.getSystem())){ if (StringUtils.isNotEmpty(logQuery.getSystem())){
query.must().add(QueryBuilders.matchQuery("system", logQuery.getSystem())); query.must().add(QueryBuilders.matchQuery("system", logQuery.getSystem()));
} }
if (logQuery.getIsRequest()){
query.must().add(QueryBuilders.existsQuery("requestMethod"));
}
if (logQuery.getFilterSql()){
query.mustNot().add(QueryBuilders.wildcardQuery("logger","org.nl.modules.wql.core.engine.*"));
}
query.mustNot().add(QueryBuilders.matchPhraseQuery("logger","org.elasticsearch.client.RestClient")); query.mustNot().add(QueryBuilders.matchPhraseQuery("logger","org.elasticsearch.client.RestClient"));
if (StringUtils.isNotEmpty(logQuery.getTraceId())){ if (StringUtils.isNotEmpty(logQuery.getTraceId())){
query.must().add(QueryBuilders.matchQuery("traceId", logQuery.getTraceId())); query.must().add(QueryBuilders.matchQuery("traceId", logQuery.getTraceId()));
@@ -89,7 +104,6 @@ public class EsLogServiceImpl implements EsLogService {
} }
@Override @Override
public JSONArray getLabelsValues(String type) { public JSONArray getLabelsValues(String type) {
JSONArray result = new JSONArray(); JSONArray result = new JSONArray();

View File

@@ -38,7 +38,7 @@ spring:
# url: jdbc:log4jdbc:mysql://${DB_HOST:localhost}:${DB_PORT:3306}/${DB_NAME:whxr_test}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true # url: jdbc:log4jdbc:mysql://${DB_HOST:localhost}:${DB_PORT:3306}/${DB_NAME:whxr_test}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true
url: jdbc:log4jdbc:mysql://${DB_HOST:127.0.0.1}:${DB_PORT:3306}/${DB_NAME:whxr}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true url: jdbc:log4jdbc:mysql://${DB_HOST:127.0.0.1}:${DB_PORT:3306}/${DB_NAME:whxr}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true
username: ${DB_USER:root} username: ${DB_USER:root}
password: ${DB_PWD:942464Yy} password: ${DB_PWD:password}
# username: ${DB_USER:root} # username: ${DB_USER:root}
# password: ${DB_PWD:root} # password: ${DB_PWD:root}
# 初始连接数 # 初始连接数

View File

@@ -119,14 +119,14 @@ https://juejin.cn/post/6844903775631572999
<!--开发环境:打印控制台--> <!--开发环境:打印控制台-->
<springProfile name="dev"> <springProfile name="dev">
<root level="info"> <root level="ERROR">
<appender-ref ref="esLogAppender"/> <appender-ref ref="esLogAppender"/>
<appender-ref ref="CONSOLE"/> <appender-ref ref="CONSOLE"/>
</root> </root>
<!-- <logger name="es-logger" level="warn" additivity="false">--> <logger name="es-logger" level="info" additivity="false">
<!-- <appender-ref ref="esLogAppender"/>--> <appender-ref ref="esLogAppender"/>
<!-- <appender-ref ref="CONSOLE"/>--> <appender-ref ref="CONSOLE"/>
<!-- </logger>--> </logger>
<logger name="org.springframework" level="ERROR" additivity="false"> <logger name="org.springframework" level="ERROR" additivity="false">
<appender-ref ref="CONSOLE"/> <appender-ref ref="CONSOLE"/>
</logger> </logger>

View File

@@ -15,4 +15,12 @@ export function labelsValues(type) {
}) })
} }
export default { getLogData, labelsValues } export function clearLogs(param) {
return request({
url: '/api/esLog/clearLogs',
method: 'delete',
data: param
})
}
export default { getLogData, labelsValues, clearLogs }

View File

@@ -84,7 +84,7 @@
/> />
</el-form-item> </el-form-item>
<el-form-item v-show="showOptions" label="时间段"> <el-form-item v-show="showOptions" label="时间段">
<el-select v-model="timeZoneValue" filterable placeholder="请选择标签" size="mini" @change="queryData"> <el-select ref="timeZoneValueRef" v-model="timeZoneValue" filterable placeholder="请选择标签" size="mini" @change="queryData">
<el-option <el-option
v-for="item in timeZoneOptions" v-for="item in timeZoneOptions"
:key="item.index" :key="item.index"
@@ -118,6 +118,14 @@
:step="1" :step="1"
/> />
</el-form-item> </el-form-item>
<el-form-item label="总条数">
<el-input
v-model="total"
size="small"
disabled
style="width: 110px"
/>
</el-form-item>
<el-form-item> <el-form-item>
<el-dropdown split-button type="primary" size="mini" @click="queryData"> <el-dropdown split-button type="primary" size="mini" @click="queryData">
查询 查询
@@ -126,13 +134,16 @@
</el-dropdown-menu> </el-dropdown-menu>
</el-dropdown> </el-dropdown>
</el-form-item> </el-form-item>
<el-form-item>
<el-button @click="clearLogs">清空日志</el-button>
</el-form-item>
</el-form> </el-form>
</div> </div>
<div style="margin: 3px; min-height: 80vh;"> <div style="margin: 3px; min-height: 80vh;">
<!--数据判空--> <!--数据判空-->
<!-- <dev v-if="showEmpty" :description="emptyText" />--> <!-- <dev v-if="showEmpty" :description="emptyText" />-->
<!--数据加载--> <!--数据加载-->
<el-card shadow="hover" style="width: 100%;overflow-x: scroll" class="log-warpper"> <el-card shadow="hover" style="width: 100%;overflow-x: scroll" class="log-warpper">
<div style="width: 100%"> <div style="width: 100%">
<div v-for="(log, index) in logs" :key="index"> <div v-for="(log, index) in logs" :key="index">
<div> <div>
@@ -187,6 +198,7 @@ export default {
showEmpty: true, showEmpty: true,
emptyText: '请选择标签', emptyText: '请选择标签',
page: 1, page: 1,
total: 0,
runStatu: 'off', runStatu: 'off',
runStatuOptions: [{ runStatuOptions: [{
label: 'off', label: 'off',
@@ -294,13 +306,73 @@ export default {
logOperation.getLogData(queryParam).then(res => { logOperation.getLogData(queryParam).then(res => {
this.showEmpty = false this.showEmpty = false
this.total = res.total
// 清空 // 清空
this.logs = [] this.logs = []
for (const j in res) { // 用push的方式将所有日志数组添加进去 for (const j in res.page) { // 用push的方式将所有日志数组添加进去
this.logs.push(res[j]) this.logs.push(res.page[j])
} }
}) })
}, },
clearLogs() {
var message = '您确定要清空'
if (this.system !== '' && this.system !== null) {
message += '标签为:' + this.system + ' '
}
if (this.logLevelValue !== '' && this.logLevelValue !== null) {
message += '日志级别为:' + this.logLevelValue + ' '
}
if (this.message !== '' && this.message !== null) {
message += '关键字为:' + this.message + ' '
}
if (this.traceId !== '' && this.traceId !== null) {
message += '链路Id为:' + this.traceId + ' '
}
if (this.timeRange !== '' && this.timeRange !== null && this.timeRange.length > 0) {
message += '时间范围为:' + this.timeRange + ' '
}
if (this.timeZoneValue !== '' && this.timeZoneValue !== null) {
message += '时间段为:' + this.$refs.timeZoneValueRef.selected.label + ' '
}
message += '所有的日志吗 ?'
this.$confirm(message, '确认信息', {
distinguishCancelAndClose: true,
confirmButtonText: '确定',
cancelButtonText: '取消'
})
.then(() => {
// 清空查询数据
this.clearParam()
queryParam.logLevel = this.logLevelValue
const time = new Date()
if (this.timeZoneValue !== '') {
queryParam.startTime = new Date(((time.getTime() - this.timeZoneValue)))
}
if (this.timeRange !== '' && this.timeRange.length > 0) {
queryParam.startTime = this.timeRange[0]
queryParam.endTime = this.timeRange[1]
}
queryParam.message = this.message.replace(/^\s*|\s*$/g, '')
queryParam.traceId = this.traceId
queryParam.system = this.system
logOperation.clearLogs(queryParam).then(res => {
this.queryData()
this.$message({
type: 'info',
message: '清除成功'
})
})
})
.catch(action => {
this.$message({
type: 'info',
message: action === 'cancel'
? '已取消'
: '已取消'
})
})
},
changetype() { changetype() {
}, },