github.com/woremacx/kocha@v0.7.1-0.20150731103243-a5889322afc9/log/entry.go (about) 1 package log 2 3 import ( 4 "fmt" 5 "io" 6 "os" 7 "sync" 8 "time" 9 10 "github.com/woremacx/kocha/util" 11 ) 12 13 // Entry represents a log entry. 14 type Entry struct { 15 Level Level // log level. 16 Time time.Time // time of the log event. 17 Message string // log message (optional). 18 Fields Fields // extra fields of the log entry (optional). 19 } 20 21 // entryLogger implements the Logger interface. 22 type entryLogger struct { 23 entry *Entry 24 logger *logger 25 mu sync.Mutex 26 } 27 28 func newEntryLogger(logger *logger) *entryLogger { 29 return &entryLogger{ 30 logger: logger, 31 entry: &Entry{}, 32 } 33 } 34 35 func (l *entryLogger) Debug(v ...interface{}) { 36 if l.logger.Level() <= DEBUG { 37 l.Output(DEBUG, fmt.Sprint(v...)) 38 } 39 } 40 41 func (l *entryLogger) Debugf(format string, v ...interface{}) { 42 if l.logger.Level() <= DEBUG { 43 l.Output(DEBUG, fmt.Sprintf(format, v...)) 44 } 45 } 46 47 func (l *entryLogger) Debugln(v ...interface{}) { 48 if l.logger.Level() <= DEBUG { 49 l.Output(DEBUG, fmt.Sprint(v...)) 50 } 51 } 52 53 func (l *entryLogger) Info(v ...interface{}) { 54 if l.logger.Level() <= INFO { 55 l.Output(INFO, fmt.Sprint(v...)) 56 } 57 } 58 59 func (l *entryLogger) Infof(format string, v ...interface{}) { 60 if l.logger.Level() <= INFO { 61 l.Output(INFO, fmt.Sprintf(format, v...)) 62 } 63 } 64 65 func (l *entryLogger) Infoln(v ...interface{}) { 66 if l.logger.Level() <= INFO { 67 l.Output(INFO, fmt.Sprint(v...)) 68 } 69 } 70 71 func (l *entryLogger) Warn(v ...interface{}) { 72 if l.logger.Level() <= WARN { 73 l.Output(WARN, fmt.Sprint(v...)) 74 } 75 } 76 77 func (l *entryLogger) Warnf(format string, v ...interface{}) { 78 if l.logger.Level() <= WARN { 79 l.Output(WARN, fmt.Sprintf(format, v...)) 80 } 81 } 82 83 func (l *entryLogger) Warnln(v ...interface{}) { 84 if l.logger.Level() <= WARN { 85 l.Output(WARN, fmt.Sprint(v...)) 86 } 87 } 88 89 func (l *entryLogger) Error(v ...interface{}) { 90 if l.logger.Level() <= ERROR { 91 l.Output(ERROR, fmt.Sprint(v...)) 92 } 93 } 94 95 func (l *entryLogger) Errorf(format string, v ...interface{}) { 96 if l.logger.Level() <= ERROR { 97 l.Output(ERROR, fmt.Sprintf(format, v...)) 98 } 99 } 100 101 func (l *entryLogger) Errorln(v ...interface{}) { 102 if l.logger.Level() <= ERROR { 103 l.Output(ERROR, fmt.Sprint(v...)) 104 } 105 } 106 107 func (l *entryLogger) Fatal(v ...interface{}) { 108 l.Output(FATAL, fmt.Sprint(v...)) 109 os.Exit(1) 110 } 111 112 func (l *entryLogger) Fatalf(format string, v ...interface{}) { 113 l.Output(FATAL, fmt.Sprintf(format, v...)) 114 os.Exit(1) 115 } 116 117 func (l *entryLogger) Fatalln(v ...interface{}) { 118 l.Output(FATAL, fmt.Sprint(v...)) 119 os.Exit(1) 120 } 121 122 func (l *entryLogger) Panic(v ...interface{}) { 123 s := fmt.Sprint(v...) 124 l.Output(PANIC, s) 125 panic(s) 126 } 127 128 func (l *entryLogger) Panicf(format string, v ...interface{}) { 129 s := fmt.Sprintf(format, v...) 130 l.Output(PANIC, s) 131 panic(s) 132 } 133 134 func (l *entryLogger) Panicln(v ...interface{}) { 135 s := fmt.Sprint(v...) 136 l.Output(PANIC, s) 137 panic(s) 138 } 139 140 func (l *entryLogger) Print(v ...interface{}) { 141 l.Output(NONE, fmt.Sprint(v...)) 142 } 143 144 func (l *entryLogger) Printf(format string, v ...interface{}) { 145 l.Output(NONE, fmt.Sprintf(format, v...)) 146 } 147 148 func (l *entryLogger) Println(v ...interface{}) { 149 l.Output(NONE, fmt.Sprint(v...)) 150 } 151 152 func (l *entryLogger) Output(level Level, message string) { 153 l.logger.mu.Lock() 154 defer l.logger.mu.Unlock() 155 l.entry.Level = level 156 l.entry.Time = util.Now() 157 l.entry.Message = message 158 l.logger.buf.Reset() 159 format := Formatter.Format 160 if int(level) < len(l.logger.formatFuncs) { 161 format = l.logger.formatFuncs[level] 162 } 163 if err := format(l.logger.formatter, &l.logger.buf, l.entry); err != nil { 164 fmt.Fprintf(os.Stderr, "kocha: log: %v\n", err) 165 } 166 l.logger.buf.WriteByte('\n') 167 if _, err := io.Copy(l.logger.out, &l.logger.buf); err != nil { 168 fmt.Fprintf(os.Stderr, "kocha: log: failed to write log: %v\n", err) 169 } 170 } 171 172 func (l *entryLogger) With(fields Fields) Logger { 173 l.mu.Lock() 174 l.entry.Fields = fields 175 l.mu.Unlock() 176 return l 177 } 178 179 func (l *entryLogger) Level() Level { 180 return l.logger.Level() 181 } 182 183 func (l *entryLogger) SetLevel(level Level) { 184 l.logger.SetLevel(level) 185 }