Skip to content

Commit 660979d

Browse files
authoredMay 28, 2024··
Merge pull request #1141 from skrashevich/feat-log-terminal-check
feat(logging): add interactive shell detection for console output
2 parents 50ad3b2 + a6b9b49 commit 660979d

File tree

2 files changed

+28
-18
lines changed

2 files changed

+28
-18
lines changed
 

‎internal/app/app.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ func Init() {
119119
}
120120

121121
cfg.Mod = map[string]string{
122-
"format": "color",
122+
"format": "", // useless, but anyway
123123
"level": "info",
124124
"output": "stdout", // TODO: change to stderr someday
125125
"time": zerolog.TimeFormatUnixMs,

‎internal/app/log.go

+27-17
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,21 @@ import (
44
"io"
55
"os"
66

7+
"github.com/mattn/go-isatty"
78
"github.com/rs/zerolog"
89
"github.com/rs/zerolog/log"
910
)
1011

1112
var MemoryLog = newBuffer(16)
1213

14+
// NewLogger support:
15+
// - output: empty (only to memory), stderr, stdout
16+
// - format: empty (autodetect color support), color, json, text
17+
// - time: empty (disable timestamp), UNIXMS, UNIXMICRO, UNIXNANO
18+
// - level: disabled, trace, debug, info, warn, error...
1319
func NewLogger(config map[string]string) zerolog.Logger {
1420
var writer io.Writer
1521

16-
// support output only to memory
1722
switch config["output"] {
1823
case "stderr":
1924
writer = os.Stderr
@@ -24,26 +29,31 @@ func NewLogger(config map[string]string) zerolog.Logger {
2429
timeFormat := config["time"]
2530

2631
if writer != nil {
27-
switch format := config["format"]; format {
28-
case "color", "text":
32+
if format := config["format"]; format != "json" {
33+
console := &zerolog.ConsoleWriter{Out: writer}
34+
35+
switch format {
36+
case "text":
37+
console.NoColor = true
38+
case "color":
39+
console.NoColor = false // useless, but anyway
40+
default:
41+
// autodetection if output support color
42+
// go-isatty - dependency for go-colorable - dependency for ConsoleWriter
43+
console.NoColor = !isatty.IsTerminal(writer.(*os.File).Fd())
44+
}
45+
2946
if timeFormat != "" {
30-
writer = &zerolog.ConsoleWriter{
31-
Out: writer,
32-
NoColor: format == "text",
33-
TimeFormat: "15:04:05.000",
34-
}
47+
console.TimeFormat = "15:04:05.000"
3548
} else {
36-
writer = &zerolog.ConsoleWriter{
37-
Out: writer,
38-
NoColor: format == "text",
39-
PartsOrder: []string{
40-
zerolog.LevelFieldName,
41-
zerolog.CallerFieldName,
42-
zerolog.MessageFieldName,
43-
},
49+
console.PartsOrder = []string{
50+
zerolog.LevelFieldName,
51+
zerolog.CallerFieldName,
52+
zerolog.MessageFieldName,
4453
}
4554
}
46-
case "json": // none
55+
56+
writer = console
4757
}
4858

4959
writer = zerolog.MultiLevelWriter(writer, MemoryLog)

0 commit comments

Comments
 (0)
Please sign in to comment.