123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182 |
- 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
- }
|