log: json output is now colored on when tty is available

This commit is contained in:
Tigor Hutasuhut 2024-05-14 18:49:06 +07:00
parent ee2e307f6a
commit 0d849ec172
4 changed files with 28 additions and 3 deletions

View file

@ -13,7 +13,7 @@ export REDMAGE_WEB_DEPENDENCIES_ALPINEJS_VERSION=$(shell echo "$${REDMAGE_WEB_DE
export REDMAGE_RUNTIME_VERSION=$(shell echo "$${REDMAGE_RUNTIME_VERSION:-unknown}") export REDMAGE_RUNTIME_VERSION=$(shell echo "$${REDMAGE_RUNTIME_VERSION:-unknown}")
start: dev-dependencies web-dependencies migrate-up start: dev-dependencies web-dependencies migrate-up
air REDMAGE_RUNTIME_VERSION=$(shell git describe --tags --abbrev=0) air
dev-dependencies: build-dependencies dev-dependencies: build-dependencies
@if ! command -v air > /dev/null; then @if ! command -v air > /dev/null; then

1
go.mod
View file

@ -49,6 +49,7 @@ require (
github.com/qdm12/reprint v0.0.0-20200326205758-722754a53494 // indirect github.com/qdm12/reprint v0.0.0-20200326205758-722754a53494 // indirect
github.com/samber/lo v1.39.0 // indirect github.com/samber/lo v1.39.0 // indirect
github.com/stephenafamo/scan v0.5.0 // indirect github.com/stephenafamo/scan v0.5.0 // indirect
github.com/tidwall/pretty v1.2.1 // indirect
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.26.0 // indirect go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.26.0 // indirect
go.opentelemetry.io/proto/otlp v1.2.0 // indirect go.opentelemetry.io/proto/otlp v1.2.0 // indirect
golang.org/x/image v0.15.0 // indirect golang.org/x/image v0.15.0 // indirect

2
go.sum
View file

@ -374,6 +374,8 @@ github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsT
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
github.com/teivah/broadcast v0.1.0 h1:UMs1tn8w20Xlnod+VbLbwH3dzEH2zfJy4lxdzZjQLL0= github.com/teivah/broadcast v0.1.0 h1:UMs1tn8w20Xlnod+VbLbwH3dzEH2zfJy4lxdzZjQLL0=
github.com/teivah/broadcast v0.1.0/go.mod h1:mXEgvXdYz2xUkQFARxI+jyX1MfCBwMDiGjIKSAsEq1g= github.com/teivah/broadcast v0.1.0/go.mod h1:mXEgvXdYz2xUkQFARxI+jyX1MfCBwMDiGjIKSAsEq1g=
github.com/tidwall/pretty v1.2.1 h1:qjsOFOWWQl+N3RsoF5/ssm1pHmJJwhjlSbZ51I6wMl4=
github.com/tidwall/pretty v1.2.1/go.mod h1:ITEVvHYasfjBbM0u2Pg8T2nJnzm8xPwvNhhsoaGGjNU=
github.com/volatiletech/inflect v0.0.1 h1:2a6FcMQyhmPZcLa+uet3VJ8gLn/9svWhJxJYwvE8KsU= github.com/volatiletech/inflect v0.0.1 h1:2a6FcMQyhmPZcLa+uet3VJ8gLn/9svWhJxJYwvE8KsU=
github.com/volatiletech/inflect v0.0.1/go.mod h1:IBti31tG6phkHitLlr5j7shC5SOo//x0AjDzaJU1PLA= github.com/volatiletech/inflect v0.0.1/go.mod h1:IBti31tG6phkHitLlr5j7shC5SOo//x0AjDzaJU1PLA=
github.com/volatiletech/strmangle v0.0.4 h1:CxrEPhobZL/PCZOTDSH1aq7s4Kv76hQpRoTVVlUOim4= github.com/volatiletech/strmangle v0.0.4 h1:CxrEPhobZL/PCZOTDSH1aq7s4Kv76hQpRoTVVlUOim4=

View file

@ -3,7 +3,6 @@ package log
import ( import (
"bytes" "bytes"
"context" "context"
"encoding/json"
"io" "io"
"log/slog" "log/slog"
"os" "os"
@ -11,6 +10,7 @@ import (
"sync" "sync"
"github.com/fatih/color" "github.com/fatih/color"
"github.com/tidwall/pretty"
"github.com/tigorlazuardi/redmage/pkg/caller" "github.com/tigorlazuardi/redmage/pkg/caller"
) )
@ -69,6 +69,25 @@ func putBuffer(buf *bytes.Buffer) {
} }
} }
var jsonColorStyle = &pretty.Style{
Key: [2]string{"\x1B[95m", "\x1B[0m"},
String: [2]string{"\x1B[32m", "\x1B[0m"},
Number: [2]string{"\x1B[33m", "\x1B[0m"},
True: [2]string{"\x1B[36m", "\x1B[0m"},
False: [2]string{"\x1B[36m", "\x1B[0m"},
Null: [2]string{"\x1B[2m", "\x1B[0m"},
Escape: [2]string{"\x1B[35m", "\x1B[0m"},
Brackets: [2]string{"\x1B[0m", "\x1B[0m"},
Append: pretty.TerminalStyle.Append,
}
var jsonPrettyOpts = &pretty.Options{
Width: 80,
Prefix: "",
Indent: " ",
SortKeys: false,
}
// Handle implements slog.Handler interface. // Handle implements slog.Handler interface.
func (pr *PrettyHandler) Handle(ctx context.Context, record slog.Record) error { func (pr *PrettyHandler) Handle(ctx context.Context, record slog.Record) error {
var levelColor *color.Color var levelColor *color.Color
@ -117,7 +136,10 @@ func (pr *PrettyHandler) Handle(ctx context.Context, record slog.Record) error {
serializer := pr.createSerializer(jsonBuf) serializer := pr.createSerializer(jsonBuf)
_ = serializer.Handle(ctx, record) _ = serializer.Handle(ctx, record)
if jsonBuf.Len() > 3 { // Ignore empty json like "{}\n" if jsonBuf.Len() > 3 { // Ignore empty json like "{}\n"
_ = json.Indent(buf, jsonBuf.Bytes(), "", " ") jsonData := jsonBuf.Bytes()
jsonData = pretty.PrettyOptions(jsonData, jsonPrettyOpts)
jsonData = pretty.Color(jsonData, jsonColorStyle)
buf.Write(jsonData)
} }
buf.WriteByte('\n') buf.WriteByte('\n')