-
Notifications
You must be signed in to change notification settings - Fork 32
/
logger.go
76 lines (68 loc) · 1.69 KB
/
logger.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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
package assert
import (
"bytes"
"fmt"
"log"
"os"
)
// logger is meant be included as a pointer field on a struct. Leaving the
// instance as a nil reference will cause any calls on the *logger to forward
// to the corresponding functions from the standard log package. This is meant
// to be the behavior in production. In testing, set the field to a non-nil
// instance of a *logger to record log statements for later inspection.
type logger struct {
*log.Logger
Log *bytes.Buffer
Calls int
}
// capture creates a new *logger instance with an internal buffer. The prefix
// and flags default to the values of log.Prefix() and log.Flags(), respectively.
// This function is meant to be called from test code. See the godoc for the
// logger struct for details.
func capture() *logger {
out := new(bytes.Buffer)
inner := log.New(out, log.Prefix(), log.Flags())
inner.SetPrefix("")
return &logger{
Log: out,
Logger: inner,
}
}
// Fatal -> log.Fatal (except in testing it uses log.Print)
func (this *logger) Fatal(v ...any) {
if this == nil {
this.Output(3, fmt.Sprint(v...))
os.Exit(1)
} else {
this.Calls++
this.Logger.Print(v...)
}
}
// Panic -> log.Panic
func (this *logger) Panic(v ...any) {
if this == nil {
s := fmt.Sprint(v...)
this.Output(3, s)
panic(s)
} else {
this.Calls++
this.Logger.Panic(v...)
}
}
// Print -> log.Print
func (this *logger) Print(v ...any) {
if this == nil {
this.Output(3, fmt.Sprint(v...))
} else {
this.Calls++
this.Logger.Print(v...)
}
}
// Output -> log.Output
func (this *logger) Output(calldepth int, s string) error {
if this == nil {
return log.Output(calldepth, s)
}
this.Calls++
return this.Logger.Output(calldepth, s)
}