更新
This commit is contained in:
@@ -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);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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}
|
||||||
# 初始连接数
|
# 初始连接数
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
@@ -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 }
|
||||||
|
|||||||
@@ -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() {
|
||||||
|
|
||||||
},
|
},
|
||||||
|
|||||||
Reference in New Issue
Block a user