Add TimeDiff event method

This commit is contained in:
Olivier Poitrey 2017-06-06 21:58:33 -07:00
parent 3f6ca6688c
commit 9889521807
2 changed files with 21 additions and 2 deletions

View File

@ -278,7 +278,7 @@ func (e *Event) Time(key string, t time.Time) *Event {
return e return e
} }
// Dur adds the fields key with duration d stored as zerolog.DurationFieldUnit. // Dur adds the field key with duration d stored as zerolog.DurationFieldUnit.
// If zerolog.DurationFieldInteger is true, durations are rendered as integer // If zerolog.DurationFieldInteger is true, durations are rendered as integer
// instead of float. // instead of float.
func (e *Event) Dur(key string, d time.Duration) *Event { func (e *Event) Dur(key string, d time.Duration) *Event {
@ -289,6 +289,21 @@ func (e *Event) Dur(key string, d time.Duration) *Event {
return e return e
} }
// TimeDiff adds the field key with positive duration between time t and start.
// If time t is not greater than start, duration will be 0.
// Duration format follows the same principle as Dur().
func (e *Event) TimeDiff(key string, t time.Time, start time.Time) *Event {
if !e.enabled {
return e
}
var d time.Duration
if t.After(start) {
d = t.Sub(start)
}
e.buf = appendDuration(e.buf, key, d)
return e
}
// Interface adds the field key with i marshaled using reflection. // Interface adds the field key with i marshaled using reflection.
func (e *Event) Interface(key string, i interface{}) *Event { func (e *Event) Interface(key string, i interface{}) *Event {
if !e.enabled { if !e.enabled {

View File

@ -119,9 +119,11 @@ func TestFields(t *testing.T) {
Uint64("uint64", 10). Uint64("uint64", 10).
Float32("float32", 11). Float32("float32", 11).
Float64("float64", 12). Float64("float64", 12).
Dur("dur", 1*time.Second).
Time("time", time.Time{}). Time("time", time.Time{}).
TimeDiff("diff", time.Now(), time.Now().Add(-10*time.Second)).
Msg("") Msg("")
if got, want := out.String(), `{"foo":"bar","error":"some error","bool":true,"int":1,"int8":2,"int16":3,"int32":4,"int64":5,"uint":6,"uint8":7,"uint16":8,"uint32":9,"uint64":10,"float32":11,"float64":12,"time":"0001-01-01T00:00:00Z"}`+"\n"; got != want { if got, want := out.String(), `{"foo":"bar","error":"some error","bool":true,"int":1,"int8":2,"int16":3,"int32":4,"int64":5,"uint":6,"uint8":7,"uint16":8,"uint32":9,"uint64":10,"float32":11,"float64":12,"dur":1000,"time":"0001-01-01T00:00:00Z","diff":10000}`+"\n"; got != want {
t.Errorf("invalid log output: got %q, want %q", got, want) t.Errorf("invalid log output: got %q, want %q", got, want)
} }
} }
@ -146,7 +148,9 @@ func TestFieldsDisabled(t *testing.T) {
Uint64("uint64", 10). Uint64("uint64", 10).
Float32("float32", 11). Float32("float32", 11).
Float64("float64", 12). Float64("float64", 12).
Dur("dur", 1*time.Second).
Time("time", time.Time{}). Time("time", time.Time{}).
TimeDiff("diff", time.Now(), time.Now().Add(-10*time.Second)).
Msg("") Msg("")
if got, want := out.String(), ""; got != want { if got, want := out.String(), ""; got != want {
t.Errorf("invalid log output: got %q, want %q", got, want) t.Errorf("invalid log output: got %q, want %q", got, want)