/
log15_logger.go
102 lines (89 loc) · 2.51 KB
/
log15_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
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
// Copyright 2018 The go-fractal Authors
// This file is part of the go-fractal library.
// Package types contains log utils for fractal project.
package log
import (
"github.com/inconshreveable/log15"
"github.com/mattn/go-isatty"
"io"
"os"
"runtime"
)
type Log15Logger struct {
origin log15.Logger
}
func processContext(ctx ...interface{}) {
for i, item := range ctx {
if value, ok := item.(Lazy); ok {
// convert from log.Lazy to log15.Lazy
ctx[i] = log15.Lazy{
Fn: value.Fn,
}
}
}
}
func (logger *Log15Logger) Debug(msg string, ctx ...interface{}) {
processContext(ctx...)
logger.origin.Debug(msg, ctx...)
}
func (logger *Log15Logger) Info(msg string, ctx ...interface{}) {
processContext(ctx...)
logger.origin.Info(msg, ctx...)
}
func (logger *Log15Logger) Warn(msg string, ctx ...interface{}) {
processContext(ctx...)
logger.origin.Warn(msg, ctx...)
}
func (logger *Log15Logger) Error(msg string, ctx ...interface{}) {
processContext(ctx...)
logger.origin.Error(msg, ctx...)
}
func (logger *Log15Logger) Crit(msg string, ctx ...interface{}) {
processContext(ctx...)
logger.origin.Crit(msg, ctx...)
}
func (logger *Log15Logger) NewSubLogger(ctx ...interface{}) Logger {
return &Log15Logger{
origin: logger.origin.New(ctx...),
}
}
// convert log.Lvl to log15.Lvl
func convertLogLevel(level Lvl) log15.Lvl {
var lvl log15.Lvl
switch level {
case LvlCrit:
lvl = log15.LvlCrit
case LvlError:
lvl = log15.LvlError
case LvlWarn:
lvl = log15.LvlWarn
case LvlInfo:
lvl = log15.LvlInfo
case LvlDebug:
lvl = log15.LvlDebug
default:
lvl = log15.LvlInfo
}
return lvl
}
func InitLog15Logger(level Lvl, writer io.Writer) Logger {
lvl := convertLogLevel(level)
logger := &Log15Logger{
origin: log15.Root(),
}
logger.origin.SetHandler(log15.LvlFilterHandler(lvl, log15.StreamHandler(writer, log15.LogfmtFormat())))
return logger
}
func InitMultipleLog15Logger(level Lvl, fpWriter io.Writer, consoleFile *os.File) Logger {
lvl := convertLogLevel(level)
logger := &Log15Logger{
origin: log15.Root(),
}
fpHandler := log15.LvlFilterHandler(lvl, log15.StreamHandler(fpWriter, log15.LogfmtFormat()))
consoleHandler := log15.MatchFilterHandler("type", "console", log15.StreamHandler(consoleFile, log15.LogfmtFormat()))
if isatty.IsTerminal(consoleFile.Fd()) && runtime.GOOS != "windows" {
consoleHandler = log15.MatchFilterHandler("type", "console", log15.StreamHandler(consoleFile, log15.TerminalFormat()))
}
logger.origin.SetHandler(log15.MultiHandler(fpHandler, consoleHandler))
return logger
}