github.com/janelia-flyem/dvid@v1.0.0/dvid/log_local.go (about) 1 // +build !clustered,!gcloud 2 3 package dvid 4 5 import ( 6 "fmt" 7 "log" 8 9 "github.com/natefinch/lumberjack" 10 ) 11 12 type stdLogger struct { 13 *lumberjack.Logger 14 } 15 16 var logger stdLogger 17 18 type LogConfig struct { 19 Logfile string 20 MaxSize int `toml:"max_log_size"` 21 MaxAge int `toml:"max_log_age"` 22 } 23 24 // SetLogger creates a logger that saves to a rotating log file. 25 func (c *LogConfig) SetLogger() { 26 if c == nil || c.Logfile == "" { 27 Infof("Sending log messages to stdout since no log file specified.") 28 return 29 } 30 fmt.Printf("Sending log messages to: %s\n", c.Logfile) 31 l := &lumberjack.Logger{ 32 Filename: c.Logfile, 33 MaxSize: c.MaxSize, // megabytes 34 MaxAge: c.MaxAge, //days 35 } 36 log.SetOutput(l) 37 logger = stdLogger{l} 38 } 39 40 // --- Logger implementation ---- 41 42 // Debug writes directly to logger at DEBUG level. 43 func (slog stdLogger) Debug(s string) { 44 if logger.Logger != nil { 45 logger.Write([]byte(" DEBUG " + s)) 46 } else { 47 log.Printf(" DEBUG " + s) 48 } 49 } 50 51 // Info writes directly to logger at INFO level 52 func (slog stdLogger) Info(s string) { 53 if logger.Logger != nil { 54 logger.Write([]byte(" INFO " + s)) 55 } else { 56 log.Printf(" INFO " + s) 57 } 58 } 59 60 // Warning writes directly to logger at INFO level 61 func (slog stdLogger) Warning(s string) { 62 if logger.Logger != nil { 63 logger.Write([]byte(" WARNING " + s)) 64 } else { 65 log.Printf(" WARNING " + s) 66 } 67 } 68 69 // Error writes directly to logger at ERROR level 70 func (slog stdLogger) Error(s string) { 71 if logger.Logger != nil { 72 logger.Write([]byte(" ERROR " + s)) 73 } else { 74 log.Printf(" ERROR " + s) 75 } 76 } 77 78 // Critical writes directly to logger at CRITICAL level 79 func (slog stdLogger) Critical(s string) { 80 if logger.Logger != nil { 81 logger.Write([]byte(" CRITICAL " + s)) 82 } else { 83 log.Printf(" CRITICAL " + s) 84 } 85 } 86 87 // Debugf formats its arguments analogous to fmt.Printf and records the text as a log 88 // message at Debug level. 89 func (slog stdLogger) Debugf(format string, args ...interface{}) { 90 log.Printf(" DEBUG "+format, args...) 91 } 92 93 // Infof is like Debugf, but at Info level and will be written regardless if not in 94 // verbose mode. 95 func (slog stdLogger) Infof(format string, args ...interface{}) { 96 log.Printf(" INFO "+format, args...) 97 } 98 99 // Warningf is like Debugf, but at Warning level. 100 func (slog stdLogger) Warningf(format string, args ...interface{}) { 101 log.Printf(" WARNING "+format, args...) 102 } 103 104 // Errorf is like Debugf, but at Error level. 105 func (slog stdLogger) Errorf(format string, args ...interface{}) { 106 log.Printf(" ERROR "+format, args...) 107 } 108 109 // Criticalf is like Debugf, but at Critical level. 110 func (slog stdLogger) Criticalf(format string, args ...interface{}) { 111 log.Printf(" CRITICAL "+format, args...) 112 } 113 114 func (slog stdLogger) Shutdown() { 115 log.Printf("Closing log file...\n") 116 if slog.Logger != nil { 117 slog.Close() 118 } 119 }