Skip to content

Commit 6cbf35e

Browse files
committed
Add support for JSON log formatting
- Add log setter for text or JSON log formatting - Add CLI option "--log-format", accepts "text" or "json" - Defaults to current "text" logging for compatibility Additionally: - Configure `cmd` go.mod to reference registry-scanner locally to support concurrent changes in both modules Signed-off-by: Michael Pilat <[email protected]>
1 parent b2aeed9 commit 6cbf35e

File tree

6 files changed

+63
-5
lines changed

6 files changed

+63
-5
lines changed

cmd/main.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ type ImageUpdaterConfig struct {
3636
CheckInterval time.Duration
3737
ArgoClient argocd.ArgoCD
3838
LogLevel string
39+
LogFormat string
3940
KubeClient *kube.ImageUpdaterKubernetesClient
4041
MaxConcurrency int
4142
HealthPort int

cmd/run.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,17 @@ func newRunCommand() *cobra.Command {
5050
return err
5151
}
5252

53+
var logFormat log.LogFormat
54+
switch cfg.LogFormat {
55+
case "text":
56+
logFormat = log.LogFormatText
57+
case "json":
58+
logFormat = log.LogFormatJSON
59+
default:
60+
return fmt.Errorf("Invalid log format '%s'", cfg.LogFormat)
61+
}
62+
log.SetLogFormat(logFormat)
63+
5364
if once {
5465
cfg.CheckInterval = 0
5566
cfg.HealthPort = 0
@@ -322,6 +333,7 @@ func newRunCommand() *cobra.Command {
322333
runCmd.Flags().BoolVar(&cfg.DryRun, "dry-run", false, "run in dry-run mode. If set to true, do not perform any changes")
323334
runCmd.Flags().DurationVar(&cfg.CheckInterval, "interval", env.GetDurationVal("IMAGE_UPDATER_INTERVAL", 2*time.Minute), "interval for how often to check for updates")
324335
runCmd.Flags().StringVar(&cfg.LogLevel, "loglevel", env.GetStringVal("IMAGE_UPDATER_LOGLEVEL", "info"), "set the loglevel to one of trace|debug|info|warn|error")
336+
runCmd.Flags().StringVar(&cfg.LogFormat, "log-format", env.GetStringVal("IMAGE_UPDATER_LOG_FORMAT", "text"), "set the log format to one of text|json")
325337
runCmd.Flags().StringVar(&kubeConfig, "kubeconfig", "", "full path to kubernetes client configuration, i.e. ~/.kube/config")
326338
runCmd.Flags().IntVar(&cfg.HealthPort, "health-port", 8080, "port to start the health server on, 0 to disable")
327339
runCmd.Flags().IntVar(&cfg.MetricsPort, "metrics-port", 8081, "port to start the metrics server on, 0 to disable")

go.mod

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ require (
3737
dario.cat/mergo v1.0.1 // indirect
3838
github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect
3939
github.com/MakeNowJust/heredoc v1.0.0 // indirect
40-
github.com/Masterminds/semver/v3 v3.3.1 // indirect
40+
github.com/Masterminds/semver/v3 v3.4.0 // indirect
4141
github.com/Microsoft/go-winio v0.6.2 // indirect
4242
github.com/ProtonMail/go-crypto v1.1.6 // indirect
4343
github.com/benbjohnson/clock v1.3.0 // indirect
@@ -211,3 +211,5 @@ replace (
211211
k8s.io/sample-cli-plugin => k8s.io/sample-cli-plugin v0.32.2
212212
k8s.io/sample-controller => k8s.io/sample-controller v0.32.2
213213
)
214+
215+
replace github.com/argoproj-labs/argocd-image-updater/registry-scanner => ./registry-scanner

go.sum

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg6
1010
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
1111
github.com/MakeNowJust/heredoc v1.0.0 h1:cXCdzVdstXyiTqTvfqk9SDHpKNjxuom+DOlyEeQ4pzQ=
1212
github.com/MakeNowJust/heredoc v1.0.0/go.mod h1:mG5amYoWBHf8vpLOuehzbGGw0EHxpZZ6lCpQ4fNJ8LE=
13-
github.com/Masterminds/semver/v3 v3.3.1 h1:QtNSWtVZ3nBfk8mAOu/B6v7FMJ+NHTIgUPi7rj+4nv4=
14-
github.com/Masterminds/semver/v3 v3.3.1/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM=
13+
github.com/Masterminds/semver/v3 v3.4.0 h1:Zog+i5UMtVoCU8oKka5P7i9q9HgrJeGzI9SA1Xbatp0=
14+
github.com/Masterminds/semver/v3 v3.4.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM=
1515
github.com/Microsoft/go-winio v0.5.2/go.mod h1:WpS1mjBmmwHBEWmogvA2mj8546UReBk4v8QkMxJ6pZY=
1616
github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY=
1717
github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU=
@@ -27,8 +27,6 @@ github.com/alicebob/miniredis/v2 v2.33.0/go.mod h1:MhP4a3EU7aENRi9aO+tHfTBZicLqQ
2727
github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be h1:9AeTilPcZAjCFIImctFaOjnTIavg87rW78vTPkQqLI8=
2828
github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be/go.mod h1:ySMOLuWl6zY27l47sB3qLNK6tF2fkHG55UZxx8oIVo4=
2929
github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
30-
github.com/argoproj-labs/argocd-image-updater/registry-scanner v0.0.0-20250624020913-398db53f47e4 h1:kDbTmJkeg4Z4JSc6ytEqcpv7PuM9lZJej78yQS+AnfY=
31-
github.com/argoproj-labs/argocd-image-updater/registry-scanner v0.0.0-20250624020913-398db53f47e4/go.mod h1:5Q9a7RvrHCgwoZDLN9f9YugZfvZuQWSbrMqRQD4IXTM=
3230
github.com/argoproj/argo-cd/v2 v2.14.15 h1:+rE5bwbCg21mA3ltIvSVI8/KtzRxLLmuDKIyPx93G9k=
3331
github.com/argoproj/argo-cd/v2 v2.14.15/go.mod h1:O5p0wngJjy8Rg9M2x+JH0ifrmyuI40ui2mxIPKLMbSk=
3432
github.com/argoproj/gitops-engine v0.7.1-0.20250521000818-c08b0a72c1f1 h1:Ze4U6kV49vSzlUBhH10HkO52bYKAIXS4tHr/MlNDfdU=

registry-scanner/pkg/log/log.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,22 @@ func SetLogLevel(logLevel string) error {
6161
return nil
6262
}
6363

64+
type LogFormat int
65+
66+
const (
67+
LogFormatText LogFormat = iota
68+
LogFormatJSON
69+
)
70+
71+
func SetLogFormat(logFormat LogFormat) {
72+
switch logFormat {
73+
case LogFormatText:
74+
logger.SetFormatter(&logrus.TextFormatter{DisableColors: disableLogColors()})
75+
case LogFormatJSON:
76+
logger.SetFormatter(&logrus.JSONFormatter{})
77+
}
78+
}
79+
6480
// WithContext is an alias for NewContext
6581
func WithContext() *LogContext {
6682
return NewContext()

registry-scanner/pkg/log/log_test.go

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package log
22

33
import (
4+
"encoding/json"
45
"fmt"
56
"testing"
67

@@ -154,3 +155,31 @@ func Test_LogLevel(t *testing.T) {
154155
assert.Error(t, err)
155156
})
156157
}
158+
159+
func Test_LogFormatJSON(t *testing.T) {
160+
// We need tracing level
161+
Log().SetLevel(logrus.TraceLevel)
162+
163+
t.Run("Test set text log format", func(t *testing.T) {
164+
SetLogFormat(LogFormatText)
165+
out, err := fixture.CaptureStdout(func() {
166+
WithContext().AddField("foo", "bar").Infof("this is a test")
167+
})
168+
assert.NoError(t, err)
169+
assert.Contains(t, out, "foo=bar")
170+
assert.Contains(t, out, "msg=\"this is a test\"")
171+
})
172+
t.Run("Test set JSON log format", func(t *testing.T) {
173+
SetLogFormat(LogFormatJSON)
174+
out, err := fixture.CaptureStdout(func() {
175+
WithContext().AddField("foo", "bar").Warnf("this is a test")
176+
})
177+
assert.NoError(t, err)
178+
179+
var data map[string]any
180+
err = json.Unmarshal([]byte(out), &data)
181+
assert.NoError(t, err)
182+
assert.Equal(t, "bar", data["foo"])
183+
assert.Equal(t, "this is a test", data["msg"])
184+
})
185+
}

0 commit comments

Comments
 (0)