diff --git a/changes/20230606144452.feature b/changes/20230606144452.feature new file mode 100644 index 0000000000..fcbd5ce910 --- /dev/null +++ b/changes/20230606144452.feature @@ -0,0 +1 @@ +:sparkles: `[logs]` created a [hclog](https://github.com/hashicorp/go-hclog)'s wrapper over logs.Loggers diff --git a/utils/logs/hclog_logger.go b/utils/logs/hclog_logger.go index 8fd7fd78ec..ac51f2cfcb 100644 --- a/utils/logs/hclog_logger.go +++ b/utils/logs/hclog_logger.go @@ -13,7 +13,7 @@ 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 @@ -21,3 +21,38 @@ func NewHclogLogger(hclogL hclog.Logger, loggerSource string) (loggers Loggers, } 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 +} diff --git a/utils/logs/hclog_logger_test.go b/utils/logs/hclog_logger_test.go index ac1cab630e..5367634af6 100644 --- a/utils/logs/hclog_logger_test.go +++ b/utils/logs/hclog_logger_test.go @@ -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) { @@ -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) +} diff --git a/utils/logs/writer.go b/utils/logs/writer.go index 82da6b0610..d30b5dadbe 100644 --- a/utils/logs/writer.go +++ b/utils/logs/writer.go @@ -12,6 +12,8 @@ import ( "time" "github.com/rs/zerolog/diode" + + "github.com/ARM-software/golang-utils/utils/commonerrors" ) type MultipleWritersWithSource struct { @@ -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 +}