func (e *Entry) Stop(err *error) {
	if *err == nil {
		e.WithField("duration", time.Since(e.start)).Info(e.Message)
	} else {
		e.WithField("duration", time.Since(e.start)).WithError(*err).Error(e.Message)
	}
}
Stop should be used with Trace, to fire off the completion message. When
an `err` is passed the "error" field is set, and the log level is error.
package log
import (
	"fmt"
	"os"
	"time"
)
var _ Interface = (*Entry)(nil)
type Entry struct {
	Logger    *Logger   `json:"-"`
	Fields    Fields    `json:"fields"`
	Level     Level     `json:"level"`
	Timestamp time.Time `json:"timestamp"`
	Message   string    `json:"message"`
	start     time.Time
	fields    []Fields
}
func NewEntry(log *Logger) *Entry {
	return &Entry{
		Logger: log,
	}
}
func (e *Entry) WithFields(fields Fielder) *Entry {
	return &Entry{
		Logger: e.Logger,
		fields: append(e.fields, fields.Fields()),
	}
}
func (e *Entry) WithField(key string, value interface{}) *Entry {
	return e.WithFields(Fields{key: value})
}
func (e *Entry) WithError(err error) *Entry {
	return e.WithField("error", err.Error())
}
func (e *Entry) Debug(msg string) {
	e.Logger.log(DebugLevel, e, msg)
}
func (e *Entry) Info(msg string) {
	e.Logger.log(InfoLevel, e, msg)
}
func (e *Entry) Warn(msg string) {
	e.Logger.log(WarnLevel, e, msg)
}
func (e *Entry) Error(msg string) {
	e.Logger.log(ErrorLevel, e, msg)
}
func (e *Entry) Fatal(msg string) {
	e.Logger.log(FatalLevel, e, msg)
	os.Exit(1)
}
func (e *Entry) Debugf(msg string, v ...interface{}) {
	e.Debug(fmt.Sprintf(msg, v...))
}
func (e *Entry) Infof(msg string, v ...interface{}) {
	e.Info(fmt.Sprintf(msg, v...))
}
func (e *Entry) Warnf(msg string, v ...interface{}) {
	e.Warn(fmt.Sprintf(msg, v...))
}
func (e *Entry) Errorf(msg string, v ...interface{}) {
	e.Error(fmt.Sprintf(msg, v...))
}
func (e *Entry) Fatalf(msg string, v ...interface{}) {
	e.Fatal(fmt.Sprintf(msg, v...))
}
func (e *Entry) Trace(msg string) *Entry {
	e.Info(msg)
	v := e.WithFields(e.Fields)
	v.Message = msg
	v.start = time.Now()
	return v
}