日志级别条件支持多选

This commit is contained in:
gotoeasy 2023-09-22 13:33:40 +08:00
parent b96909f71b
commit 451f8975b2
5 changed files with 35 additions and 17 deletions

View File

@ -48,7 +48,7 @@ func (e *Engine) AddLogDataModel(data *logdata.LogDataModel) {
e.logStorage.AddLogDataModel(data)
}
func (e *Engine) Search(searchKey string, system string, minDatetime string, maxDatetime string, loglevel string,
func (e *Engine) Search(searchKey string, system string, minDatetime string, maxDatetime string, loglevel string, loglevels []string,
currentDocId uint32, forward bool) *search.SearchResult {
// 分词后检索
@ -80,7 +80,7 @@ func (e *Engine) Search(searchKey string, system string, minDatetime string, max
}
// 多关键词查询模式
return search.SearchWordIndex(e.storeName, kws, currentDocId, forward, minDatetime, maxDatetime)
return search.SearchWordIndex(e.storeName, kws, loglevels, currentDocId, forward, minDatetime, maxDatetime)
}
// 添加日志

View File

@ -46,7 +46,7 @@ func Test_all(t *testing.T) {
// }
// time.Sleep(time.Duration(5) * time.Second)
rs := engine.Search(` them java `, "", "", "", "", 0, true)
rs := engine.Search(` them java `, "", "", "", "", make([]string, 0), 0, true)
cmn.Println("共查到", rs.Total, "件")
for _, v := range rs.Data {
cmn.Println(v.Id, v.Text)

View File

@ -31,7 +31,7 @@ type WidxStorage struct {
}
// 多关键词时计算关键词索引交集
func SearchWordIndex(storeName string, kws []string, currentDocId uint32, forward bool, minDatetime string, maxDatetime string) *SearchResult {
func SearchWordIndex(storeName string, kws []string, loglevels []string, currentDocId uint32, forward bool, minDatetime string, maxDatetime string) *SearchResult {
storeLogData := storage.NewLogDataStorageHandle(storeName) // 数据
// 时间条件范围判断,默认全部,有检索条件时调整范围
@ -75,7 +75,7 @@ func SearchWordIndex(storeName string, kws []string, currentDocId uint32, forwar
}
widxs = append(widxs, widxStorage)
}
return findSame(currentDocId, forward, minDocumentId, maxDocumentId, storeLogData, widxs...)
return findSame(currentDocId, loglevels, forward, minDocumentId, maxDocumentId, storeLogData, widxs...)
}
// 无关键词时走全量检索
@ -205,8 +205,9 @@ func SearchLogData(storeName string, currentDocId uint32, forward bool, minDatet
}
// 参数widxs长度要求大于1currentDocId不传就是查第一页
func findSame(currentDocId uint32, forward bool, minDocumentId uint32, maxDocumentId uint32, storeLogData *storage.LogDataStorageHandle, widxs ...*WidxStorage) *SearchResult {
func findSame(currentDocId uint32, loglevels []string, forward bool, minDocumentId uint32, maxDocumentId uint32, storeLogData *storage.LogDataStorageHandle, widxs ...*WidxStorage) *SearchResult {
allloglevels := cmn.Join(loglevels, ",")
var rs = new(SearchResult)
rs.Total = cmn.Uint32ToString(storeLogData.TotalCount()) // 日志总量件数
@ -275,8 +276,19 @@ func findSame(currentDocId uint32, forward bool, minDocumentId uint32, maxDocume
}
// 找到则加入结果
if flg {
rsCnt++
rs.Data = append(rs.Data, storeLogData.GetLogDataModel(docId))
md := storeLogData.GetLogDataModel(docId)
if len(loglevels) > 0 {
// 多选条件时做匹配判断
if cmn.ContainsIngoreCase(allloglevels, md.LogLevel) {
rsCnt++
rs.Data = append(rs.Data, md)
}
} else {
// 单选或全选时找到的都是匹配的
rsCnt++
rs.Data = append(rs.Data, md)
}
if rsCnt >= conf.GetPageSize() {
break // 最多找一页
}
@ -288,7 +300,7 @@ func findSame(currentDocId uint32, forward bool, minDocumentId uint32, maxDocume
tmpMinPos-- // 当前最短索引可能不变得正常减1若变化则会被覆盖没有关系
}
} else {
// 有相对文档ID且是前一页方向
// 有相对文档ID且是前一页方向(注:暂未使用,未经测试)
pos++
var ary []*logdata.LogDataModel
for i := pos; i <= totalCount; i++ {

View File

@ -22,17 +22,23 @@ func LogSearchController(req *gweb.HttpRequest) *gweb.HttpResult {
datetimeFrom := req.GetFormParameter("datetimeFrom")
datetimeTo := req.GetFormParameter("datetimeTo")
system := req.GetFormParameter("system")
loglevel := req.GetFormParameter("loglevel")
loglevel := req.GetFormParameter("loglevel") // 单选条件
loglevels := cmn.Split(loglevel, ",") // 多选条件
if len(loglevels) <= 1 || len(loglevels) >= 4 {
loglevels = make([]string, 0) // 多选的单选或全选都清空单选走loglevel索引全选等于没选
}
if !cmn.IsBlank(system) {
system = "~" + cmn.Trim(system)
}
if !cmn.IsBlank(loglevel) {
loglevel = "!" + cmn.Trim(loglevel)
if !cmn.IsBlank(loglevel) && len(loglevels) == 0 {
loglevel = "!" + cmn.Trim(loglevel) // 单个条件时作为索引条件
} else {
loglevel = "" // 多选条件时不使用改用loglevels
}
eng := ldb.NewEngine(storeName)
rs := eng.Search(searchKey, system, datetimeFrom, datetimeTo, loglevel, currentId, forward)
rs := eng.Search(searchKey, system, datetimeFrom, datetimeTo, loglevel, loglevels, currentId, forward)
// 检索结果后处理
rs.PageSize = cmn.IntToString(conf.GetPageSize())

View File

@ -17,8 +17,8 @@
</el-select>
</el-form-item>
<el-form-item label="日志级别">
<el-select v-model="formData.loglevel" :multiple="false" clearable :reserve-keyword="true"
style="width:420px;" placeholder="请选择...">
<el-select v-model="formData.loglevel" multiple clearable :reserve-keyword="true" style="width:420px;"
placeholder="请选择...">
<el-option label="ERROR" value="error" />
<el-option label="WARN" value="warn" />
<el-option label="INFO" value="info" />
@ -205,7 +205,7 @@ function search() {
data.searchKey = formData.value.searchKeys;
data.storeName = formData.value.storage;
data.system = formData.value.system;
data.loglevel = formData.value.loglevel;
data.loglevel = formData.value.loglevel.join(',');
data.datetimeFrom = (formData.value.datetime || ['', ''])[0];
data.datetimeTo = (formData.value.datetime || ['', ''])[1];
@ -251,7 +251,7 @@ function searchMore() {
data.searchKey = formData.value.searchKeys;
data.storeName = formData.value.storage;
data.system = formData.value.system;
data.loglevel = formData.value.loglevel;
data.loglevel = formData.value.loglevel.join(',');
data.datetimeFrom = (formData.value.datetime || ['', ''])[0];
data.datetimeTo = (formData.value.datetime || ['', ''])[1];
data.forward = true