63 lines
2.4 KiB
Markdown
63 lines
2.4 KiB
Markdown
> **Warning**: \
|
|
> This library has been archived. Please use the new [loggers](https://pkg.go.dev/go.elara.ws/loggers) package with Go's [log/slog](https://pkg.go.dev/log/slog) interface.
|
|
|
|
# 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.elara.ws/logger/log"
|
|
"go.elara.ws/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()
|
|
}
|
|
```
|