/
mlog.go
154 lines (137 loc) · 3.62 KB
/
mlog.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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
// Copyright 2021, Shulhan <ms@kilabit.info>. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
//
// Package mlog implement buffered multi writers of log.
// It can have zero or more normal writers (for example, os.Stdout and
// os.File) and zero or more error writers (for example, os.Stderr and
// different os.File).
//
// The MultiLogger is buffered to minimize waiting time when writing to
// multiple writers that have different latencies.
// For example, if we have one writer to os.Stdout, one writer to file, and
// one writer to network; the writer to network may take more time to finish
// than to os.Stdout and file, which may slowing down the program if we want
// to wait for all writes to finish.
//
// For this reason, do not forget to call Flush when your program exit.
//
// The default MultiLogger use time.RFC3339 as the default time layout, empty
// prefix, os.Stdout for the output writer, and os.Stderr for the error
// writer.
//
// Format of written log,
//
// [time] [prefix] <message>
//
// The time and prefix only printed if its not empty, and the single space is
// added for convenience.
//
package mlog
import (
"io"
"os"
)
const (
defTimeFormat = "2006-01-02 15:04:05 MST"
)
var defaultMLog = NewMultiLogger(defTimeFormat, "",
[]NamedWriter{
NewNamedWriter("stdout", os.Stdout),
},
[]NamedWriter{
NewNamedWriter("stderr", os.Stderr),
})
//
// Errf write to all registered error writers.
// The default registered error writer is os.Stderr.
//
func Errf(format string, v ...interface{}) {
defaultMLog.Errf(format, v...)
}
//
// Fatalf is equal to Errf and os.Exit(1).
//
func Fatalf(format string, v ...interface{}) {
defaultMLog.Fatalf(format, v...)
}
//
// Flush all writes in queue and wait until it finished.
//
func Flush() {
defaultMLog.Flush()
}
//
// Outf write to all registered output writers.
// The default registered output writer is os.Stdout.
//
func Outf(format string, v ...interface{}) {
defaultMLog.Outf(format, v...)
}
//
// Panicf is equal to Errf followed by panic.
//
func Panicf(format string, v ...interface{}) {
defaultMLog.Panicf(format, v...)
}
//
// PrintStack writes to error writers the stack trace returned by
// debug.Stack.
//
// This function can be useful when debugging panic using recover in the main
// program by logging the stack trace.
// For example,
//
// err := recover()
// if err != nil {
// mlog.PrintStack()
// os.Exit(1)
// }
//
func PrintStack() {
defaultMLog.PrintStack()
}
//
// RegisterErrorWriter register the named writer to one of error writers.
//
func RegisterErrorWriter(errw NamedWriter) {
defaultMLog.RegisterErrorWriter(errw)
}
//
// RegisterOutputWriter register the named writer to one of output writers.
//
func RegisterOutputWriter(outw NamedWriter) {
defaultMLog.RegisterOutputWriter(outw)
}
//
// SetPrefix set the default prefix for the subsequence writes.
//
func SetPrefix(prefix string) {
defaultMLog.SetPrefix(prefix)
}
//
// SetTimeFormat set the default time format for the subsequence writes.
//
func SetTimeFormat(layout string) {
defaultMLog.SetTimeFormat(layout)
}
//
// UnregisterErrorWriter remove the error writer by name.
//
func UnregisterErrorWriter(name string) {
defaultMLog.UnregisterErrorWriter(name)
}
//
// UnregisterOutputWriter remove the output writer by name.
//
func UnregisterOutputWriter(name string) {
defaultMLog.UnregisterOutputWriter(name)
}
//
// ErrorWriter return the internal default MultiLogger.
// A call to Write() on returned io.Writer will forward it to all registered
// error writers.
//
func ErrorWriter() io.Writer {
return defaultMLog
}