Skip to content

Commit 022d714

Browse files
Add core package with logger. (#4)
## What changes are proposed in this pull request? This PR adds a new `core` package with the `Logger` interface. The interface is a simplified version of the interface used in the legacy SDK. It is meant to be used by all other modular clients. ## How is this tested? Complete test coverage.
1 parent 4809d77 commit 022d714

5 files changed

Lines changed: 154 additions & 0 deletions

File tree

‎core/README.md‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
# Databricks Core

‎core/go.mod‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
module github.com/databricks/sdk-go/core
2+
3+
go 1.25.4

‎core/log/log.go‎

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
// Package log provides the Databricks Logger interface and a default logger
2+
// implementation.
3+
//
4+
// The Logger interface is designed to log messages at different levels of
5+
// severity. When creating a logger, you can set a minimum log level, meaning
6+
// any messages below this level will be ignored.
7+
package log
8+
9+
import (
10+
"context"
11+
"fmt"
12+
"io"
13+
"os"
14+
)
15+
16+
// Level represents the importance or severity of a log event. The higher the
17+
// level, the more important or severe that event is.
18+
type Level int
19+
20+
const (
21+
LevelTrace Level = -8
22+
LevelDebug Level = -4
23+
LevelInfo Level = 0
24+
LevelWarn Level = 4
25+
LevelError Level = 8
26+
)
27+
28+
func (l Level) String() string {
29+
switch l {
30+
case LevelTrace:
31+
return "TRACE"
32+
case LevelDebug:
33+
return "DEBUG"
34+
case LevelInfo:
35+
return "INFO"
36+
case LevelWarn:
37+
return "WARN"
38+
case LevelError:
39+
return "ERROR"
40+
default:
41+
return "UNKNOWN"
42+
}
43+
}
44+
45+
// Logger is anything that can log a message at a given level.
46+
type Logger interface {
47+
Log(ctx context.Context, level Level, format string, a ...any)
48+
}
49+
50+
// NewLogger returns a new default logger that logs on [os.Stderr].
51+
func NewLogger() Logger {
52+
return &logger{out: os.Stderr}
53+
}
54+
55+
type logger struct {
56+
out io.Writer
57+
}
58+
59+
func (l *logger) Log(_ context.Context, level Level, format string, a ...any) {
60+
fmt.Fprintf(l.out, "[%s] %s\n", level.String(), fmt.Sprintf(format, a...))
61+
}

‎core/log/log_test.go‎

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
package log
2+
3+
import (
4+
"bytes"
5+
"context"
6+
"os"
7+
"testing"
8+
)
9+
10+
func TestLevel_order(t *testing.T) {
11+
var wantOrder = []Level{
12+
LevelTrace,
13+
LevelDebug,
14+
LevelInfo,
15+
LevelWarn,
16+
LevelError,
17+
}
18+
19+
for i := 1; i < len(wantOrder); i++ {
20+
if wantOrder[i-1] >= wantOrder[i] {
21+
t.Errorf("Level %s should be lower than %s", wantOrder[i-1].String(), wantOrder[i].String())
22+
}
23+
}
24+
}
25+
26+
func TestLogger_Log(t *testing.T) {
27+
testCases := []struct {
28+
level Level
29+
format string
30+
args []any
31+
want string
32+
}{
33+
{
34+
level: LevelTrace,
35+
format: "test %s",
36+
args: []any{"message"},
37+
want: "[TRACE] test message\n",
38+
},
39+
{
40+
level: LevelDebug,
41+
format: "test %s",
42+
args: []any{"message"},
43+
want: "[DEBUG] test message\n",
44+
},
45+
{
46+
level: LevelInfo,
47+
format: "test %s",
48+
args: []any{"message"},
49+
want: "[INFO] test message\n",
50+
},
51+
{
52+
level: LevelWarn,
53+
format: "test %s",
54+
args: []any{"message"},
55+
want: "[WARN] test message\n",
56+
},
57+
{
58+
level: LevelError,
59+
format: "test %s",
60+
args: []any{"message"},
61+
want: "[ERROR] test message\n",
62+
},
63+
{
64+
level: Level(42), // unknown level
65+
format: "test %s",
66+
args: []any{"message"},
67+
want: "[UNKNOWN] test message\n",
68+
},
69+
}
70+
71+
for _, tc := range testCases {
72+
out := &bytes.Buffer{}
73+
l := logger{out: out}
74+
75+
l.Log(context.Background(), tc.level, tc.format, tc.args...)
76+
77+
if got := out.String(); got != tc.want {
78+
t.Errorf("Log(): got %s, want %s", got, tc.want)
79+
}
80+
}
81+
}
82+
83+
func TestNew(t *testing.T) {
84+
l := NewLogger().(*logger)
85+
if l.out != os.Stderr {
86+
t.Errorf("NewLogger() got out %v, want %v", l.out, os.Stderr)
87+
}
88+
}

‎go.work‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,6 @@ go 1.25.4
22

33
use (
44
./auth
5+
./core
56
./databricks
67
)

0 commit comments

Comments
 (0)