Documentation
¶
Overview ¶
package logg implements a simple structured logging API.
Example ¶
package main import ( "bytes" "fmt" "github.com/bep/logg" "github.com/bep/logg/handlers/text" ) func main() { var buff bytes.Buffer // Create a new logger. l := logg.New( logg.Options{ Level: logg.LevelInfo, Handler: text.New(&buff, text.Options{Separator: " "}), }, ) // Create a new log context. infoLogger := l.WithLevel(logg.LevelInfo) // Logg some user activity. userLogger := infoLogger.WithField("user", "foo").WithField("id", "123") userLogger.Log(logg.String("logged in")) userLogger.WithField("file", "jokes.txt").Log(logg.String("uploaded")) userLogger.WithField("file", "morejokes.txt").Log(logg.String("uploaded")) fmt.Print(buff.String()) }
Output: INFO logged in user=foo id=123 INFO uploaded user=foo id=123 file=jokes.txt INFO uploaded user=foo id=123 file=morejokes.txt
Example (Lazy_evaluation) ¶
package main import ( "bytes" "fmt" "strings" "time" "github.com/bep/logg" "github.com/bep/logg/handlers/text" ) func main() { var buff bytes.Buffer // Create a new logger. l := logg.New( logg.Options{ Level: logg.LevelError, Handler: text.New(&buff, text.Options{Separator: "|"}), }, ) errorLogger := l.WithLevel(logg.LevelError) // Info is below the logger's level, so // nothing will be printed. infoLogger := l.WithLevel(logg.LevelInfo) // Simulate a busy loop. for i := 0; i < 999; i++ { ctx := infoLogger.WithFields( logg.NewFieldsFunc( // This func will never be invoked with the current logger's level. func() logg.Fields { return logg.Fields{ {"field", strings.Repeat("x", 9999)}, } }), ) ctx.Log(logg.StringFunc( // This func will never be invoked with the current logger's level. func() string { return "log message: " + strings.Repeat("x", 9999) }, )) } errorLogger.WithDuration(32 * time.Second).Log(logg.String("something took too long")) fmt.Print(buff.String()) }
Output: ERROR|something took too long|duration=32000
Index ¶
- Variables
- type Clock
- type Entry
- func (e *Entry) Clone() *Entry
- func (e *Entry) Log(s fmt.Stringer)
- func (e *Entry) Logf(format string, a ...any)
- func (e *Entry) WithDuration(d time.Duration) *Entry
- func (e *Entry) WithError(err error) *Entry
- func (e *Entry) WithField(key string, value any) *Entry
- func (e *Entry) WithFields(fielder Fielder) *Entry
- func (e Entry) WithLevel(level Level) *Entry
- type Field
- type Fielder
- type Fields
- type FieldsFunc
- type Handler
- type HandlerFunc
- type Level
- type LevelLogger
- type Logger
- type Options
- type String
- type StringFunc
Examples ¶
Constants ¶
This section is empty.
Variables ¶
var ErrInvalidLevel = errors.New("invalid level")
ErrInvalidLevel is returned if the severity level is invalid.
var ErrStopLogEntry = fmt.Errorf("stop log entry")
ErrStopLogEntry is a sentinel error that can be returned from a handler to stop the entry from being passed to the next handler.
Functions ¶
This section is empty.
Types ¶
type Entry ¶
type Entry struct { Level Level `json:"level"` Timestamp time.Time `json:"timestamp"` Fields Fields `json:"fields,omitempty"` Message string `json:"message"` // contains filtered or unexported fields }
Entry represents a single log entry at a given log level.
func (*Entry) WithError ¶
WithError returns a new entry with the "error" set to `err`.
The given error may implement .Fielder, if it does the method will add all its `.Fields()` into the returned entry.
func (*Entry) WithFields ¶
type Fielder ¶
type Fielder interface {
Fields() Fields
}
Fielder is an interface for providing fields to custom types.
type Fields ¶
type Fields []Field
Fields represents a slice of entry level data used for structured logging.
type FieldsFunc ¶
type FieldsFunc func() Fields
func NewFieldsFunc ¶
func NewFieldsFunc(fn func() Fields) FieldsFunc
func (FieldsFunc) Fields ¶
func (f FieldsFunc) Fields() Fields
type Handler ¶
type Handler interface { // HandleLog is invoked for each log event. // Note that if the Entry is going to be used after the call to HandleLog // in the handler chain returns, it must be cloned with Clone(). See // the memory.Handler implementation for an example. // // The Entry can be modified if needed, e.g. when passed down via // a multi.Handler (e.g. to sanitize the data). HandleLog(e *Entry) error }
Handler is used to handle log events, outputting them to stdio or sending them to remote services. See the "handlers" directory for implementations.
It is left up to Handlers to implement thread-safety.
type HandlerFunc ¶
The HandlerFunc type is an adapter to allow the use of ordinary functions as log handlers. If f is a function with the appropriate signature, HandlerFunc(f) is a Handler object that calls f.
type Level ¶
type Level int
Level of severity.
Log levels.
func MustParseLevel ¶
MustParseLevel parses level string or panics.
func (*Level) UnmarshalJSON ¶
UnmarshalJSON implementation.
type LevelLogger ¶
type LevelLogger interface { // Log logs a message at the given level using the string from calling s.String(). // Note that s.String() will not be called if the level is not enabled. Log(s fmt.Stringer) // Logf logs a message at the given level using the format and args from calling fmt.Sprintf(). // Note that fmt.Sprintf() will not be called if the level is not enabled. Logf(format string, a ...any) // WithLevel returns a new entry with `level` set. WithLevel(Level) *Entry // WithFields returns a new entry with the`fields` in fields set. // This is a noop if LevelLogger's level is less than Logger's. WithFields(fields Fielder) *Entry // WithLevel returns a new entry with the field f set with value v // This is a noop if LevelLogger's level is less than Logger's. WithField(f string, v any) *Entry // WithDuration returns a new entry with the "duration" field set // to the given duration in milliseconds. // This is a noop if LevelLogger's level is less than Logger's. WithDuration(time.Duration) *Entry // WithError returns a new entry with the "error" set to `err`. // This is a noop if err is nil or LevelLogger's level is less than Logger's. WithError(error) *Entry }
LevelLogger is the logger at a given level.
type Logger ¶
type Logger interface { // WithLevel returns a new entry with `level` set. WithLevel(Level) *Entry }
Logger is the main interface for the logger.
type Options ¶
type Options struct { // Level is the minimum level to log at. // If not set, defaults to InfoLevel. Level Level // Handler is the log handler to use. Handler Handler // Clock is the clock to use for timestamps. // If not set, the system clock is used. Clock Clock }
Options is the set of options used to configure a logger.
type String ¶
type String string
String implements fmt.Stringer and can be used directly in the log methods.
type StringFunc ¶
type StringFunc func() string
StringFunc is a function that returns a string. It also implements the fmt.Stringer interface and can therefore be used as argument to the log methods.
func (StringFunc) String ¶
func (f StringFunc) String() string
Source Files
¶
Directories
¶
Path | Synopsis |
---|---|
benchmarks
module
|
|
cli
Package cli implements a colored text handler suitable for command-line interfaces.
|
Package cli implements a colored text handler suitable for command-line interfaces. |
json
Package json implements a JSON handler.
|
Package json implements a JSON handler. |
level
Package level implements a level filter handler.
|
Package level implements a level filter handler. |
memory
Package memory implements an in-memory handler useful for testing, as the entries can be accessed after writes.
|
Package memory implements an in-memory handler useful for testing, as the entries can be accessed after writes. |
multi
Package multi implements a handler which invokes a number of handlers.
|
Package multi implements a handler which invokes a number of handlers. |
text
Package text implements a development-friendly textual handler.
|
Package text implements a development-friendly textual handler. |