opt: es查询优化,前端界面优化,解析SQL,复制SQL,去除lucene

This commit is contained in:
2025-05-29 20:08:34 +08:00
parent 5f052bb2b3
commit e0eeb855a7
11 changed files with 241 additions and 394 deletions

View File

@@ -64,6 +64,7 @@
"qs": "^6.9.1",
"screenfull": "4.2.0",
"sortablejs": "1.8.4",
"sql-formatter": "^15.6.2",
"throttle-debounce": "^5.0.0",
"vue": "2.6.10",
"vue-bus": "^1.2.1",

View File

@@ -78,7 +78,7 @@
</el-form>
</div>
<!--表格渲染-->
<el-card shadow="hover" style="width: 100%" class="log-warpper">
<el-card shadow="hover" style="width: 100%; height: 620px; overflow-y: auto" class="log-warpper">
<div style="width: 100%">
<div v-for="(log, index) in logs" :key="index">
<div v-if="compressedView" style="margin-bottom: 5px; font-size: 16px;">
@@ -96,91 +96,85 @@
{{ log.message }}
</span>
</div>
<div v-else style="margin-bottom: 5px; font-size: 16px; border: #999999 1px solid; padding: 5px;">
<el-row>
<el-col :span="2">
<div v-else class="log-detailed">
<el-row class="log-row">
<el-col :span="2" class="log-label">
时间
</el-col>
<el-col :span="22">
<span style="color: #000000;">{{ timestampToDate(log.time) }}</span>
<span class="log-time">{{ timestampToDate(log.time) }}</span>
</el-col>
</el-row>
<el-row>
<el-col :span="2">
<el-row class="log-row">
<el-col :span="2" class="log-label">
host
</el-col>
<el-col :span="22">
<span style="color: #048815;">{{ log.host }}</span>
<span class="log-host">{{ log.host }}</span>
</el-col>
</el-row>
<el-row>
<el-col :span="2">
<el-row class="log-row">
<el-col :span="2" class="log-label">
执行IP
</el-col>
<el-col :span="22">
<span style="color: #000569;">{{ log.currIp === null ? '0.0.0.0' : log.currIp }}</span>
<span class="log-ip">{{ log.currIp === null ? '0.0.0.0' : log.currIp }}</span>
</el-col>
</el-row>
<el-row>
<el-col :span="2">
<el-row class="log-row">
<el-col :span="2" class="log-label">
API路径
</el-col>
<el-col :span="22">
<span style="color: #b9de16;">{{ log.apiPath === null ? '无' : log.apiPath }}</span>
<span class="log-api">{{ log.apiPath === null ? '无' : log.apiPath }}</span>
</el-col>
</el-row>
<el-row>
<el-col :span="2">
<el-row class="log-row">
<el-col :span="2" class="log-label">
MDC标签
</el-col>
<el-col :span="22">
<span style="color: #d20118;">{{ log.tag === null ? '未配置MDC' : log.tag }}</span>
<span class="log-tag">{{ log.tag === null ? '未配置MDC' : log.tag }}</span>
</el-col>
</el-row>
<el-row>
<el-col :span="2">
<el-row class="log-row">
<el-col :span="2" class="log-label">
日志级别
</el-col>
<el-col :span="22">
<span style="color: #111fc7;">{{ log.severity }}</span>
<span :class="['log-level', getLevelClass(log.severity)]">{{ log.severity }}</span>
</el-col>
</el-row>
<el-row>
<el-col :span="2">
<el-row class="log-row">
<el-col :span="2" class="log-label">
类名
</el-col>
<el-col :span="22">
<span style="color: #111fc7;">{{ log.logger }}</span>
<span class="log-logger">{{ log.logger }}</span>
</el-col>
</el-row>
<el-row>
<el-col :span="2">
<el-row class="log-row">
<el-col :span="2" class="log-label">
线程名
</el-col>
<el-col :span="22">
<span style="color: #28b23a;">{{ log.thread }}</span>
<span class="log-thread">{{ log.thread }}</span>
</el-col>
</el-row>
<el-row>
<el-col :span="2">
<el-row class="log-row">
<el-col :span="2" class="log-label">
链路标识
</el-col>
<el-col :span="22">
<span style="color: #d51313;">{{ log.tlogTraceId === null ? '无链路id' : log.tlogTraceId }}</span>
<span class="log-trace">{{ log.tlogTraceId === null ? '无链路id' : log.tlogTraceId }}</span>
</el-col>
</el-row>
<el-row>
<el-col :span="2">
<el-row class="log-row">
<el-col :span="2" class="log-label">
日志信息
</el-col>
<el-col :span="22">
<span
style="color: #000000;"
class="sql-message"
@click="handleCopySQL(log.message)"
>
{{ log.message }}
</span>
<span class="log-message sql-message" @click="handleCopySQL(log.message)">{{ transSQL(log.message) }}</span>
</el-col>
</el-row>
</div>
@@ -203,7 +197,6 @@
<script>
import luceneOperation from '@/views/lucene/api/lucene'
import { default as AnsiUp } from 'ansi_up'
export default {
name: 'LuceneLog',
data() {
@@ -245,6 +238,16 @@ export default {
this.getTagList()
},
methods: {
getLevelClass(level) {
if (!level) return 'level-unknown'
switch (level.toUpperCase()) {
case 'ERROR': return 'level-error'
case 'WARN': return 'level-warn'
case 'DEBUG': return 'level-debug'
case 'INFO': return 'level-info'
default: return 'level-unknown'
}
},
timestampToDate(timestamp) {
const date = new Date(timestamp)
const year = date.getFullYear()
@@ -270,7 +273,16 @@ export default {
this.$message.warning('未检测到可复制的SQL语句')
}
},
transSQL(message) {
const sqlMatch = message.match(/\[ SQL: ([^\]]+)\s*\]/)
// 兼容性更好的写法
if (!sqlMatch || !sqlMatch[1]) {
return message
}
const rawSQL = sqlMatch[1].trim()
return rawSQL
},
// 复制文本到剪贴板
copyToClipboard(text) {
// 现代浏览器方法
@@ -341,13 +353,148 @@ export default {
</script>
<style scoped>
/* 可点击样式提示 */
/* 详细视图样式 */
.log-detailed {
padding: 10px;
border: 1px solid #EBEEF5;
border-radius: 4px;
background-color: #fafafa;
}
.log-row {
margin-bottom: 5px;
line-height: 22px;
}
.log-label {
font-weight: 600;
color: #606266;
text-align: right;
padding-right: 12px;
}
/* 日志元素样式 */
.log-time {
color: #303133;
font-weight: bold;
}
.log-ip {
color: #000569;
padding: 2px 4px;
background-color: #f0f9ff;
border-radius: 3px;
}
.log-level {
font-weight: bold;
padding: 2px 6px;
border-radius: 3px;
}
.level-error .log-level,
.log-level.level-error {
background-color: #fef0f0;
color: #F56C6C;
}
.level-warn .log-level,
.log-level.level-warn {
background-color: #fdf6ec;
color: #E6A23C;
}
.level-info .log-level,
.log-level.level-info {
background-color: #ecf5ff;
color: #409EFF;
}
.level-debug .log-level,
.log-level.level-debug {
background-color: #f0f9eb;
color: #67C23A;
}
.log-logger {
color: #3498db;
font-family: monospace;
max-width: 300px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.log-thread {
color: #28b23a;
font-family: monospace;
}
.log-trace {
color: #d51313;
font-family: monospace;
background-color: #fff7f7;
padding: 2px 4px;
border-radius: 3px;
}
.log-host {
color: #048815;
}
.log-api {
color: #8c6a03;
font-family: monospace;
}
.log-tag {
color: #d20118;
}
.log-message {
color: #000000;
display: block;
margin-top: 4px;
padding: 6px;
background-color: #f8f8f8;
border-radius: 3px;
white-space: pre-wrap;
word-break: break-all;
font-family: monospace;
}
/* SQL语句样式 */
.sql-message {
cursor: pointer;
transition: all 0.3s;
position: relative;
background: #f4faff;
color: #2d8cf0;
font-weight: bold;
border-left: 3px solid #2d8cf0;
transition: background 0.2s;
}
.sql-message:hover {
background-color: #f0f9ff;
box-shadow: 0 0 3px rgba(32, 160, 255, 0.5);
background-color: #ecf5ff;
box-shadow: 0 0 6px rgba(32, 160, 255, 0.3);
}
.sql-message:hover::after {
content: "点击复制SQL";
position: absolute;
right: 10px;
top: 3px;
font-size: 12px;
color: #409EFF;
background-color: #ecf5ff;
padding: 2px 5px;
border-radius: 3px;
}
.sql-message.copied {
background: #e1f3d8;
color: #67c23a;
}
</style>