183 lines
4.0 KiB
Go
183 lines
4.0 KiB
Go
package http
|
||
|
||
import (
|
||
"context"
|
||
"fmt"
|
||
"reflect"
|
||
"strconv"
|
||
"strings"
|
||
"time"
|
||
|
||
"go-common/app/admin/main/aegis/model"
|
||
"go-common/library/database/elastic"
|
||
"go-common/library/log"
|
||
"go-common/library/xstr"
|
||
)
|
||
|
||
//const
|
||
const (
|
||
LogMinYear = 2018
|
||
LogMinTime = "2018-11-01 10:00:00"
|
||
)
|
||
|
||
func setESParams(r *elastic.Request, args interface{}, cm model.EsCommon) {
|
||
av := reflect.ValueOf(args)
|
||
if av.Kind() == reflect.Ptr {
|
||
av = av.Elem()
|
||
}
|
||
if av.Kind() != reflect.Struct {
|
||
return
|
||
}
|
||
|
||
atp := av.Type()
|
||
ranges := map[string]map[string]interface{}{}
|
||
for i := atp.NumField() - 1; i >= 0; i-- {
|
||
fdt := atp.Field(i)
|
||
tag := fdt.Tag.Get("reflect")
|
||
if tag == "ignore" || tag == "" {
|
||
continue
|
||
}
|
||
|
||
fdv := av.Field(i)
|
||
fdk := fdt.Type.Kind()
|
||
if (fdk == reflect.Slice || fdk == reflect.String) && fdv.Len() == 0 {
|
||
continue
|
||
}
|
||
|
||
//default处理
|
||
omitdefault := strings.Index(tag, ",omitdefault")
|
||
tag = strings.Replace(tag, ",omitdefault", "", -1)
|
||
fdvv := fdv.Interface()
|
||
fdvslice := false
|
||
if omitdefault > -1 && fmt.Sprintf("%v", fdvv) == fdt.Tag.Get("default") {
|
||
continue
|
||
}
|
||
|
||
//字段值处理,parse额外处理
|
||
switch fdk {
|
||
case reflect.Int64, reflect.Int32, reflect.Int, reflect.Int16, reflect.Int8:
|
||
fdvv = fdv.Int()
|
||
case reflect.String:
|
||
if fdv.Len() == 0 {
|
||
continue
|
||
}
|
||
|
||
v := fdv.String()
|
||
parse := fdt.Tag.Get("parse")
|
||
if parse == "int" {
|
||
vi, err := strconv.ParseInt(v, 10, 64)
|
||
if err != nil {
|
||
log.Error("setESParams strconv.ParseInt(%s) error(%v)", v, err)
|
||
continue
|
||
}
|
||
fdvv = vi
|
||
} else if parse == "[]int" {
|
||
vi, err := xstr.SplitInts(v)
|
||
if err != nil {
|
||
log.Error("setESParams xstr.SplitInts(%s) error(%v)", v, err)
|
||
continue
|
||
}
|
||
fdvv = vi
|
||
fdvslice = true
|
||
} else {
|
||
fdvv = v
|
||
}
|
||
case reflect.Slice:
|
||
if fdv.Len() == 0 {
|
||
continue
|
||
}
|
||
fdvslice = true
|
||
default:
|
||
log.Warn("setESParams not support kind(%s) for tag(%s)", fdk.String(), tag)
|
||
continue
|
||
}
|
||
|
||
//范围处理
|
||
from := strings.Index(tag, ",from")
|
||
to := strings.Index(tag, ",to")
|
||
if from > -1 {
|
||
if _, exist := ranges[tag[:from]]; !exist {
|
||
ranges[tag[:from]] = map[string]interface{}{}
|
||
}
|
||
ranges[tag[:from]]["from"] = fdvv
|
||
continue
|
||
}
|
||
if to > -1 {
|
||
if _, exist := ranges[tag[:to]]; !exist {
|
||
ranges[tag[:to]] = map[string]interface{}{}
|
||
}
|
||
ranges[tag[:to]]["to"] = fdvv
|
||
continue
|
||
}
|
||
|
||
if fdvslice {
|
||
r.WhereIn(tag, fdvv)
|
||
} else {
|
||
r.WhereEq(tag, fdvv)
|
||
}
|
||
}
|
||
|
||
for field, items := range ranges {
|
||
r.WhereRange(field, items["from"], items["to"], elastic.RangeScopeLcRc)
|
||
}
|
||
|
||
r.Ps(cm.Ps).Pn(cm.Pn)
|
||
order := []map[string]string{}
|
||
if cm.Order != "" || cm.Sort != "" {
|
||
r.Order(cm.Order, cm.Sort)
|
||
order = append(order, map[string]string{cm.Order: cm.Sort})
|
||
}
|
||
if cm.Group != "" {
|
||
r.GroupBy(elastic.EnhancedModeDistinct, cm.Group, order)
|
||
}
|
||
}
|
||
|
||
//QueryLogSearch .
|
||
func (d *Dao) QueryLogSearch(c context.Context, args *model.ParamsQueryLog, cm model.EsCommon) (resp *model.SearchLogResult, err error) {
|
||
var (
|
||
min int = LogMinYear
|
||
max int
|
||
ctimefrom, ctimeto time.Time
|
||
)
|
||
//默认获取所有行为日志,确定了时间范围的,只查询该段范围内的日志
|
||
if args.CtimeFrom != "" {
|
||
ctimefrom, _ = time.ParseInLocation("2006-01-02 15:04:05", args.CtimeFrom, time.Local)
|
||
if ctimefrom.Year() > min {
|
||
min = ctimefrom.Year()
|
||
}
|
||
}
|
||
if args.CtimeTo != "" {
|
||
ctimeto, _ = time.ParseInLocation("2006-01-02 15:04:05", args.CtimeTo, time.Local)
|
||
if ctimeto.Year() >= min {
|
||
max = ctimeto.Year()
|
||
}
|
||
} else {
|
||
max = time.Now().Year()
|
||
}
|
||
|
||
tmpl := ",log_audit_%d_%d"
|
||
index := ""
|
||
for i := min; i <= max; i++ {
|
||
index += fmt.Sprintf(tmpl, args.Business, i)
|
||
}
|
||
index = strings.TrimLeft(index, ",")
|
||
|
||
r := d.es.NewRequest("log_audit").Index(index).Fields(
|
||
"uid",
|
||
"uname",
|
||
"oid",
|
||
"type",
|
||
"action",
|
||
"str_0",
|
||
"str_1",
|
||
"str_2",
|
||
"int_0",
|
||
"int_1",
|
||
"int_2",
|
||
"ctime",
|
||
"extra_data")
|
||
setESParams(r, args, cm)
|
||
err = r.Scan(c, &resp)
|
||
return
|
||
}
|