feat(eventlog): e := EventBegin; e.Done()
```Go e := log.EventBegin(ctx, "provide") e.Done() e := log.EventBegin(ctx, "provide") e.Close() // implements io.Closer in case you want to register with some lifecycle management system. ```
Brian Tiger Chow committed
Jan 14, 2015 at 14:47 UTC
b252d0450d7568746085afc487bfb5d10c125a64
3 files changed
+56
util/eventlog/example_test.go
new
+16
@@ -0,0 +1,16 @@
1
+package eventlog
2
+
3
+import "github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context"
4
+
5
+func ExampleEventLogger() {
6
+ {
7
+ log := EventLogger(nil)
8
+ e := log.EventBegin(context.Background(), "dial")
9
+ e.Done()
10
+ }
11
+ {
12
+ log := EventLogger(nil)
13
+ e := log.EventBegin(context.Background(), "dial")
14
+ _ = e.Close() // implements io.Closer for convenience
15
+ }
16
+}
util/eventlog/log.go
+34
@@ -1,6 +1,10 @@
1
package eventlog
2
3
import (
4
+ "fmt"
5
+ "io"
6
+ "time"
7
+
8
"github.com/jbenet/go-ipfs/Godeps/_workspace/src/code.google.com/p/go.net/context"
9
10
prelog "github.com/jbenet/go-ipfs/util/prefixlog"
@@ -30,6 +34,15 @@ type EventLogger interface {
34
// Finally the timestamp and package name are added to the accumulator and
35
// the metadata is logged.
36
Event(ctx context.Context, event string, m ...Loggable)
37
+
38
+ EventBegin(ctx context.Context, event string, m ...Loggable) DoneCloser
39
+}
40
+
41
+type DoneCloser interface {
42
+ // Done ends the event
43
+ Done()
44
+ // io.Closer is a convenience-alias for Done
45
+ io.Closer
46
}
47
48
// Logger retrieves an event logger by name
@@ -53,6 +66,16 @@ func (el *eventLogger) Prefix(fmt string, args ...interface{}) EventLogger {
66
return &eventLogger{system: el.system, PrefixLogger: l}
67
}
68
69
+func (el *eventLogger) EventBegin(ctx context.Context, event string, metadata ...Loggable) DoneCloser {
70
+ start := time.Now()
71
+ el.Event(ctx, fmt.Sprintln(event, "Begin"), metadata...)
72
+ return doneCloserFunc(func() {
73
+ el.Event(ctx, event, append(metadata, LoggableMap(map[string]interface{}{
74
+ "duration": time.Now().Sub(start),
75
+ }))...)
76
+ })
77
+}
78
+
79
func (el *eventLogger) Event(ctx context.Context, event string, metadata ...Loggable) {
80
81
// Collect loggables for later logging
@@ -77,3 +100,14 @@ func (el *eventLogger) Event(ctx context.Context, event string, metadata ...Logg
100
101
e.Log() // TODO replace this when leveled-logs have been implemented
102
}
103
+
104
+type doneCloserFunc func()
105
+
106
+func (f doneCloserFunc) Done() {
107
+ f()
108
+}
109
+
110
+func (f doneCloserFunc) Close() error {
111
+ f.Done()
112
+ return nil
113
+}
util/eventlog/loggable.go
+6
@@ -4,3 +4,9 @@ package eventlog
4
type Loggable interface {
5
Loggable() map[string]interface{}
6
}
7
+
8
+type LoggableMap map[string]interface{}
9
+
10
+func (l LoggableMap) Loggable() map[string]interface{} {
11
+ return l
12
+}