Skip to content

Commit 20e8aae

Browse files
authored
feat: configure logging correctly using logrus (#14)
1 parent c964c48 commit 20e8aae

File tree

16 files changed

+630
-210
lines changed

16 files changed

+630
-210
lines changed

.devcontainer/Dockerfile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ RUN apt-get update \
4646
&& go install github.com/golangci/golangci-lint/cmd/[email protected] \
4747
&& go install honnef.co/go/tools/[email protected] \
4848
&& go install github.com/mgechev/[email protected] \
49+
&& go install github.com/go-delve/delve/cmd/[email protected] \
4950
# Install golangci-lint
5051
&& curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin ${GOLANGCI_LINT_V} \
5152
#

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ endif
4949
test: test-unit
5050

5151
.PHONY: test-benchmark
52-
test-benchmark: isCIlaunch-test-deps
52+
test-benchmark: launch-test-deps
5353
$(GO) test ${GO_TEST_DEFAULT_ARG} -cpu 1,2,4,8 -benchmem -bench .
5454

5555
.PHONY: test-unit

cmd/run.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ import (
66
"path"
77
"text/template"
88

9-
"github.com/argoproj-labs/argocd-image-updater/pkg/log"
109
"github.com/docplanner/helm-repo-updater/internal/app/git"
10+
"github.com/docplanner/helm-repo-updater/internal/app/log"
1111
"github.com/docplanner/helm-repo-updater/internal/app/updater"
1212
"github.com/spf13/cobra"
1313
)

go.mod

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,18 @@ require (
77
github.com/google/go-cmp v0.5.6
88
github.com/mikefarah/yq/v4 v4.16.2
99
github.com/pkg/errors v0.9.1
10-
github.com/rs/zerolog v1.26.1
1110
github.com/spf13/cobra v1.3.0
1211
github.com/spf13/viper v1.10.0
12+
github.com/stretchr/testify v1.7.0
1313
gopkg.in/op/go-logging.v1 v1.0.0-20160211212156-b2cb9fa56473
1414
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b
1515
)
1616

17+
require (
18+
github.com/davecgh/go-spew v1.1.1 // indirect
19+
github.com/pmezard/go-difflib v1.0.0 // indirect
20+
)
21+
1722
require (
1823
github.com/argoproj/argo-cd/v2 v2.1.2 // indirect
1924
github.com/argoproj/gitops-engine v0.4.1 // indirect
@@ -46,7 +51,7 @@ require (
4651
github.com/patrickmn/go-cache v2.1.0+incompatible // indirect
4752
github.com/pelletier/go-toml v1.9.4 // indirect
4853
github.com/sergi/go-diff v1.1.0 // indirect
49-
github.com/sirupsen/logrus v1.8.1 // indirect
54+
github.com/sirupsen/logrus v1.8.1
5055
github.com/spf13/afero v1.6.0 // indirect
5156
github.com/spf13/cast v1.4.1 // indirect
5257
github.com/spf13/jwalterweatherman v1.1.0 // indirect

go.sum

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -720,9 +720,6 @@ github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6So
720720
github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
721721
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
722722
github.com/rs/cors v1.6.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU=
723-
github.com/rs/xid v1.3.0/go.mod h1:trrq9SKmegXys3aeAKXMUTdJsYXVwGY3RLcfgqegfbg=
724-
github.com/rs/zerolog v1.26.1 h1:/ihwxqH+4z8UxyI70wM1z9yCvkWcfz/a3mj48k/Zngc=
725-
github.com/rs/zerolog v1.26.1/go.mod h1:/wSSJWX7lVrsOwlbyTRSOJvqRlc+WjWlfes+CiJ+tmc=
726723
github.com/rubiojr/go-vhd v0.0.0-20200706105327-02e210299021/go.mod h1:DM5xW0nvfNNm2uytzsvhI3OnX8uzaRAg8UX/CnDqbto=
727724
github.com/russross/blackfriday v0.0.0-20170610170232-067529f716f4/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=
728725
github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=
@@ -827,7 +824,6 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de
827824
github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
828825
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
829826
github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
830-
github.com/yuin/goldmark v1.4.0/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
831827
github.com/yuin/gopher-lua v0.0.0-20200816102855-ee81675732da/go.mod h1:E1AXubJBdNmFERAOucpDIxNzeGfLzg0mYh+UfMWdChA=
832828
github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs=
833829
github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA=
@@ -996,7 +992,6 @@ golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96b
996992
golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=
997993
golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
998994
golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
999-
golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
1000995
golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
1001996
golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f h1:OfiFi4JbukWwe3lzw+xunroH1mnC1e2Gy5cxNJApiSY=
1002997
golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
@@ -1115,7 +1110,6 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc
11151110
golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
11161111
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
11171112
golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
1118-
golang.org/x/sys v0.0.0-20210809222454-d867a43fc93e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
11191113
golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
11201114
golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
11211115
golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
@@ -1215,7 +1209,6 @@ golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
12151209
golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
12161210
golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
12171211
golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
1218-
golang.org/x/tools v0.1.7/go.mod h1:LGqMHiF4EqQNHR1JncWGqT5BVaXmza+X+BDGol+dOxo=
12191212
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
12201213
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
12211214
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=

internal/app/log/log.go

Lines changed: 177 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,177 @@
1+
package log
2+
3+
// Wrapper package around logrus whose main purpose is to support having
4+
// different output streams for error and non-error messages.
5+
//
6+
// Does not wrap every method of logrus package. If you need direct access,
7+
// use log.Log() to get the actual logrus logger object.
8+
//
9+
// It might seem redundant, but we really want the different output streams.
10+
11+
import (
12+
"fmt"
13+
"io"
14+
"os"
15+
"strings"
16+
"sync"
17+
18+
logger "github.com/sirupsen/logrus"
19+
)
20+
21+
// LogContext contains a structured context for logging
22+
type LogContext struct {
23+
fields logger.Fields
24+
normalOut io.Writer
25+
errorOut io.Writer
26+
mutex sync.RWMutex
27+
}
28+
29+
// NewContext returns a LogContext with default settings
30+
func NewContext() *LogContext {
31+
var logctx LogContext
32+
logctx.fields = make(logger.Fields)
33+
logctx.normalOut = os.Stdout
34+
logctx.errorOut = os.Stderr
35+
return &logctx
36+
}
37+
38+
// SetLogLevel sets the log level to use for the logger
39+
func SetLogLevel(logLevel string) error {
40+
switch strings.ToLower(logLevel) {
41+
case "trace":
42+
logger.SetLevel(logger.TraceLevel)
43+
case "debug":
44+
logger.SetLevel(logger.DebugLevel)
45+
case "info":
46+
logger.SetLevel(logger.InfoLevel)
47+
case "warn":
48+
logger.SetLevel(logger.WarnLevel)
49+
case "error":
50+
logger.SetLevel(logger.ErrorLevel)
51+
default:
52+
return fmt.Errorf("invalid loglevel: %s", logLevel)
53+
}
54+
return nil
55+
}
56+
57+
// WithContext is an alias for NewContext
58+
func WithContext() *LogContext {
59+
return NewContext()
60+
}
61+
62+
// AddField adds a structured field to logctx
63+
func (logctx *LogContext) AddField(key string, value interface{}) *LogContext {
64+
logctx.mutex.Lock()
65+
logctx.fields[key] = value
66+
logctx.mutex.Unlock()
67+
return logctx
68+
}
69+
70+
// Tracef logs a debug message for logctx to stdout
71+
func (logctx *LogContext) Tracef(format string, args ...interface{}) {
72+
logger.SetOutput(logctx.normalOut)
73+
if logctx.fields != nil && len(logctx.fields) > 0 {
74+
logger.WithFields(logctx.fields).Tracef(format, args...)
75+
} else {
76+
logger.Tracef(format, args...)
77+
}
78+
}
79+
80+
// Debugf logs a debug message for logctx to stdout
81+
func (logctx *LogContext) Debugf(format string, args ...interface{}) {
82+
logger.SetOutput(logctx.normalOut)
83+
if logctx.fields != nil && len(logctx.fields) > 0 {
84+
logger.WithFields(logctx.fields).Debugf(format, args...)
85+
} else {
86+
logger.Debugf(format, args...)
87+
}
88+
}
89+
90+
// Infof logs an informational message for logctx to stdout
91+
func (logctx *LogContext) Infof(format string, args ...interface{}) {
92+
logger.SetOutput(logctx.normalOut)
93+
if logctx.fields != nil && len(logctx.fields) > 0 {
94+
logger.WithFields(logctx.fields).Infof(format, args...)
95+
} else {
96+
logger.Infof(format, args...)
97+
}
98+
}
99+
100+
// Warnf logs a warning message for logctx to stdout
101+
func (logctx *LogContext) Warnf(format string, args ...interface{}) {
102+
logger.SetOutput(logctx.normalOut)
103+
if logctx.fields != nil && len(logctx.fields) > 0 {
104+
logger.WithFields(logctx.fields).Warnf(format, args...)
105+
} else {
106+
logger.Warnf(format, args...)
107+
}
108+
}
109+
110+
// Errorf logs a non-fatal error message for logctx to stdout
111+
func (logctx *LogContext) Errorf(format string, args ...interface{}) {
112+
logger.SetOutput(logctx.errorOut)
113+
if logctx.fields != nil && len(logctx.fields) > 0 {
114+
logger.WithFields(logctx.fields).Errorf(format, args...)
115+
} else {
116+
logger.Errorf(format, args...)
117+
}
118+
}
119+
120+
// Fatalf logs a fatal error message for logctx to stdout
121+
func (logctx *LogContext) Fatalf(format string, args ...interface{}) {
122+
logger.SetOutput(logctx.errorOut)
123+
if logctx.fields != nil && len(logctx.fields) > 0 {
124+
logger.WithFields(logctx.fields).Fatalf(format, args...)
125+
} else {
126+
logger.Fatalf(format, args...)
127+
}
128+
}
129+
130+
// Debugf logs a warning message without context to stdout
131+
func Tracef(format string, args ...interface{}) {
132+
logCtx := NewContext()
133+
logCtx.Tracef(format, args...)
134+
}
135+
136+
// Debugf logs a warning message without context to stdout
137+
func Debugf(format string, args ...interface{}) {
138+
logCtx := NewContext()
139+
logCtx.Debugf(format, args...)
140+
}
141+
142+
// Infof logs a warning message without context to stdout
143+
func Infof(format string, args ...interface{}) {
144+
logCtx := NewContext()
145+
logCtx.Infof(format, args...)
146+
}
147+
148+
// Warnf logs a warning message without context to stdout
149+
func Warnf(format string, args ...interface{}) {
150+
logCtx := NewContext()
151+
logCtx.Warnf(format, args...)
152+
}
153+
154+
// Errorf logs an error message without context to stderr
155+
func Errorf(format string, args ...interface{}) {
156+
logCtx := NewContext()
157+
logCtx.Errorf(format, args...)
158+
}
159+
160+
// Fatalf logs a non-recoverable error message without context to stderr
161+
func Fatalf(format string, args ...interface{}) {
162+
logCtx := NewContext()
163+
logCtx.Fatalf(format, args...)
164+
}
165+
166+
func disableLogColors() bool {
167+
return strings.ToLower(os.Getenv("ENABLE_LOG_COLORS")) == "false"
168+
}
169+
170+
// Initializes the logging subsystem with default values
171+
func init() {
172+
logger.SetFormatter(&logger.TextFormatter{
173+
DisableColors: disableLogColors(),
174+
FullTimestamp: true,
175+
})
176+
logger.SetLevel(logger.DebugLevel)
177+
}

0 commit comments

Comments
 (0)