Skip to content

Commit c964c48

Browse files
feat(Logger): init implementation (#12)
1 parent fc0ada9 commit c964c48

File tree

5 files changed

+159
-2
lines changed

5 files changed

+159
-2
lines changed

go.mod

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ 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
1011
github.com/spf13/cobra v1.3.0
1112
github.com/spf13/viper v1.10.0
1213
gopkg.in/op/go-logging.v1 v1.0.0-20160211212156-b2cb9fa56473
@@ -54,7 +55,7 @@ require (
5455
github.com/timtadh/data-structures v0.5.3 // indirect
5556
github.com/timtadh/lexmachine v0.2.2 // indirect
5657
github.com/xanzy/ssh-agent v0.2.1 // indirect
57-
golang.org/x/crypto v0.0.0-20210817164053-32db794688a5 // indirect
58+
golang.org/x/crypto v0.0.0-20211215165025-cf75a172585e // indirect
5859
golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f // indirect
5960
golang.org/x/sys v0.0.0-20211205182925-97ca703d548d // indirect
6061
golang.org/x/text v0.3.7 // indirect

go.sum

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -720,6 +720,9 @@ 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=
723726
github.com/rubiojr/go-vhd v0.0.0-20200706105327-02e210299021/go.mod h1:DM5xW0nvfNNm2uytzsvhI3OnX8uzaRAg8UX/CnDqbto=
724727
github.com/russross/blackfriday v0.0.0-20170610170232-067529f716f4/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=
725728
github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=
@@ -824,6 +827,7 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de
824827
github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
825828
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
826829
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=
827831
github.com/yuin/gopher-lua v0.0.0-20200816102855-ee81675732da/go.mod h1:E1AXubJBdNmFERAOucpDIxNzeGfLzg0mYh+UfMWdChA=
828832
github.com/yvasiyarov/go-metrics v0.0.0-20140926110328-57bccd1ccd43/go.mod h1:aX5oPXxHm3bOH+xeAttToC8pqch2ScQN/JoXYupl6xs=
829833
github.com/yvasiyarov/gorelic v0.0.0-20141212073537-a9bba5b9ab50/go.mod h1:NUSPSUX/bi6SeDMUh6brw0nXpxHnc96TguQh0+r/ssA=
@@ -884,8 +888,9 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh
884888
golang.org/x/crypto v0.0.0-20201002170205-7f63de1d35b0/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
885889
golang.org/x/crypto v0.0.0-20210220033148-5ea612d1eb83/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I=
886890
golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
887-
golang.org/x/crypto v0.0.0-20210817164053-32db794688a5 h1:HWj/xjIHfjYU5nVXpTM0s39J9CbLn7Cc5a7IC5rwsMQ=
888891
golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
892+
golang.org/x/crypto v0.0.0-20211215165025-cf75a172585e h1:1SzTfNOXwIS2oWiMF+6qu0OUDKb0dauo6MoDUQyu+yU=
893+
golang.org/x/crypto v0.0.0-20211215165025-cf75a172585e/go.mod h1:P+XmwS30IXTQdn5tA2iutPOUgjI07+tq3H3K9MVA1s8=
889894
golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
890895
golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
891896
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
@@ -991,6 +996,7 @@ golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96b
991996
golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8=
992997
golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
993998
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=
9941000
golang.org/x/net v0.0.0-20210813160813-60bc85c4be6d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
9951001
golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f h1:OfiFi4JbukWwe3lzw+xunroH1mnC1e2Gy5cxNJApiSY=
9961002
golang.org/x/net v0.0.0-20211015210444-4f30a5c0130f/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
@@ -1109,6 +1115,7 @@ golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBc
11091115
golang.org/x/sys v0.0.0-20210616094352-59db8d763f22/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
11101116
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
11111117
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=
11121119
golang.org/x/sys v0.0.0-20210816183151-1e6c022a8912/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
11131120
golang.org/x/sys v0.0.0-20210823070655-63515b42dcdf/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
11141121
golang.org/x/sys v0.0.0-20210908233432-aa78b53d3365/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
@@ -1208,6 +1215,7 @@ golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
12081215
golang.org/x/tools v0.1.3/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
12091216
golang.org/x/tools v0.1.4/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
12101217
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=
12111219
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
12121220
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
12131221
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=

internal/app/logger/log/default.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package log
2+
3+
import "github.com/docplanner/helm-repo-updater/internal/app/logger"
4+
5+
var (
6+
// Logger is the global logger instance to be used before the container is initialized.
7+
Logger logger.Logger
8+
)
9+
10+
func init() {
11+
Logger = logger.NewZeroLogger(logger.NewConsoleZeroLogger("info"))
12+
}

internal/app/logger/logger.go

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package logger
2+
3+
import (
4+
"os"
5+
)
6+
7+
var _ Logger = &NullLogger{}
8+
9+
type Logger interface {
10+
ErrorWithContext(message string, err error, context map[string]interface{})
11+
Fatal(message string, err error)
12+
InfoWithContext(message string, context map[string]interface{})
13+
Info(message string)
14+
}
15+
16+
type NullLogger struct {
17+
}
18+
19+
func (n *NullLogger) Fatal(_ string, _ error) {
20+
os.Exit(1)
21+
}
22+
23+
func (n *NullLogger) ErrorWithContext(_ string, _ error, _ map[string]interface{}) {
24+
// nada!
25+
}
26+
27+
func (n *NullLogger) InfoWithContext(_ string, _ map[string]interface{}) {
28+
// nada!
29+
}
30+
31+
func (n NullLogger) Info(_ string) {
32+
// nada!
33+
}
34+
35+
func NewNullLogger() *NullLogger {
36+
return &NullLogger{}
37+
}

internal/app/logger/zerolog.go

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
package logger
2+
3+
import (
4+
"fmt"
5+
"github.com/rs/zerolog"
6+
"github.com/rs/zerolog/diode"
7+
"github.com/rs/zerolog/pkgerrors"
8+
"io"
9+
"net"
10+
"os"
11+
"time"
12+
)
13+
14+
const (
15+
localCacheSize = 1000
16+
elkPollInterval = 10 * time.Millisecond
17+
)
18+
19+
var _ Logger = &ZeroLogger{}
20+
21+
type ZeroLogger struct {
22+
logger zerolog.Logger
23+
}
24+
25+
func (z *ZeroLogger) Info(message string) {
26+
z.logger.Info().Msg(message)
27+
}
28+
29+
func (z *ZeroLogger) InfoWithContext(message string, context map[string]interface{}) {
30+
z.logger.Info().Fields(context).Msg(message)
31+
}
32+
33+
func NewZeroLogger(logger zerolog.Logger) *ZeroLogger {
34+
return &ZeroLogger{logger: logger}
35+
}
36+
37+
func NewConsoleELKZeroLogger(lvl, protocol, address string) zerolog.Logger {
38+
logLevel, err := zerolog.ParseLevel(lvl)
39+
if err != nil {
40+
logLevel = zerolog.InfoLevel
41+
}
42+
43+
zerolog.SetGlobalLevel(logLevel)
44+
zerolog.TimestampFieldName = "@timestamp"
45+
zerolog.MessageFieldName = "msg"
46+
zerolog.ErrorStackMarshaler = pkgerrors.MarshalStack
47+
48+
conn, err := net.Dial(protocol, address)
49+
if err != nil {
50+
conn = nil
51+
}
52+
53+
consoleWriter := newDiodeConsoleWriter(elkPollInterval)
54+
55+
if err != nil {
56+
logger := zerolog.New(consoleWriter).With().Timestamp().Logger()
57+
logger.Error().Err(err).Msg("cant establish connection to ELK, falling back to console logger")
58+
return logger
59+
}
60+
61+
multiWriter := io.MultiWriter(conn, consoleWriter)
62+
63+
logger := zerolog.New(multiWriter).With().Timestamp().Logger()
64+
65+
return logger
66+
}
67+
68+
func NewConsoleZeroLogger(lvl string) zerolog.Logger {
69+
logLevel, err := zerolog.ParseLevel(lvl)
70+
if err != nil {
71+
logLevel = zerolog.InfoLevel
72+
}
73+
74+
zerolog.SetGlobalLevel(logLevel)
75+
76+
consoleWriter := newDiodeConsoleWriter(time.Second)
77+
78+
return zerolog.New(consoleWriter).With().Timestamp().Logger()
79+
}
80+
81+
func newDiodeConsoleWriter(pollInterval time.Duration) diode.Writer {
82+
consoleWriter := diode.NewWriter(
83+
zerolog.ConsoleWriter{Out: os.Stdout, TimeFormat: time.RFC3339},
84+
localCacheSize,
85+
pollInterval,
86+
func(missed int) {
87+
fmt.Printf("dropped %d messages", missed) //nolint:forbidigo
88+
})
89+
90+
return consoleWriter
91+
}
92+
93+
func (z *ZeroLogger) Fatal(message string, err error) {
94+
z.logger.Fatal().Err(err).Msg(message)
95+
}
96+
97+
func (z *ZeroLogger) ErrorWithContext(message string, err error, context map[string]interface{}) {
98+
z.logger.Error().Err(err).Fields(context).Msg(message)
99+
}

0 commit comments

Comments
 (0)