Skip to content

Commit 1317202

Browse files
committed
feat: add colors for logs
1 parent c594ed4 commit 1317202

4 files changed

Lines changed: 85 additions & 2 deletions

File tree

internal/app/enaptercli/cmd_base.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,10 @@ type cmdBase struct {
3131
siteID string
3232
apiAllowInsecure bool
3333
verbose bool
34-
userAgent string
34+
colorize bool
3535
writer io.Writer
3636
errWriter io.Writer
37+
userAgent string
3738
httpClient *http.Client
3839
}
3940

@@ -83,9 +84,11 @@ func (c *cmdBase) Before(cliCtx *cli.Context) error {
8384
return err
8485
}
8586

86-
c.userAgent = "enapter-cli/" + cliCtx.App.Version
8787
c.writer = cliCtx.App.Writer
8888
c.errWriter = cliCtx.App.ErrWriter
89+
c.colorize = colorsSupported(c.writer)
90+
91+
c.userAgent = "enapter-cli/" + cliCtx.App.Version
8992
c.httpClient = &http.Client{
9093
Transport: &http.Transport{
9194
//nolint:gosec // This is needed to allow self-signed certificates on Gateway.

internal/app/enaptercli/cmd_device_logs.go

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,15 @@ func (c *cmdDeviceLogs) doFollow(ctx context.Context) error {
148148
if err := json.NewDecoder(r).Decode(&msg); err != nil {
149149
return fmt.Errorf("parse payload: %w", err)
150150
}
151+
152+
color := c.logColor(msg.Log.Severity)
153+
if color != "" {
154+
fmt.Fprint(c.writer, color)
155+
}
151156
fmt.Fprintf(c.writer, "%s [%s] %s\n", msg.ReceivedAt, msg.Log.Severity, msg.Log.Message)
157+
if color != "" {
158+
fmt.Fprint(c.writer, colorReset)
159+
}
152160
return nil
153161
},
154162
})
@@ -196,9 +204,30 @@ func (c *cmdDeviceLogs) doList(ctx context.Context) error {
196204
return fmt.Errorf("parse response body: %w", err)
197205
}
198206
for _, l := range resp.Logs {
207+
color := c.logColor(l.Severity)
208+
if color != "" {
209+
fmt.Fprint(c.writer, color)
210+
}
199211
fmt.Fprintf(c.writer, "%s [%s] %s\n", l.ReceivedAt, l.Severity, l.Message)
212+
if color != "" {
213+
fmt.Fprint(c.writer, colorReset)
214+
}
200215
}
201216
return nil
202217
}),
203218
})
204219
}
220+
221+
func (c *cmdDeviceLogs) logColor(severity string) string {
222+
if !c.colorize {
223+
return ""
224+
}
225+
switch severity {
226+
case "warning":
227+
return colorYellow
228+
case "error":
229+
return colorRed
230+
default:
231+
return ""
232+
}
233+
}

internal/app/enaptercli/cmd_device_monitor.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,11 @@ func (c *cmdDeviceMonitor) process(r io.Reader, deviceID, runtimeID string) erro
132132
return fmt.Errorf("parse payload: %w", err)
133133
}
134134

135+
color := c.messageColor(m)
136+
if color != "" {
137+
fmt.Fprint(c.writer, color)
138+
}
139+
135140
fmt.Fprint(c.writer, c.messageTimestamp(m))
136141
fmt.Fprint(c.writer, " ")
137142

@@ -154,11 +159,29 @@ func (c *cmdDeviceMonitor) process(r io.Reader, deviceID, runtimeID string) erro
154159
fmt.Fprintf(c.writer, "[%s] %s", m.Log.Severity, m.Log.Message)
155160
}
156161

162+
if color != "" {
163+
fmt.Fprint(c.writer, colorReset)
164+
}
157165
fmt.Fprintln(c.writer)
158166

159167
return nil
160168
}
161169

170+
func (c *cmdDeviceMonitor) messageColor(m streamMessage) string {
171+
if !c.colorize {
172+
return ""
173+
}
174+
if m.Log != nil {
175+
switch m.Log.Severity {
176+
case "warning":
177+
return colorYellow
178+
case "error":
179+
return colorRed
180+
}
181+
}
182+
return ""
183+
}
184+
162185
func (c *cmdDeviceMonitor) messageTimestamp(m streamMessage) string {
163186
ts := m.ReceivedAt
164187
if ts.IsZero() {

internal/app/enaptercli/colors.go

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package enaptercli
2+
3+
import (
4+
"io"
5+
"os"
6+
7+
"golang.org/x/term"
8+
)
9+
10+
const (
11+
colorRed = "\033[31m"
12+
colorYellow = "\033[33m"
13+
colorReset = "\033[0m"
14+
)
15+
16+
func colorsSupported(w io.Writer) bool {
17+
f, ok := w.(*os.File)
18+
if !ok {
19+
return false
20+
}
21+
if !term.IsTerminal(int(f.Fd())) {
22+
return false
23+
}
24+
if _, ok := os.LookupEnv("NO_COLOR"); ok {
25+
return false
26+
}
27+
return true
28+
}

0 commit comments

Comments
 (0)