Documentation
¶
Overview ¶
Package log provides a simple, flexible, extensible, powerful and structured logger based on the level, which has done the better balance between the flexibility and the performance. It collects the log message with the key-value contexts, encodes them into the buffer, then writes the encoded log from the buffer into the underlying writer.
Features
- Support `Go1.7+`.
- Compatible with the stdlib `log.Printf`.
- The better performance:
- Lazy evaluation of expensive operations.
- Avoid to allocate the memory on heap as far as possible.
- Encode in real time or pre-encode the key-value contexts into the buffer cache.
- Simple, Flexible, Extensible, Powerful and Structured.
- Support to customize the log encoder and writer.
- Provide the simple and easy-used api interface.
Example
package main import ( "errors" "flag" "github.com/xgfone/go-log" ) var logfile string var loglevel string func logError(err error, msg string, kvs ...interface{}) { if err == nil { return } log.Level(log.LvlError, 1).Kvs(kvs...).Kv("err", err).Printf(msg) } func main() { // Parse the CLI options. flag.StringVar(&logfile, "logfile", "", "The log file path, default to stderr.") flag.StringVar(&loglevel, "loglevel", "info", "The log level, such as debug, info, etc.") flag.Parse() // Configure the logger. writer := log.FileWriter(logfile, "100M", 100) defer writer.Close() log.SetWriter(writer) log.SetLevel(log.ParseLevel(loglevel)) // Emit the log. log.Debug().Kv("key1", "value1").Print("msg1") // no log output. log.Info().Kv("key2", "value2").Print("msg2") log.Level(log.LvlInfo, 0).Kv("key3", "value3").Printf("msg3") logError(nil, "msg4", "key4", "value4", "key5", 555, "key6", "value6") logError(errors.New("error"), "msg7", "key8", 888, "key9", "value9") // For Clild Logger child1Logger := log.WithName("child1") child2Logger := child1Logger.WithName("child2") child1Logger.Info().Kv("ckey1", "cvalue1").Print("msg8") child2Logger.Info().Kv("ckey2", "cvalue2").Printf("msg9") // $ go run main.go // {"t":"2021-12-17T00:04:44.8609884+08:00","lvl":"info","caller":"main.go:34:main","key2":"value2","msg":"msg2"} // {"t":"2021-12-17T00:04:44.8660577+08:00","lvl":"info","caller":"main.go:35:main","key3":"value3","msg":"msg3"} // {"t":"2021-12-17T00:04:44.8671207+08:00","lvl":"error","caller":"main.go:37:main","key8":888,"key9":"value9","err":"error","msg":"msg7"} // {"t":"2021-12-17T00:04:44.8671207+08:00","lvl":"info","logger":"child1","caller":"main.go:42:main","ckey1":"cvalue1","msg":"msg8"} // {"t":"2021-12-17T00:04:44.8678731+08:00","lvl":"info","logger":"child1.child2","caller":"main.go:43:main","ckey2":"cvalue2","msg":"msg9"} }
Index ¶
- Constants
- Variables
- func Ef(err error, format string, args ...interface{})
- func Err(err error, msg string, keysAndValues ...interface{})
- func FileWriter(filename, filesize string, filenum int) io.WriteCloser
- func GetCallStack(skip int) []string
- func GetGlobalLevel() int
- func GetLevel() int
- func GlobalDisableSampling(disable bool)
- func IfErr(err error, msg string, keysAndValues ...interface{})
- func LevelIsValid(level int) bool
- func ParseLevel(level string, defaultLevel ...int) int
- func SetEncoder(enc Encoder)
- func SetGlobalLevel(level int)
- func SetLevel(level int)
- func SetLevelFormat(format func(level int) string)
- func SetWriter(w io.Writer)
- func StdLogger(prefix string, level int) *log.Logger
- func WrapPanic(keysAndValues ...interface{})
- type Emitter
- func Alert(kvs ...interface{}) *Emitter
- func Debug(kvs ...interface{}) *Emitter
- func Error(kvs ...interface{}) *Emitter
- func Fatal(kvs ...interface{}) *Emitter
- func Info(kvs ...interface{}) *Emitter
- func LevelLog(level, depth int) *Emitter
- func Panic(kvs ...interface{}) *Emitter
- func Trace(kvs ...interface{}) *Emitter
- func Warn(kvs ...interface{}) *Emitter
- func (e *Emitter) Bool(key string, value bool) *Emitter
- func (e *Emitter) Duration(key string, value time.Duration) *Emitter
- func (e *Emitter) Enabled() bool
- func (e *Emitter) Err(err error) *Emitter
- func (e *Emitter) Float64(key string, value float64) *Emitter
- func (e *Emitter) Int(key string, value int) *Emitter
- func (e *Emitter) Int64(key string, value int64) *Emitter
- func (e *Emitter) Kv(key string, value interface{}) *Emitter
- func (e *Emitter) Kvs(kvs ...interface{}) *Emitter
- func (e *Emitter) Print(args ...interface{})
- func (e *Emitter) Printf(msg string, args ...interface{})
- func (e *Emitter) Str(key string, value string) *Emitter
- func (e *Emitter) StrSlice(key string, value []string) *Emitter
- func (e *Emitter) Time(key string, value time.Time) *Emitter
- func (e *Emitter) Uint(key string, value uint) *Emitter
- func (e *Emitter) Uint64(key string, value uint64) *Emitter
- type Encoder
- type Hook
- type HookFunc
- type Logger
- func Clone() Logger
- func New(name string) Logger
- func WithContext(key string, value interface{}) Logger
- func WithContexts(kvs ...interface{}) Logger
- func WithDepth(depth int) Logger
- func WithHooks(hooks ...Hook) Logger
- func WithLevel(level int) Logger
- func WithLevelFormat(format func(level int) string) Logger
- func WithName(name string) Logger
- func (l Logger) Alert(kvs ...interface{}) *Emitter
- func (l Logger) Clone() Logger
- func (l Logger) Contexts() (kvs []interface{})
- func (l Logger) Debug(kvs ...interface{}) *Emitter
- func (l Logger) Depth() int
- func (l Logger) Enabled(level int) bool
- func (l Logger) Error(kvs ...interface{}) *Emitter
- func (l Logger) Fatal(kvs ...interface{}) *Emitter
- func (l Logger) FormatLevel(level int) string
- func (l Logger) GetLevel() int
- func (l Logger) Hooks() []Hook
- func (l Logger) Info(kvs ...interface{}) *Emitter
- func (l Logger) Level(level, depth int) *Emitter
- func (l Logger) Log(level, depth int, msg string, keysAndValues ...interface{})
- func (l Logger) Name() string
- func (l Logger) Panic(kvs ...interface{}) *Emitter
- func (l Logger) Sampler() Sampler
- func (l *Logger) SetLevel(level int)
- func (l *Logger) SetLevelFormat(format func(level int) string)
- func (l Logger) StdLogger(prefix string, level int) *log.Logger
- func (l Logger) Trace(kvs ...interface{}) *Emitter
- func (l Logger) Warn(kvs ...interface{}) *Emitter
- func (l Logger) WithContext(key string, value interface{}) Logger
- func (l Logger) WithContexts(kvs ...interface{}) Logger
- func (l Logger) WithDepth(depth int) Logger
- func (l Logger) WithEncoder(encoder Encoder) Logger
- func (l Logger) WithHooks(hooks ...Hook) Logger
- func (l Logger) WithLevel(level int) Logger
- func (l Logger) WithLevelFormat(format func(level int) string) Logger
- func (l Logger) WithName(name string) Logger
- func (l Logger) WithSampler(sampler Sampler) Logger
- func (l Logger) WithWriter(writer io.Writer) Logger
- func (l Logger) Write(p []byte) (n int, err error)
- type Output
- type Sampler
- type SamplerFunc
- type SwitchSampler
Constants ¶
const ( LvlTrace = int(0) LvlDebug = int(20) LvlInfo = int(40) LvlWarn = int(60) LvlError = int(80) LvlAlert = int(100) LvlPanic = int(120) LvlFatal = int(126) LvlDisable = int(127) )
Predefine some levels.
Variables ¶
var CallerFormatFunc = func(file, name string, line int) string { if index := strings.LastIndexByte(name, '.'); index > -1 { name = name[index+1:] } return fmt.Sprintf("%s:%s:%d", filepath.Base(file), name, line) }
CallerFormatFunc is used to format the file, name and line of the caller.
var DefaultBufferCap = 256
DefaultBufferCap is the default capacity of the buffer to encode the log.
var DefaultLogger = New("").WithHooks(Caller("caller"))
DefaultLogger is the default global logger.
var FormatLevel func(level int) string = formatLevel
FormatLevel is used to format the level to string.
var OnExit func()
OnExit is called before the program exits when to emit the log with LvlFatal.
Functions ¶
func FileWriter ¶
func FileWriter(filename, filesize string, filenum int) io.WriteCloser
FileWriter returns a writer based the file, which uses NewSizedRotatingFile to generate the file writer. If filename is "", however, it will return an os.Stderr writer instead.
filesize is parsed by ParseSize to get the size of the log file. If it is "", it is "100M" by default.
filenum is the number of the log file. If it is 0 or negative, it will be reset to 100.
Notice: if the directory in where filename is does not exist, it will be created automatically.
func GetCallStack ¶ added in v0.15.0
GetCallStack returns the call stacks.
func GetGlobalLevel ¶ added in v0.7.0
func GetGlobalLevel() int
GetGlobalLevel returns the global level setting.
Notice: if the returned level value is negative, it represents that no global level is set.
func GlobalDisableSampling ¶ added in v0.7.0
func GlobalDisableSampling(disable bool)
GlobalDisableSampling is used to disable all the samplings globally.
func LevelIsValid ¶ added in v0.8.0
LevelIsValid reports whether the level is valid, that's, [LvlTrace, LvlDisable].
func ParseLevel ¶ added in v0.7.0
ParseLevel parses a string to the level.
Support the level string as follow, which is case insensitive:
trace debug info warn error alert panic fatal disable
func SetEncoder ¶ added in v0.7.0
func SetEncoder(enc Encoder)
SetEncoder is eqaul to DefaultLogger.SetEncoder(enc).
func SetGlobalLevel ¶ added in v0.7.0
func SetGlobalLevel(level int)
SetGlobalLevel sets the global level, which will act on all the logger.
If the level is negative, it will unset the global level.
func SetLevel ¶ added in v0.4.0
func SetLevel(level int)
SetLevel is equal to DefaultLogger.SetLevel(level).
func SetLevelFormat ¶ added in v0.14.0
SetLevelFormat is equal to DefaultLogger.SetLevelFormat(format).
func WrapPanic ¶ added in v0.2.0
func WrapPanic(keysAndValues ...interface{})
WrapPanic wraps and logs the panic, which should be called directly with defer, For example,
defer WrapPanic() defer WrapPanic("key1", "value1") defer WrapPanic("key1", "value1", "key2", "value2") defer WrapPanic("key1", "value1", "key2", "value2", "key3", "value3")
Types ¶
type Emitter ¶ added in v0.10.0
type Emitter struct {
// contains filtered or unexported fields
}
Emitter is used to emit the log message.
func Alert ¶ added in v0.8.0
func Alert(kvs ...interface{}) *Emitter
Alert is equal to DefaultLogger.Alert(kvs...)).
func Panic ¶ added in v0.7.0
func Panic(kvs ...interface{}) *Emitter
Panic is equal to DefaultLogger.Panic(kvs...).
func (*Emitter) Bool ¶ added in v0.11.0
Bool is equal to e.Kv(key, value), but optimized for the value typed bool.
func (*Emitter) Duration ¶ added in v0.11.0
Duration is equal to e.Kv(key, value), but optimized for the value typed time.Duration.
func (*Emitter) Float64 ¶ added in v0.11.0
Float64 is equal to e.Kv(key, value), but optimized for the value typed float64.
func (*Emitter) Int ¶ added in v0.11.0
Int is equal to e.Kv(key, value), but optimized for the value typed int.
func (*Emitter) Int64 ¶ added in v0.11.0
Int64 is equal to e.Kv(key, value), but optimized for the value typed int64.
func (*Emitter) Kv ¶ added in v0.10.0
Kv appends a key-value context into the log message and returns the emitter itself.
func (*Emitter) Kvs ¶ added in v0.10.0
Kvs appends a set of the key-value contexts into the log message, and returns the emitter itself.
func (*Emitter) Print ¶ added in v0.10.0
func (e *Emitter) Print(args ...interface{})
Print emits the log message to the underlying writer.
func (*Emitter) Str ¶ added in v0.11.0
Str is equal to e.Kv(key, value), but optimized for the value typed string.
func (*Emitter) StrSlice ¶ added in v0.12.0
StrSlice is equal to e.Kv(key, value), but optimized for the value typed []string.
func (*Emitter) Time ¶ added in v0.11.0
Time is equal to e.Kv(key, value), but optimized for the value typed time.Time.
type Encoder ¶
type Encoder interface { // Start starts to encode the log record into the buffer dst. Start(dst []byte, loggerName, level string) []byte // Encode encodes the key-value with the stack depth into the buffer dst. Encode(dst []byte, key string, value interface{}) []byte // End ends to encode the log record with the message into the buffer dst. End(dst []byte, msg string) []byte }
Encoder is used to encode the log record.
type Logger ¶
type Logger struct { *Output // contains filtered or unexported fields }
Logger is the structured logger based on the key-value.
func New ¶
New creates a new root logger, which encodes the log message as JSON and output the encoded log to os.Stderr.
func WithContext ¶ added in v0.10.0
WithContext is equal to DefaultLogger.WithContext(key, value).
func WithContexts ¶ added in v0.10.0
func WithContexts(kvs ...interface{}) Logger
WithContexts is equal to DefaultLogger.WithContexts(kvs...).
func WithLevelFormat ¶ added in v0.14.0
WithLevelFormat is equal to DefaultLogger.WithLevelFormat(format).
func (Logger) Contexts ¶ added in v0.10.0
func (l Logger) Contexts() (kvs []interface{})
Contexts returns the key-value contexts.
func (Logger) FormatLevel ¶ added in v0.14.0
FormatLevel formats the level to string.
func (Logger) Log ¶
Log is convenient function to emit a log, which is equal to l.Level(level, 0).Kvs(keysAndValues...).Printf(msg).
func (Logger) Sampler ¶ added in v0.10.0
Sampler returns the sampler.
If no sampler is set, return nil.
func (*Logger) SetLevelFormat ¶ added in v0.14.0
SetLevelFormat resets the level formatter, which is not thread-safe.
If format is nil or not set, use FormatLevel instead.
func (Logger) StdLogger ¶ added in v0.13.0
StdLogger returns a new log.Logger based on the current logger engine with the prefix and level.
func (Logger) WithContext ¶ added in v0.10.0
WithContext returns a new logger that appends the key-value context.
func (Logger) WithContexts ¶ added in v0.10.0
WithContexts returns a new logger that appends a set of the key-value contexts.
func (Logger) WithDepth ¶
WithDepth returns a new logger with the depth of the stack out of the logger.
func (Logger) WithEncoder ¶
WithEncoder returns a new logger with the new output created the new encoder and the original writer, which will also re-encode all the key-value contexts.
func (Logger) WithLevelFormat ¶ added in v0.14.0
WithLevelFormat returns a new logger with the customized level formatter.
If format is nil, use FormatLevel instead.
func (Logger) WithName ¶
WithName returns a new logger with the name.
- If name is empty, the name of the new logger is equal to l.name.
- If both name and l.name are not empty, it is equal to l.Name()+"."+name.
func (Logger) WithSampler ¶ added in v0.10.0
WithSampler returns a new logger with the sampler.
If the sampler is nil, it will cancel the sampler.
func (Logger) WithWriter ¶ added in v0.10.0
WithWriter returns a new logger with the writer.
type Output ¶ added in v0.7.0
type Output struct {
// contains filtered or unexported fields
}
Output is used to handle the log output.
func NewOutput ¶ added in v0.7.0
NewOutput returns a new log output.
If the encoder is nil, use JSONEncoder in the sub-package encoder by default.
func (*Output) GetEncoder ¶ added in v0.7.0
GetEncoder returns the log encoder.
func (*Output) SetEncoder ¶ added in v0.7.0
SetEncoder resets the log encoder to enc.
type Sampler ¶ added in v0.7.0
type Sampler interface { // Sample reports whether the log message should be sampled. // If the log message should be sampled, return true. Or, return false, // that's, the log message will be discarded. Sample(loggerName string, level int) bool }
Sampler is used to sample the log message.
type SamplerFunc ¶ added in v0.7.0
SamplerFunc is a function sampler.
type SwitchSampler ¶ added in v0.8.0
type SwitchSampler struct {
// contains filtered or unexported fields
}
SwitchSampler is a sampler to switch the proxy sampler.
func NewSwitchSampler ¶ added in v0.8.0
func NewSwitchSampler(sampler Sampler) *SwitchSampler
NewSwitchSampler returns a new SwitchSampler with the wrapped sampler.
func (*SwitchSampler) Get ¶ added in v0.8.0
func (s *SwitchSampler) Get() Sampler
Get returns the sampler.
func (*SwitchSampler) Sample ¶ added in v0.8.0
func (s *SwitchSampler) Sample(name string, level int) bool
Sample implements the interface Sampler.
func (*SwitchSampler) Set ¶ added in v0.8.0
func (s *SwitchSampler) Set(sampler Sampler)
Set resets the sampler.
Source Files
¶
Directories
¶
Path | Synopsis |
---|---|
Package encoder provides the encoder to encode the log message.
|
Package encoder provides the encoder to encode the log message. |
kvjson
Package kvjson is used to encode the json key-value pair.
|
Package kvjson is used to encode the json key-value pair. |
Package writer provides some log writers.
|
Package writer provides some log writers. |