mirror of
https://github.com/datarhei/core.git
synced 2025-10-04 15:42:57 +08:00
92 lines
1.5 KiB
Go
92 lines
1.5 KiB
Go
package api
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"regexp"
|
|
"strings"
|
|
|
|
"github.com/datarhei/core/v16/log"
|
|
)
|
|
|
|
type Event struct {
|
|
Timestamp int64 `json:"ts" format:"int64"`
|
|
Level int `json:"level"`
|
|
Component string `json:"event"`
|
|
Message string `json:"message"`
|
|
|
|
Data map[string]string `json:"data"`
|
|
}
|
|
|
|
func (e *Event) Marshal(le *log.Event) {
|
|
e.Timestamp = le.Time.Unix()
|
|
e.Level = int(le.Level)
|
|
e.Component = strings.ToLower(le.Component)
|
|
e.Message = le.Message
|
|
|
|
e.Data = make(map[string]string)
|
|
|
|
for k, v := range le.Data {
|
|
var value string
|
|
|
|
switch val := v.(type) {
|
|
case string:
|
|
value = val
|
|
case error:
|
|
value = val.Error()
|
|
default:
|
|
if s, ok := v.(fmt.Stringer); ok {
|
|
value = s.String()
|
|
} else {
|
|
if jsonvalue, err := json.Marshal(v); err == nil {
|
|
value = string(jsonvalue)
|
|
} else {
|
|
value = err.Error()
|
|
}
|
|
}
|
|
}
|
|
|
|
e.Data[k] = value
|
|
}
|
|
}
|
|
|
|
func (e *Event) Filter(ef *EventFilter) bool {
|
|
for k, r := range ef.data {
|
|
v, ok := e.Data[k]
|
|
if !ok {
|
|
continue
|
|
}
|
|
|
|
if !r.MatchString(v) {
|
|
return false
|
|
}
|
|
}
|
|
|
|
return true
|
|
}
|
|
|
|
type EventFilter struct {
|
|
Component string `json:"event"`
|
|
Data map[string]string `json:"data"`
|
|
data map[string]*regexp.Regexp
|
|
}
|
|
|
|
type EventFilters struct {
|
|
Filters []EventFilter `json:"filters"`
|
|
}
|
|
|
|
func (ef *EventFilter) Compile() error {
|
|
ef.data = make(map[string]*regexp.Regexp)
|
|
|
|
for k, v := range ef.Data {
|
|
r, err := regexp.Compile(v)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
ef.data[k] = r
|
|
}
|
|
|
|
return nil
|
|
}
|