-
Notifications
You must be signed in to change notification settings - Fork 0
/
logger.go
103 lines (92 loc) · 2.22 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
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
package logger
import (
"context"
"log/syslog"
"time"
"github.com/primalcs/logger/config"
"github.com/primalcs/logger/types"
"github.com/primalcs/logger/writer_pool"
)
// Logger is the main logging structure of this package
type Logger struct {
config *config.Config
writers *writer_pool.WriterPool
}
// NewLogger creates a new logging instance with options
func NewLogger(ctx context.Context, opts ...Option) (*Logger, error) {
l := &Logger{
config: config.NewConfig(),
writers: writer_pool.NewWriterPool(ctx),
}
for _, opt := range opts {
if err := opt(l); err != nil {
return nil, err
}
}
return l, nil
}
// NewDefaultLogger creates new logger with default options:
// delimiter: " | "
// fileWriter in "/var/log/logger/"
// httpListener on 8080 port
// localWriter with ring buffer length=1
// loglevel Debug
// and time format RFC3339 in UTC location
// mostly for testing purposes
func NewDefaultLogger() (*Logger, error) {
opts := []Option{
WithDelimiter(types.DelimiterV),
WithFileWriter("/var/log/logger/"),
WithHttpListener(8080),
WithLocalWriter("local", syslog.LOG_DEBUG|syslog.LOG_SYSLOG, 1),
WithLogLevel(types.DEBUG),
WithTimeLog(time.RFC3339, time.UTC),
}
l, err := NewLogger(context.Background(), opts...)
if err != nil {
return nil, err
}
return l, nil
}
// Log logs message to all defined writers
func (lg *Logger) Log(level types.LogLevel, tag, msg string, kvs ...string) {
var isForced bool
maxLvl := lg.config.GetLogLevel()
// ignore log
if level < types.FORCE && level > maxLvl {
return
}
// log is forced
if level > types.DEBUG {
isForced = true
level &= 0b111
}
ft, loc := lg.config.GetTimeOptions()
tp := types.TimeParams{
Location: loc,
Format: ft,
}
lg.writers.WriteAll(
types.LogParams{
IsForced: isForced,
Level: level,
IsWithCaller: lg.config.GetWithCaller(),
},
tp,
types.MsgParams{
Delimiter: lg.config.GetDelimiter(),
Tag: tag,
Msg: msg,
},
kvs...)
}
// AddOptions options add new options to existing logger
// should be used before first call of logger
func (lg *Logger) AddOptions(opts ...Option) error {
for _, opt := range opts {
if err := opt(lg); err != nil {
return err
}
}
return nil
}