logger/README.md

60 lines
2.2 KiB
Markdown

# Logger
Logger is a simple and fast logger that can write both machine-readable and human-readable logs.
### Why?
I really like zerolog, and especially its `ConsoleLogger`. I used it in all my command-line applications, but it has an issue. Zerolog can only output in JSON or CBOR. It can't produce human-readable output such as what the `ConsoleLogger` outputs, so zerolog unmarshals JSON generated by the logger and then makes human-readable output out of it. In my opinion, that's incredibly wasteful, so I made a light structured logger that can write logs in whatever format I need. Logger can use any logging implementation that implements the `logger.Logger` interface.
### Benchmarks
Logger is very fast. Here are its benchmarks, done on my laptop:
```text
goos: linux
goarch: amd64
pkg: logger
cpu: 11th Gen Intel(R) Core(TM) i7-1185G7 @ 3.00GHz
BenchmarkJSON/one-field-8 4216245 294.0 ns/op 160 B/op 3 allocs/op
BenchmarkJSON/two-field-8 1939634 594.3 ns/op 188 B/op 5 allocs/op
BenchmarkJSON/all-8 310526 3955 ns/op 752 B/op 21 allocs/op
BenchmarkPretty/one-field-8 1603789 658.5 ns/op 168 B/op 4 allocs/op
BenchmarkPretty/two-field-8 1388920 864.5 ns/op 200 B/op 6 allocs/op
BenchmarkPretty/all-8 285554 3726 ns/op 760 B/op 22 allocs/op
```
To run the benchmarks yourself, simply clone this repo and run `go test -bench=.`. Keep in mind that they will be different, depending on what your computer's specs are.
### Example
```go
package main
import (
"strconv"
"os"
"go.arsenm.dev/logger/log"
"go.arsenm.dev/logger"
)
func init() {
// Default logger is JSONLogger going to stderr
log.Logger = logger.NewPretty(os.Stdout)
}
func main() {
s := "hello"
i, err := strconv.Atoi(s)
if err != nil {
log.Error("Couldn't convert to integer").
Str("input", s).
Err(err).
Send()
}
log.Info("Converted to integer").
Int("output", i).
Send()
}
```