Skip to content

Commit 8a3d771

Browse files
committed
go-aah/aah#66 added logger hooks capability
1 parent 9934d8e commit 8a3d771

File tree

4 files changed

+133
-3
lines changed

4 files changed

+133
-3
lines changed

console_receiver_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -123,9 +123,9 @@ func testConsoleLogger(t *testing.T, cfgStr string) {
123123
logger.Errorf("Yes, yes, yes - %v", "finally an error")
124124

125125
exit = func(code int) {}
126-
logger.Fatal("Yes, yes, yes - finally an error")
127-
logger.Fatalf("Yes, yes, yes - %v", "finally an error")
128-
logger.Fatalln("Yes, yes, yes - %v", "finally an error")
126+
logger.Fatal("Yes, yes, yes - at last fatal")
127+
logger.Fatalf("Yes, yes, yes - %v", "at last fatal")
128+
logger.Fatalln("Yes, yes, yes - %v", "at last fatal")
129129
exit = os.Exit
130130

131131
assert.NotNil(t, logger.ToGoLogger())

hook.go

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
// Copyright (c) Jeevanandam M (https://github.com/jeevatkm)
2+
// go-aah/log source code and usage is governed by a MIT style
3+
// license that can be found in the LICENSE file.
4+
5+
package log
6+
7+
import (
8+
"errors"
9+
"fmt"
10+
"sync"
11+
)
12+
13+
var (
14+
// ErrHookFuncIsNil is returned when hook function is nil.
15+
ErrHookFuncIsNil = errors.New("log: hook func is nil")
16+
17+
hooks = make(map[string]HookFunc)
18+
mu = &sync.RWMutex{}
19+
)
20+
21+
// HookFunc type is aah framework logger custom hook.
22+
type HookFunc func(e Entry)
23+
24+
//‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
25+
// Global methods
26+
//___________________________________
27+
28+
// AddHook method is to add logger hook function.
29+
func AddHook(name string, hook HookFunc) error {
30+
if hook == nil {
31+
return ErrHookFuncIsNil
32+
}
33+
34+
mu.Lock()
35+
defer mu.Unlock()
36+
if _, found := hooks[name]; found {
37+
return fmt.Errorf("log: hook name '%v' is already added, skip it", name)
38+
}
39+
40+
hooks[name] = hook
41+
return nil
42+
}
43+
44+
//‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾
45+
// Unexported methods
46+
//___________________________________
47+
48+
func executeHooks(e Entry) {
49+
mu.RLock()
50+
defer mu.RUnlock()
51+
for _, fn := range hooks {
52+
go fn(e)
53+
}
54+
}

hook_test.go

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
// Copyright (c) Jeevanandam M (https://github.com/jeevatkm)
2+
// go-aah/log source code and usage is governed by a MIT style
3+
// license that can be found in the LICENSE file.
4+
5+
package log
6+
7+
import (
8+
"fmt"
9+
"os"
10+
"testing"
11+
"time"
12+
13+
config "aahframework.org/config.v0"
14+
"aahframework.org/test.v0/assert"
15+
)
16+
17+
func TestLogAddHook(t *testing.T) {
18+
err := AddHook("hook1", func(e Entry) {
19+
assert.NotNil(t, e)
20+
})
21+
assert.Nil(t, err)
22+
23+
err = AddHook("hook2", func(e Entry) {
24+
assert.NotNil(t, e)
25+
})
26+
assert.Nil(t, err)
27+
28+
// Already added
29+
err = AddHook("hook1", func(e Entry) {
30+
assert.NotNil(t, e)
31+
})
32+
assert.Equal(t, "log: hook name 'hook1' is already added, skip it", err.Error())
33+
34+
// Nil hook
35+
err = AddHook("nilhook", nil)
36+
assert.Equal(t, ErrHookFuncIsNil, err)
37+
}
38+
39+
func TestLogHook(t *testing.T) {
40+
// Add hook
41+
_ = AddHook("hook1", func(e Entry) {
42+
assert.NotNil(t, e)
43+
fmt.Println(e)
44+
})
45+
46+
configStr := `
47+
log {
48+
receiver = "console"
49+
level = "debug"
50+
pattern = "%utctime:2006-01-02 15:04:05.000 %level:-5 %line %custom:- %message"
51+
}
52+
`
53+
testHooks(t, configStr)
54+
time.Sleep(1 * time.Millisecond)
55+
}
56+
57+
func testHooks(t *testing.T, cfgStr string) {
58+
cfg, _ := config.ParseString(cfgStr)
59+
logger, err := New(cfg)
60+
assert.FailNowOnError(t, err, "unexpected error")
61+
62+
logger.Trace("I shoudn't see this msg, because standard logger level is DEBUG")
63+
logger.Debug("I would like to see this message, debug is useful for dev")
64+
logger.Info("Yes, I would love to see")
65+
logger.Warn("Yes, yes it's an warning")
66+
logger.Error("Yes, yes, yes - finally an error")
67+
68+
exit = func(code int) {}
69+
logger.Fatal("Yes, yes, yes - at last fatal")
70+
exit = os.Exit
71+
72+
assert.NotNil(t, logger.ToGoLogger())
73+
}

log.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -333,4 +333,7 @@ func (l *Logger) output(level level, calldepth int, format *string, v ...interfa
333333
}
334334

335335
l.receiver.Log(entry)
336+
337+
// Execute logger hooks
338+
go executeHooks(*entry)
336339
}

0 commit comments

Comments
 (0)