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);
}
@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 com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.nl.modules.system.service.dto.LogQuery;
/**
@@ -22,5 +23,10 @@ public interface EsLogService {
* @param logQuery
* @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.elasticsearch.core.ElasticsearchRestTemplate;
import org.springframework.data.elasticsearch.core.aggregation.impl.AggregatedPageImpl;
import org.springframework.data.elasticsearch.core.query.FetchSourceFilter;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.springframework.data.elasticsearch.core.query.*;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
@@ -43,20 +42,42 @@ public class EsLogServiceImpl implements EsLogService {
private final ElasticsearchRestTemplate elasticsearchRestTemplate;
@Override
public PageResult query(LogQuery logQuery){
public JSONObject query(LogQuery logQuery){
JSONObject res = new JSONObject();
PageResult page = new PageResult();
if (logQuery != null){
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()));
page.addAll(((AggregatedPageImpl) all).getContent());
page.setTotal((int) ((AggregatedPageImpl) all).getTotalElements());
page.setPage(logQuery.getPage());
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) {
if (StringUtils.isNotEmpty(logQuery.getLogLevel())){
@@ -65,12 +86,6 @@ public class EsLogServiceImpl implements EsLogService {
if (StringUtils.isNotEmpty(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"));
if (StringUtils.isNotEmpty(logQuery.getTraceId())){
query.must().add(QueryBuilders.matchQuery("traceId", logQuery.getTraceId()));
@@ -89,7 +104,6 @@ public class EsLogServiceImpl implements EsLogService {
}
@Override
public JSONArray getLabelsValues(String type) {
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:127.0.0.1}:${DB_PORT:3306}/${DB_NAME:whxr}?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useSSL=false&useOldAliasMetadataBehavior=true
username: ${DB_USER:root}
password: ${DB_PWD:942464Yy}
password: ${DB_PWD:password}
# username: ${DB_USER:root}
# password: ${DB_PWD:root}
# 初始连接数

View File

@@ -119,14 +119,14 @@ https://juejin.cn/post/6844903775631572999
<!--开发环境:打印控制台-->
<springProfile name="dev">
<root level="info">
<root level="ERROR">
<appender-ref ref="esLogAppender"/>
<appender-ref ref="CONSOLE"/>
</root>
<!-- <logger name="es-logger" level="warn" additivity="false">-->
<!-- <appender-ref ref="esLogAppender"/>-->
<!-- <appender-ref ref="CONSOLE"/>-->
<!-- </logger>-->
<logger name="es-logger" level="info" additivity="false">
<appender-ref ref="esLogAppender"/>
<appender-ref ref="CONSOLE"/>
</logger>
<logger name="org.springframework" level="ERROR" additivity="false">
<appender-ref ref="CONSOLE"/>
</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 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
v-for="item in timeZoneOptions"
:key="item.index"
@@ -118,6 +118,14 @@
:step="1"
/>
</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-dropdown split-button type="primary" size="mini" @click="queryData">
查询
@@ -126,13 +134,16 @@
</el-dropdown-menu>
</el-dropdown>
</el-form-item>
<el-form-item>
<el-button @click="clearLogs">清空日志</el-button>
</el-form-item>
</el-form>
</div>
<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 v-for="(log, index) in logs" :key="index">
<div>
@@ -187,6 +198,7 @@ export default {
showEmpty: true,
emptyText: '请选择标签',
page: 1,
total: 0,
runStatu: 'off',
runStatuOptions: [{
label: 'off',
@@ -294,13 +306,73 @@ export default {
logOperation.getLogData(queryParam).then(res => {
this.showEmpty = false
this.total = res.total
// 清空
this.logs = []
for (const j in res) { // 用push的方式将所有日志数组添加进去
this.logs.push(res[j])
for (const j in res.page) { // 用push的方式将所有日志数组添加进去
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() {
},