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  }