Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions changes/20230606144452.feature
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
:sparkles: `[logs]` created a [hclog](https://github.com/hashicorp/go-hclog)'s wrapper over logs.Loggers
37 changes: 36 additions & 1 deletion utils/logs/hclog_logger.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,46 @@ import (
"github.com/ARM-software/golang-utils/utils/commonerrors"
)

// NewHclogLogger returns a logger which uses hclog logger (https://github.com/hashicorp/go-hclog
// NewHclogLogger returns a logger which uses hclog logger (https://github.com/hashicorp/go-hclog)
func NewHclogLogger(hclogL hclog.Logger, loggerSource string) (loggers Loggers, err error) {
if hclogL == nil {
err = commonerrors.ErrNoLogger
return
}
return NewLogrLogger(hclogr.Wrap(hclogL), loggerSource)
}

// NewHclogWrapper returns an hclog logger from a Loggers logger
func NewHclogWrapper(loggers Loggers) (hclogL hclog.Logger, err error) {
if loggers == nil {
err = commonerrors.ErrNoLogger
return
}
intercept := hclog.NewInterceptLogger(nil)

info, err := NewInfoWriterFromLoggers(loggers)
if err != nil {
return
}
errL, err := NewErrorWriterFromLoggers(loggers)
if err != nil {
return
}

sinkErr := hclog.NewSinkAdapter(&hclog.LoggerOptions{
Level: hclog.Warn,
Output: errL,
DisableTime: true,
})
sinkInfo := hclog.NewSinkAdapter(&hclog.LoggerOptions{
Level: hclog.Info,
Output: info,
DisableTime: true,
})

intercept.RegisterSink(sinkErr)
intercept.RegisterSink(sinkInfo)

hclogL = intercept
return
}
12 changes: 12 additions & 0 deletions utils/logs/hclog_logger_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@ import (

"github.com/hashicorp/go-hclog"
"github.com/stretchr/testify/require"

"github.com/ARM-software/golang-utils/utils/logs/logstest"
)

func TestHclogLogger(t *testing.T) {
Expand All @@ -17,3 +19,13 @@ func TestHclogLogger(t *testing.T) {
require.NoError(t, err)
testLog(t, loggers)
}

func TestHclogWrapper(t *testing.T) {
loggers, err := NewLogrLogger(logstest.NewTestLogger(t), "test")
require.NoError(t, err)
hcLogger, err := NewHclogWrapper(loggers)
require.NoError(t, err)
loggerTest, err := NewHclogLogger(hcLogger, "Test")
require.NoError(t, err)
testLog(t, loggerTest)
}
54 changes: 54 additions & 0 deletions utils/logs/writer.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ import (
"time"

"github.com/rs/zerolog/diode"

"github.com/ARM-software/golang-utils/utils/commonerrors"
)

type MultipleWritersWithSource struct {
Expand Down Expand Up @@ -114,3 +116,55 @@ func NewDiodeWriterForSlowWriter(slowWriter WriterWithSource, ringBufferSize int
slowWriter: slowWriter,
}
}

type infoWriter struct {
loggers Loggers
}

func (w *infoWriter) Write(p []byte) (n int, err error) {
if w.loggers == nil {
err = commonerrors.ErrNoLogger
return
}
n = len(p)
w.loggers.Log(string(p))
return
}

// NewInfoWriterFromLoggers returns a io.Writer from a Loggers by only returning INFO messages
func NewInfoWriterFromLoggers(l Loggers) (w io.Writer, err error) {
if l == nil {
err = commonerrors.ErrNoLogger
return
}
w = &infoWriter{
loggers: l,
}
return
}

type errWriter struct {
loggers Loggers
}

func (w *errWriter) Write(p []byte) (n int, err error) {
if w.loggers == nil {
err = commonerrors.ErrNoLogger
return
}
n = len(p)
w.loggers.LogError(string(p))
return
}

// NewErrorWriterFromLoggers returns a io.Writer from a Loggers by only returning ERROR messages
func NewErrorWriterFromLoggers(l Loggers) (w io.Writer, err error) {
if l == nil {
err = commonerrors.ErrNoLogger
return
}
w = &errWriter{
loggers: l,
}
return
}