-
Notifications
You must be signed in to change notification settings - Fork 6
/
log_file.go
80 lines (68 loc) · 1.42 KB
/
log_file.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
package xlog
import (
"io"
"path/filepath"
"time"
"get.pme.sh/pmesh/config"
"get.pme.sh/pmesh/lru"
"gopkg.in/natefinch/lumberjack.v2"
)
const (
LogRetentionDays = 28
LogMaxSizeMB = 16
LogCompress = false
)
type logger = *lumberjack.Logger
func newLogger(s string) (l logger) {
return &lumberjack.Logger{
Filename: s,
MaxSize: LogMaxSizeMB,
MaxAge: LogRetentionDays,
Compress: LogCompress,
}
}
var loggers = lru.Cache[string, logger]{
Expiry: 5 * time.Minute,
CleanupInterval: 10 * time.Minute,
New: func(s string, e *lru.Entry[logger]) error {
e.Value = newLogger(s)
return nil
},
Evict: func(s string, wc logger) {
wc.Close()
},
}
type sharedLogger struct {
entry *lru.Entry[logger]
err error
}
func (s sharedLogger) Close() error {
if s.err != nil {
return s.err
}
s.entry.Release()
return nil
}
func (s sharedLogger) Write(p []byte) (n int, e error) {
if s.err != nil {
return 0, s.err
}
return s.entry.Value.Write(p)
}
type noCloser struct {
io.Writer
}
func (noCloser) Close() error { return nil }
func FileWriter(name string) (wc io.WriteCloser) {
if name == "session" || name == "stdout" || name == "stderr" {
return noCloser{DefaultWriter{}}
}
if name == "null" || name == "NUL" || name == "/dev/null" {
return nil
}
if !filepath.IsAbs(name) {
name = config.LogDir.File(name)
}
entry, err := loggers.GetEntry(name)
return sharedLogger{entry, err}
}