fix:lucene日志地址

This commit is contained in:
zhangzq
2026-06-18 14:39:20 +08:00
parent 7e1bacded8
commit b14042dd68
16 changed files with 247 additions and 66 deletions

View File

@@ -2,7 +2,7 @@ import request from '@/utils/request'
export function getLogData(param) {
return request({
url: 'api/lucene/getAll',
url: 'api/lucene/query',
method: 'post',
data: param
})
@@ -16,14 +16,14 @@ export function getTagName() {
}
export function deleteAllLog() {
return request({
url: 'api/lucene/deleteAllLog',
url: 'api/lucene/clearLogs',
method: 'post'
})
}
export function labelsValues() {
return request({
url: 'api/loki/labels/values',
url: 'api/lucene/labels/values',
method: 'get'
})
}

View File

@@ -7,24 +7,9 @@
label-width="=100px"
label-suffix=":"
>
<el-form-item :label="$t('Log.label')">
<el-select
v-model="query.label"
clearable
size="mini"
:placeholder="$t('Log.label')"
style="width: 240px;"
>
<el-option
v-for="item in tagList"
:label="item"
:value="item"
/>
</el-select>
</el-form-item>
<el-form-item :label="$t('Log.level')">
<el-select
v-model="query.level"
v-model="query.logLevel"
clearable
size="mini"
:placeholder="$t('Log.level')"
@@ -36,6 +21,14 @@
/>
</el-select>
</el-form-item>
<el-form-item label="Request Method">
<el-input
v-model="query.requestMethod"
clearable
size="mini"
placeholder="GET/POST/PUT/DELETE"
/>
</el-form-item>
<el-form-item :label="$t('Log.search')">
<el-input
v-model="query.message"
@@ -46,7 +39,7 @@
</el-form-item>
<el-form-item :label="$t('Log.link_id')">
<el-input
v-model="query.tlogTraceId"
v-model="query.traceId"
clearable
size="mini"
:placeholder="$t('Log.link_id_msg')"
@@ -71,9 +64,17 @@
</div>
<!--表格渲染-->
<el-card shadow="hover" style="width: 100%" class="log-warpper">
<div style="width: 100%">
<div v-for="(log, index) in logs" :key="index">
<div style="margin-bottom: 5px; font-size: 14px;" v-html="log" />
<div class="log-list">
<div v-for="(log, index) in logs" :key="index" class="log-item">
<div class="log-meta">
<span v-if="log.requestTime" class="log-time log-badge log-badge-time">{{ log.requestTime }}</span>
<span class="log-level" :class="`log-level-${getLevelClass(log.logLevel)}`">{{ log.logLevel || 'UNKNOWN' }}</span>
<span v-if="log.requestIp" class="log-ip log-badge log-badge-ip">IP: {{ log.requestIp }}</span>
<span v-if="log.requestMethod" class="log-method log-badge log-badge-method">{{ log.requestMethod }}</span>
<span v-if="log.traceId && log.traceId.trim()" class="log-trace log-badge log-badge-trace">traceId: {{ log.traceId }}</span>
<span v-if="log.thread" class="log-thread log-badge log-badge-thread">{{ log.thread }}</span>
</div>
<div class="log-message" v-html="log.messageHtml" />
</div>
</div>
</el-card>
@@ -120,8 +121,12 @@ export default {
logs: [],
tagList: [],
query: {
tlogTraceId: '',
traceId: '',
requestMethod: '',
message: '',
logLevel: '',
startTime: '',
endTime: '',
page: 0,
size: 100,
total: 0,
@@ -131,7 +136,7 @@ export default {
},
created() {
this.queryData()
this.getTagList()
// this.getTagList()
},
methods: {
handleSizeChange(val) {
@@ -142,25 +147,44 @@ export default {
this.query.page = val
this.queryData()
},
getTagList() {
luceneOperation.getTagName().then(res => {
this.tagList = res
})
getLevelClass(level) {
const normalizedLevel = (level || '').toUpperCase()
const levelMap = {
ERROR: 'error',
WARN: 'warn',
INFO: 'info',
DEBUG: 'debug'
}
return levelMap[normalizedLevel] || 'default'
},
formatLogMessage(item, ansi_up) {
const rawMessage = item && typeof item === 'object'
? item.message || JSON.stringify(item)
: String(item || '')
return {
requestTime: item && item.requestTime,
requestIp: item && item.requestIp,
requestMethod: item && item.requestMethod,
logLevel: item && item.logLevel,
thread: item && item.thread,
traceId: item && item.traceId,
messageHtml: ansi_up.ansi_to_html(rawMessage)
}
},
queryData() {
if (this.query.createTime) {
if (this.query.createTime && this.query.createTime.length === 2) {
this.query.startTime = this.query.createTime[0]
this.query.endTime = this.query.createTime[1]
} else {
this.query.startTime = ''
this.query.endTime = ''
}
luceneOperation.getLogData(this.query).then(res => {
this.logs = [] // 清空
this.logs = []
var ansi_up = new AnsiUp()
// 数据初始化
for (const i in res.content) {
this.logs[i] = ansi_up.ansi_to_html(res.content[i])
}
// this.logs = res.content
this.query.total = res.totalElements
const page = Array.isArray(res.page) ? res.page : []
this.logs = page.map(item => this.formatLogMessage(item, ansi_up))
this.query.total = res.total || 0
})
}
}
@@ -168,5 +192,114 @@ export default {
</script>
<style scoped>
.log-list {
width: 100%;
}
.log-item {
margin-bottom: 10px;
padding: 10px 12px;
border-radius: 6px;
background: #fafafa;
border: 1px solid #ebeef5;
}
.log-meta {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 8px;
margin-bottom: 6px;
font-size: 12px;
color: #606266;
}
.log-badge {
display: inline-flex;
align-items: center;
padding: 0 8px;
line-height: 22px;
border-radius: 11px;
border: 1px solid transparent;
}
.log-time,
.log-ip,
.log-method,
.log-thread,
.log-trace {
line-height: 20px;
}
.log-badge-time {
color: #606266;
background: #f4f4f5;
border-color: #dcdfe6;
}
.log-badge-ip {
color: #7c4dff;
background: #f3edff;
border-color: #d9c8ff;
}
.log-badge-method {
color: #0f766e;
background: #ecfdf5;
border-color: #b7ebd3;
font-weight: 500;
}
.log-badge-thread {
color: #8e44ad;
background: #f8f0ff;
border-color: #e2cfff;
}
.log-badge-trace {
color: #c05621;
background: #fff7ed;
border-color: #fbd38d;
}
.log-level {
display: inline-flex;
align-items: center;
justify-content: center;
min-width: 56px;
padding: 0 8px;
line-height: 20px;
border-radius: 10px;
font-size: 12px;
font-weight: 600;
color: #fff;
}
.log-level-error {
background: #f56c6c;
}
.log-level-warn {
background: #e6a23c;
}
.log-level-info {
background: #409eff;
}
.log-level-debug {
background: #909399;
}
.log-level-default {
background: #67c23a;
}
.log-message {
font-size: 14px;
line-height: 1.7;
color: #303133;
word-break: break-word;
white-space: pre-wrap;
}
</style>