-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathhandler.go
57 lines (52 loc) · 1.5 KB
/
handler.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
package countlog
import (
"context"
"errors"
"github.com/modern-go/concurrent"
"github.com/modern-go/countlog/logger"
"github.com/modern-go/msgfmt/formatter"
"runtime"
"time"
)
var handlerCache = concurrent.NewMap()
func log(level int, eventName string, agg string, ctx context.Context, err error, properties []interface{}) error {
handler := getHandler(eventName, agg, ctx, properties)
event := &logger.Event{
Level: level,
Context: ctx,
Error: err,
Timestamp: time.Now(),
Properties: properties,
}
handler.Handle(event)
if event.Error != nil {
fmt := formatter.Of(eventName, properties)
errMsg := fmt.Format(nil, properties)
errMsg = append(errMsg, ": "...)
errMsg = append(errMsg, event.Error.Error()...)
event.Error = errors.New(string(errMsg))
}
return event.Error
}
func getHandler(event string, agg string, ctx context.Context, properties []interface{}) logger.EventHandler {
handler, found := handlerCache.Load(event)
if found {
return handler.(logger.EventHandler)
}
return newHandler(event, agg, ctx, properties)
}
func newHandler(eventName string, agg string, ctx context.Context, properties []interface{}) logger.EventHandler {
pc, callerFile, callerLine, _ := runtime.Caller(4)
site := &logger.LogSite{
Context: ctx,
Func: runtime.FuncForPC(pc).Name(),
Event: eventName,
Agg: agg,
File: callerFile,
Line: callerLine,
Sample: properties,
}
handler := newRootHandler(site, nil)
handlerCache.Store(eventName, handler)
return handler
}