forked from janelia-flyem/dvid
/
log_local.go
119 lines (100 loc) · 2.76 KB
/
log_local.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
// +build !clustered,!gcloud
package dvid
import (
"fmt"
"log"
"gopkg.in/natefinch/lumberjack.v2"
)
type stdLogger struct {
*lumberjack.Logger
}
var logger stdLogger
type LogConfig struct {
Logfile string
MaxSize int `toml:"max_log_size"`
MaxAge int `toml:"max_log_age"`
}
// SetLogger creates a logger that saves to a rotating log file.
func (c *LogConfig) SetLogger() {
if c == nil || c.Logfile == "" {
Infof("Sending log messages to stdout since no log file specified.")
return
}
fmt.Printf("Sending log messages to: %s\n", c.Logfile)
l := &lumberjack.Logger{
Filename: c.Logfile,
MaxSize: c.MaxSize, // megabytes
MaxAge: c.MaxAge, //days
}
log.SetOutput(l)
logger = stdLogger{l}
}
// --- Logger implementation ----
// Debugf formats its arguments analogous to fmt.Printf and records the text as a log
// message at Debug level.
func (slog stdLogger) Debugf(format string, args ...interface{}) {
log.Printf(" DEBUG "+format, args...)
}
// Infof is like Debugf, but at Info level and will be written regardless if not in
// verbose mode.
func (slog stdLogger) Infof(format string, args ...interface{}) {
log.Printf(" INFO "+format, args...)
}
// Warningf is like Debugf, but at Warning level.
func (slog stdLogger) Warningf(format string, args ...interface{}) {
log.Printf(" WARNING "+format, args...)
}
// Errorf is like Debugf, but at Error level.
func (slog stdLogger) Errorf(format string, args ...interface{}) {
log.Printf(" ERROR "+format, args...)
}
// Criticalf is like Debugf, but at Critical level.
func (slog stdLogger) Criticalf(format string, args ...interface{}) {
log.Printf("CRITICAL "+format, args...)
}
// Debug writes directly to logger at DEBUG level.
func (slog stdLogger) Debug(s string) {
if logger.Logger != nil {
logger.Write([]byte(" DEBUG " + s))
} else {
log.Printf(" DEBUG " + s)
}
}
// Info writes directly to logger at INFO level
func (slog stdLogger) Info(s string) {
if logger.Logger != nil {
logger.Write([]byte(" INFO " + s))
} else {
log.Printf(" INFO " + s)
}
}
// Warning writes directly to logger at INFO level
func (slog stdLogger) Warning(s string) {
if logger.Logger != nil {
logger.Write([]byte(" WARNING " + s))
} else {
log.Printf(" WARNING " + s)
}
}
// Error writes directly to logger at ERROR level
func (slog stdLogger) Error(s string) {
if logger.Logger != nil {
logger.Write([]byte(" ERROR " + s))
} else {
log.Printf(" ERROR " + s)
}
}
// Critical writes directly to logger at CRITICAL level
func (slog stdLogger) Critical(s string) {
if logger.Logger != nil {
logger.Write([]byte(" CRITICAL " + s))
} else {
log.Printf(" CRITICAL " + s)
}
}
func (slog stdLogger) Shutdown() {
log.Printf("Closing log file...\n")
if slog.Logger != nil {
slog.Close()
}
}