2017-03-31 19:01:58 +03:00
|
|
|
package log
|
|
|
|
|
|
|
|
import (
|
|
|
|
"time"
|
|
|
|
|
|
|
|
"github.com/go-stack/stack"
|
|
|
|
)
|
|
|
|
|
2017-05-18 19:54:23 +03:00
|
|
|
// A Valuer generates a log value. When passed to Context.With in a value
|
|
|
|
// element (odd indexes), it represents a dynamic value which is re-evaluated
|
|
|
|
// with each log event.
|
2017-03-31 19:01:58 +03:00
|
|
|
type Valuer func() interface{}
|
|
|
|
|
|
|
|
// bindValues replaces all value elements (odd indexes) containing a Valuer
|
|
|
|
// with their generated value.
|
|
|
|
func bindValues(keyvals []interface{}) {
|
|
|
|
for i := 1; i < len(keyvals); i += 2 {
|
|
|
|
if v, ok := keyvals[i].(Valuer); ok {
|
|
|
|
keyvals[i] = v()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// containsValuer returns true if any of the value elements (odd indexes)
|
|
|
|
// contain a Valuer.
|
|
|
|
func containsValuer(keyvals []interface{}) bool {
|
|
|
|
for i := 1; i < len(keyvals); i += 2 {
|
|
|
|
if _, ok := keyvals[i].(Valuer); ok {
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
|
|
|
|
// Timestamp returns a Valuer that invokes the underlying function when bound,
|
|
|
|
// returning a time.Time. Users will probably want to use DefaultTimestamp or
|
|
|
|
// DefaultTimestampUTC.
|
|
|
|
func Timestamp(t func() time.Time) Valuer {
|
|
|
|
return func() interface{} { return t() }
|
|
|
|
}
|
|
|
|
|
|
|
|
var (
|
|
|
|
// DefaultTimestamp is a Valuer that returns the current wallclock time,
|
|
|
|
// respecting time zones, when bound.
|
2017-05-18 19:54:23 +03:00
|
|
|
DefaultTimestamp Valuer = func() interface{} { return time.Now().Format(time.RFC3339) }
|
2017-03-31 19:01:58 +03:00
|
|
|
|
|
|
|
// DefaultTimestampUTC is a Valuer that returns the current time in UTC
|
|
|
|
// when bound.
|
2017-05-18 19:54:23 +03:00
|
|
|
DefaultTimestampUTC Valuer = func() interface{} { return time.Now().UTC().Format(time.RFC3339) }
|
|
|
|
)
|
2017-03-31 19:01:58 +03:00
|
|
|
|
2017-05-18 19:54:23 +03:00
|
|
|
// Caller returns a Valuer that returns a file and line from a specified depth
|
|
|
|
// in the callstack. Users will probably want to use DefaultCaller.
|
|
|
|
func Caller(depth int) Valuer {
|
|
|
|
return func() interface{} { return stack.Caller(depth) }
|
|
|
|
}
|
|
|
|
|
|
|
|
var (
|
2017-03-31 19:01:58 +03:00
|
|
|
// DefaultCaller is a Valuer that returns the file and line where the Log
|
|
|
|
// method was invoked. It can only be used with log.With.
|
|
|
|
DefaultCaller = Caller(3)
|
|
|
|
)
|