Skip to content

Commit 7de155d

Browse files
authored
[logs] hclogs wrapper (#266)
<!-- Copyright (C) 2020-2022 Arm Limited or its affiliates and Contributors. All rights reserved. SPDX-License-Identifier: Apache-2.0 --> ### Description - `[logs]` created a [hclog](https://github.com/hashicorp/go-hclog)'s wrapper over logs.Loggers ### Test Coverage <!-- Please put an `x` in the correct box e.g. `[x]` to indicate the testing coverage of this change. --> - [x] This change is covered by existing or additional automated tests. - [ ] Manual testing has been performed (and evidence provided) as automated testing was not feasible. - [ ] Additional tests are not required for this change (e.g. documentation update).
1 parent ad39a32 commit 7de155d

File tree

4 files changed

+103
-1
lines changed

4 files changed

+103
-1
lines changed

changes/20230606144452.feature

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
:sparkles: `[logs]` created a [hclog](https://github.com/hashicorp/go-hclog)'s wrapper over logs.Loggers

utils/logs/hclog_logger.go

Lines changed: 36 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,46 @@ import (
1313
"github.com/ARM-software/golang-utils/utils/commonerrors"
1414
)
1515

16-
// NewHclogLogger returns a logger which uses hclog logger (https://github.com/hashicorp/go-hclog
16+
// NewHclogLogger returns a logger which uses hclog logger (https://github.com/hashicorp/go-hclog)
1717
func NewHclogLogger(hclogL hclog.Logger, loggerSource string) (loggers Loggers, err error) {
1818
if hclogL == nil {
1919
err = commonerrors.ErrNoLogger
2020
return
2121
}
2222
return NewLogrLogger(hclogr.Wrap(hclogL), loggerSource)
2323
}
24+
25+
// NewHclogWrapper returns an hclog logger from a Loggers logger
26+
func NewHclogWrapper(loggers Loggers) (hclogL hclog.Logger, err error) {
27+
if loggers == nil {
28+
err = commonerrors.ErrNoLogger
29+
return
30+
}
31+
intercept := hclog.NewInterceptLogger(nil)
32+
33+
info, err := NewInfoWriterFromLoggers(loggers)
34+
if err != nil {
35+
return
36+
}
37+
errL, err := NewErrorWriterFromLoggers(loggers)
38+
if err != nil {
39+
return
40+
}
41+
42+
sinkErr := hclog.NewSinkAdapter(&hclog.LoggerOptions{
43+
Level: hclog.Warn,
44+
Output: errL,
45+
DisableTime: true,
46+
})
47+
sinkInfo := hclog.NewSinkAdapter(&hclog.LoggerOptions{
48+
Level: hclog.Info,
49+
Output: info,
50+
DisableTime: true,
51+
})
52+
53+
intercept.RegisterSink(sinkErr)
54+
intercept.RegisterSink(sinkInfo)
55+
56+
hclogL = intercept
57+
return
58+
}

utils/logs/hclog_logger_test.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ import (
99

1010
"github.com/hashicorp/go-hclog"
1111
"github.com/stretchr/testify/require"
12+
13+
"github.com/ARM-software/golang-utils/utils/logs/logstest"
1214
)
1315

1416
func TestHclogLogger(t *testing.T) {
@@ -17,3 +19,13 @@ func TestHclogLogger(t *testing.T) {
1719
require.NoError(t, err)
1820
testLog(t, loggers)
1921
}
22+
23+
func TestHclogWrapper(t *testing.T) {
24+
loggers, err := NewLogrLogger(logstest.NewTestLogger(t), "test")
25+
require.NoError(t, err)
26+
hcLogger, err := NewHclogWrapper(loggers)
27+
require.NoError(t, err)
28+
loggerTest, err := NewHclogLogger(hcLogger, "Test")
29+
require.NoError(t, err)
30+
testLog(t, loggerTest)
31+
}

utils/logs/writer.go

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ import (
1212
"time"
1313

1414
"github.com/rs/zerolog/diode"
15+
16+
"github.com/ARM-software/golang-utils/utils/commonerrors"
1517
)
1618

1719
type MultipleWritersWithSource struct {
@@ -114,3 +116,55 @@ func NewDiodeWriterForSlowWriter(slowWriter WriterWithSource, ringBufferSize int
114116
slowWriter: slowWriter,
115117
}
116118
}
119+
120+
type infoWriter struct {
121+
loggers Loggers
122+
}
123+
124+
func (w *infoWriter) Write(p []byte) (n int, err error) {
125+
if w.loggers == nil {
126+
err = commonerrors.ErrNoLogger
127+
return
128+
}
129+
n = len(p)
130+
w.loggers.Log(string(p))
131+
return
132+
}
133+
134+
// NewInfoWriterFromLoggers returns a io.Writer from a Loggers by only returning INFO messages
135+
func NewInfoWriterFromLoggers(l Loggers) (w io.Writer, err error) {
136+
if l == nil {
137+
err = commonerrors.ErrNoLogger
138+
return
139+
}
140+
w = &infoWriter{
141+
loggers: l,
142+
}
143+
return
144+
}
145+
146+
type errWriter struct {
147+
loggers Loggers
148+
}
149+
150+
func (w *errWriter) Write(p []byte) (n int, err error) {
151+
if w.loggers == nil {
152+
err = commonerrors.ErrNoLogger
153+
return
154+
}
155+
n = len(p)
156+
w.loggers.LogError(string(p))
157+
return
158+
}
159+
160+
// NewErrorWriterFromLoggers returns a io.Writer from a Loggers by only returning ERROR messages
161+
func NewErrorWriterFromLoggers(l Loggers) (w io.Writer, err error) {
162+
if l == nil {
163+
err = commonerrors.ErrNoLogger
164+
return
165+
}
166+
w = &errWriter{
167+
loggers: l,
168+
}
169+
return
170+
}

0 commit comments

Comments
 (0)