Skip to content

Commit d924189

Browse files
committed
Improve logging wrapper
1 parent 2a5e63c commit d924189

File tree

3 files changed

+75
-34
lines changed

3 files changed

+75
-34
lines changed

cmd/go_template/main.go

+4-2
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,10 @@ func main() {
4040

4141
err := log.Info(logger).Log("msg", fmt.Sprintf("Starting %s", appName))
4242
cliCtx.FatalIfErrorf(err)
43-
version.LogInfo(logger)
44-
version.LogBuildContext(logger)
43+
err = version.LogInfo(logger)
44+
cliCtx.FatalIfErrorf(err)
45+
err = version.LogBuildContext(logger)
46+
cliCtx.FatalIfErrorf(err)
4547

4648
sb := strings.Builder{}
4749
Hello(&sb)

internal/log/log.go

+60-24
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,6 @@
1212
// See the License for the specific language governing permissions and
1313
// limitations under the License.
1414

15-
// Package log defines standardized ways to initialize Go kit loggers.
16-
// It should typically only ever be imported by main packages.
1715
package log
1816

1917
import (
@@ -40,6 +38,10 @@ var timestampFormat = log.TimestampFormat(
4038
"2006-01-02T15:04:05.000Z07:00",
4139
)
4240

41+
type Logger interface {
42+
Log(keyvals ...interface{}) error
43+
}
44+
4345
// AllowedLevel is a settable identifier for the minimum level a log entry
4446
// must be have.
4547
type AllowedLevel struct {
@@ -121,15 +123,20 @@ type Config struct {
121123
Format *AllowedFormat
122124
}
123125

126+
type SimpleLogger struct {
127+
Base log.Logger
128+
Leveled log.Logger
129+
}
130+
124131
// New returns a new leveled logger. Each logged line will be annotated
125-
// with a timestamp. The output always goes to stderr.
126-
func New(config *Config) log.Logger {
132+
// with a timestamp. The output always goes to stdout.
133+
func New(config *Config) *SimpleLogger {
127134
var l log.Logger
128135

129136
if config.Format != nil && config.Format.s == jsonFormat {
130-
l = log.NewJSONLogger(log.NewSyncWriter(os.Stderr))
137+
l = log.NewJSONLogger(log.NewSyncWriter(os.Stdout))
131138
} else {
132-
l = log.NewLogfmtLogger(log.NewSyncWriter(os.Stderr))
139+
l = log.NewLogfmtLogger(log.NewSyncWriter(os.Stdout))
133140
}
134141

135142
if config.Level != nil {
@@ -139,22 +146,36 @@ func New(config *Config) log.Logger {
139146
l = log.With(l, "ts", timestampFormat, "caller", log.DefaultCaller)
140147
}
141148

142-
return l
149+
lo := &SimpleLogger{
150+
Base: l,
151+
Leveled: l,
152+
}
153+
154+
return lo
155+
}
156+
157+
// Log implements [log.Logger].
158+
func (l *SimpleLogger) Log(keyvals ...interface{}) error {
159+
if err := l.Leveled.Log(keyvals...); err != nil {
160+
return fmt.Errorf("log error: %w", err)
161+
}
162+
163+
return nil
143164
}
144165

145166
// NewDynamic returns a new leveled logger. Each logged line will be annotated
146-
// with a timestamp. The output always goes to stderr. Some properties can be
167+
// with a timestamp. The output always goes to stdout. Some properties can be
147168
// changed, like the level.
148-
func NewDynamic(config *Config) *Logger {
169+
func NewDynamic(config *Config) *DynamicLogger {
149170
var l log.Logger
150171

151172
if config.Format != nil && config.Format.s == jsonFormat {
152-
l = log.NewJSONLogger(log.NewSyncWriter(os.Stderr))
173+
l = log.NewJSONLogger(log.NewSyncWriter(os.Stdout))
153174
} else {
154-
l = log.NewLogfmtLogger(log.NewSyncWriter(os.Stderr))
175+
l = log.NewLogfmtLogger(log.NewSyncWriter(os.Stdout))
155176
}
156177

157-
lo := &Logger{
178+
lo := &DynamicLogger{
158179
Base: l,
159180
Leveled: l,
160181
}
@@ -166,16 +187,16 @@ func NewDynamic(config *Config) *Logger {
166187
return lo
167188
}
168189

169-
type Logger struct {
190+
type DynamicLogger struct {
170191
Base log.Logger
171192
Leveled log.Logger
172193
CurrentLevel *AllowedLevel
173194

174195
mtx sync.Mutex
175196
}
176197

177-
// Log implements logger.Log.
178-
func (l *Logger) Log(keyvals ...interface{}) error {
198+
// Log implements [log.Logger].
199+
func (l *DynamicLogger) Log(keyvals ...interface{}) error {
179200
l.mtx.Lock()
180201
defer l.mtx.Unlock()
181202

@@ -187,7 +208,7 @@ func (l *Logger) Log(keyvals ...interface{}) error {
187208
}
188209

189210
// SetLevel changes the log level.
190-
func (l *Logger) SetLevel(lvl *AllowedLevel) {
211+
func (l *DynamicLogger) SetLevel(lvl *AllowedLevel) {
191212
l.mtx.Lock()
192213
defer l.mtx.Unlock()
193214

@@ -207,21 +228,36 @@ func (l *Logger) SetLevel(lvl *AllowedLevel) {
207228
}
208229

209230
// Error returns a logger that includes a Key/ErrorValue pair.
210-
func Error(logger log.Logger) log.Logger {
211-
return log.WithPrefix(logger, level.Key(), level.ErrorValue())
231+
func Error(logger Logger) Logger {
232+
return WithPrefix(logger, level.Key(), level.ErrorValue())
212233
}
213234

214235
// Warn returns a logger that includes a Key/WarnValue pair.
215-
func Warn(logger log.Logger) log.Logger {
216-
return log.WithPrefix(logger, level.Key(), level.WarnValue())
236+
func Warn(logger Logger) Logger {
237+
return WithPrefix(logger, level.Key(), level.WarnValue())
217238
}
218239

219240
// Info returns a logger that includes a Key/InfoValue pair.
220-
func Info(logger log.Logger) log.Logger {
221-
return log.WithPrefix(logger, level.Key(), level.InfoValue())
241+
func Info(logger Logger) Logger {
242+
return WithPrefix(logger, level.Key(), level.InfoValue())
222243
}
223244

224245
// Debug returns a logger that includes a Key/DebugValue pair.
225-
func Debug(logger log.Logger) log.Logger {
226-
return log.WithPrefix(logger, level.Key(), level.DebugValue())
246+
func Debug(logger Logger) Logger {
247+
return WithPrefix(logger, level.Key(), level.DebugValue())
248+
}
249+
250+
// WithPrefix wraps [log.WithPrefix].
251+
func WithPrefix(logger Logger, keyvals ...interface{}) Logger {
252+
return log.WithPrefix(logger, keyvals...)
253+
}
254+
255+
// With wraps [log.With].
256+
func With(logger Logger, keyvals ...interface{}) Logger {
257+
return log.With(logger, keyvals...)
258+
}
259+
260+
// WithSuffix wraps [log.WithSuffix].
261+
func WithSuffix(logger Logger, keyvals ...interface{}) Logger {
262+
return log.WithSuffix(logger, keyvals...)
227263
}

internal/version/version.go

+11-8
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
package version
22

33
import (
4+
"fmt"
45
"runtime"
56
"runtime/debug"
67

78
"github.com/MacroPower/go_template/internal/log"
8-
9-
kitlog "github.com/go-kit/log"
109
)
1110

1211
var (
@@ -22,28 +21,32 @@ var (
2221
)
2322

2423
// LogInfo logs version, branch and revision.
25-
func LogInfo(logger kitlog.Logger) {
24+
func LogInfo(logger log.Logger) error {
2625
if err := log.Info(logger).Log(
2726
"msg", "info",
2827
"version", Version,
2928
"branch", Branch,
3029
"revision", Revision,
3130
); err != nil {
32-
panic(err)
31+
return fmt.Errorf("log error: %w", err)
3332
}
33+
34+
return nil
3435
}
3536

3637
// LogBuildContext logs goVersion, platform, buildUser and buildDate.
37-
func LogBuildContext(logger kitlog.Logger) {
38+
func LogBuildContext(logger log.Logger) error {
3839
if err := log.Info(logger).Log(
3940
"msg", "build context",
4041
"go", GoVersion,
4142
"platform", GoOS+"/"+GoArch,
42-
"user", BuildUser,
43-
"date", BuildDate,
43+
"buildUser", BuildUser,
44+
"buildDate", BuildDate,
4445
); err != nil {
45-
panic(err)
46+
return fmt.Errorf("log error: %w", err)
4647
}
48+
49+
return nil
4750
}
4851

4952
func getRevision() string {

0 commit comments

Comments
 (0)