Deeply configurable logging library for Go with no configuration required to start
go get -u github.com/mishankov/logmanFor basic log output to stdout, the default logger can be used:
package main
import "github.com/mishankov/logman/loggers"
func main() {
logger := loggers.NewDefaultLogger()
logger.Info("Hello, world!")
}Output:
[2009-11-10 23:00:00 GMT+0000] [main.main:7] [Info] - Hello, world!
package main
import (
"github.com/mishankov/logman"
"github.com/mishankov/logman/loggers"
)
func main() {
logger := loggers.NewDefaultLogger()
logger.Debug("Hello,", "world!")
logger.Info("Hello,", "world!")
logger.Warn("Hello,", "world!")
logger.Error("Hello,", "world!")
logger.Fatal("Hello,", "world!")
logger.Log(logman.Info, "Hello,", "world!")
}Output:
[2009-11-10 23:00:00 GMT+0000] [main.main:11] [Debug] - Hello, world!
[2009-11-10 23:00:00 GMT+0000] [main.main:12] [Info] - Hello, world!
[2009-11-10 23:00:00 GMT+0000] [main.main:13] [Warn] - Hello, world!
[2009-11-10 23:00:00 GMT+0000] [main.main:14] [Error] - Hello, world!
[2009-11-10 23:00:00 GMT+0000] [main.main:15] [Fatal] - Hello, world!
[2009-11-10 23:00:00 GMT+0000] [main.main:17] [Info] - Hello, world!
package main
import (
"github.com/mishankov/logman"
"github.com/mishankov/logman/loggers"
)
func main() {
logger := loggers.NewDefaultLogger()
logger.Debugf("Hello, %s!", "world")
logger.Infof("Hello, %s!", "world")
logger.Warnf("Hello, %s!", "world")
logger.Errorf("Hello, %s!", "world")
logger.Fatalf("Hello, %s!", "world")
logger.Logf(logman.Info, "Hello, %s!", "world")
}Output:
[2009-11-10 23:00:00 GMT+0000] [main.main:11] [Debug] - Hello, world!
[2009-11-10 23:00:00 GMT+0000] [main.main:12] [Info] - Hello, world!
[2009-11-10 23:00:00 GMT+0000] [main.main:13] [Warn] - Hello, world!
[2009-11-10 23:00:00 GMT+0000] [main.main:14] [Error] - Hello, world!
[2009-11-10 23:00:00 GMT+0000] [main.main:15] [Fatal] - Hello, world!
[2009-11-10 23:00:00 GMT+0000] [main.main:17] [Info] - Hello, world!
Structured logging functions allow to add key-value pairs to messages
package main
import (
"github.com/mishankov/logman"
"github.com/mishankov/logman/loggers"
)
func main() {
logger := loggers.NewDefaultLogger()
logger.Debugs("Hello, world!", "key1", "value", "key2", 1234)
logger.Infos("Hello, world!", "key1", "value", "key2", 1234)
logger.Warns("Hello, world!", "key1", "value", "key2", 1234)
logger.Errors("Hello, world!", "key1", "value", "key2", 1234)
logger.Fatals("Hello, world!", "key1", "value", "key2", 1234)
logger.Logs(logman.Info, "Hello, world!", "key1", "value", "key2", 1234)
}Output:
[2009-11-10 23:00:00 GMT+0000] [main.main:11] [Debug] - Hello, world! key1=value key2=1234
[2009-11-10 23:00:00 GMT+0000] [main.main:12] [Info] - Hello, world! key1=value key2=1234
[2009-11-10 23:00:00 GMT+0000] [main.main:13] [Warn] - Hello, world! key1=value key2=1234
[2009-11-10 23:00:00 GMT+0000] [main.main:14] [Error] - Hello, world! key1=value key2=1234
[2009-11-10 23:00:00 GMT+0000] [main.main:15] [Fatal] - Hello, world! key1=value key2=1234
[2009-11-10 23:00:00 GMT+0000] [main.main:17] [Info] - Hello, world! key1=value key2=1234
logman supports logging methods that recieves context.Context as first parameters to log values from it. In default logger it does nothing. Only way to utilize it is to use custom or one of provided formatters (DefaultContextFormatter, JSONContextFormatter) with custom logger (more about it later).
Example:
package main
import (
"context"
"fmt"
"os"
"github.com/mishankov/logman"
"github.com/mishankov/logman/formatters"
)
type ContextValueKey string
func (cvk ContextValueKey) String() string {
return string(cvk)
}
const (
ContextValueKey1 ContextValueKey = "key1"
ContextValueKey2 ContextValueKey = "key2"
)
func main() {
ctx := context.Background()
ctx = context.WithValue(ctx, ContextValueKey1, "value 1")
ctx = context.WithValue(ctx, ContextValueKey2, 4)
logger := logman.NewLogger(os.Stdout, formatters.NewDefaultContextFormatter(formatters.DefaultTimeLayout, []fmt.Stringer{ContextValueKey1, ContextValueKey2}), nil)
logger.DebugsCtx(ctx, "default logger", "param1", "value1")
loggerJSON := logman.NewLogger(os.Stdout, formatters.NewJSONContextFormatter(formatters.DefaultTimeLayout, []fmt.Stringer{ContextValueKey1, ContextValueKey2}), nil)
loggerJSON.DebugsCtx(ctx, "json logger", "param1", "value1")
}Output:
time="2009-11-10 23:00:00 GMT+0000" level=Debug location=main.main:29 msg="default logger" key1="value 1" key2=4 param1=value1
{"key1":"value 1","key2":4,"level":"Debug","location":"main.main:32","msg":"json logger","param1":"value1","time":"2009-11-10 23:00:00 GMT+0000"}
You can use logman.NewLogger to create a custom logger. For example, this is how to mimic loggers.NewDefaultLogger using logman.NewLogger:
package main
import (
"os"
"github.com/mishankov/logman"
"github.com/mishankov/logman/formatters"
)
func main() {
logger := logman.NewLogger(os.Stdout, formatters.NewDefaultFormatter(formatters.DefaultFormat, formatters.DefaultTimeLayout), nil)
}Writers output logs to some destination. Every writer should implement the io.Writer interface. Logman provides FileWriter:
package main
import "github.com/mishankov/logman/writers"
func main() {
fw, _ := writers.NewFileWriter("test.log")
}DefaultLogger uses os.Stdout as writer.
Formatters format log messages before they are passed to the writer. Every formatter should implement the logman.Formatter interface. Logman provides DefaultFormatter, JSONFormatter, DefaultContextFormatter and JSONContextFormatter:
package main
import "github.com/mishankov/logman/formatters"
func main() {
formatter := formatters.NewDefaultFormatter(formatters.DefaultFormat, formatters.DefaultTimeLayout)
jsonFormatter := formatters.NewJSONFormatter()
}Filters filter log messages. Every filter should implement the logman.Filter interface. Logman provides LevelFilter:
package main
import "github.com/mishankov/logman/filters"
func main() {
filter := filters.NewLevelFilter(logman.Info)
}Let's see how to create a custom logger that outputs Error or higher level messages in JSON format to a file:
package main
import (
"github.com/mishankov/logman"
"github.com/mishankov/logman/filters"
"github.com/mishankov/logman/formatters"
"github.com/mishankov/logman/writers"
)
func main() {
fw, _ := writers.NewFileWriter("error.log")
formatter := formatters.NewJSONFormatter()
filter := filters.NewLevelFilter(logman.Error)
logger := logman.NewLogger(fw, formatter, filter)
logger.Error("Hello,", "world!")
logger.Debug("I am not logged")
}error.log content:
{"callLocation":"main.main:16","logLevel":"Error","message":"Hello, world!","time":"2009-11-10 23:00:00 GMT+0000"}- Practice Golang and TDD skills
- Simple but flexible logging for personal projects