Skip to content

Commit 532c8bd

Browse files
feat: logger interface added
1 parent 4f06678 commit 532c8bd

File tree

4 files changed

+100
-8
lines changed

4 files changed

+100
-8
lines changed

bifrost.go

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import (
88
"math/rand"
99
"os"
1010
"os/signal"
11+
"slices"
1112
"sync"
1213
"syscall"
1314
"time"
@@ -34,6 +35,7 @@ type Bifrost struct {
3435
plugins []interfaces.Plugin
3536
requestQueues map[interfaces.SupportedModelProvider]chan ChannelMessage // provider request queues
3637
waitGroups map[interfaces.SupportedModelProvider]*sync.WaitGroup
38+
logger interfaces.Logger
3739
}
3840

3941
func createProviderFromProviderKey(providerKey interfaces.SupportedModelProvider, config *interfaces.ProviderConfig) (interfaces.Provider, error) {
@@ -75,7 +77,7 @@ func (bifrost *Bifrost) prepareProvider(providerKey interfaces.SupportedModelPro
7577
return fmt.Errorf("failed to get provider for the given key: %v", err)
7678
}
7779

78-
for i := 0; i < providerConfig.ConcurrencyAndBufferSize.Concurrency; i++ {
80+
for range providerConfig.ConcurrencyAndBufferSize.Concurrency {
7981
bifrost.waitGroups[providerKey].Add(1)
8082
go bifrost.processRequests(provider, queue)
8183
}
@@ -84,7 +86,7 @@ func (bifrost *Bifrost) prepareProvider(providerKey interfaces.SupportedModelPro
8486
}
8587

8688
// Initializes infinite listening channels for each provider
87-
func Init(account interfaces.Account, plugins []interfaces.Plugin) (*Bifrost, error) {
89+
func Init(account interfaces.Account, plugins []interfaces.Plugin, logger interfaces.Logger) (*Bifrost, error) {
8890
bifrost := &Bifrost{account: account, plugins: plugins}
8991
bifrost.waitGroups = make(map[interfaces.SupportedModelProvider]*sync.WaitGroup)
9092

@@ -107,6 +109,11 @@ func Init(account interfaces.Account, plugins []interfaces.Plugin) (*Bifrost, er
107109
}
108110
}
109111

112+
if logger == nil {
113+
logger = NewDefaultLogger(interfaces.LogLevelInfo)
114+
}
115+
bifrost.logger = logger
116+
110117
return bifrost, nil
111118
}
112119

@@ -123,11 +130,8 @@ func (bifrost *Bifrost) SelectKeyFromProviderForModel(providerKey interfaces.Sup
123130
// filter out keys which dont support the model
124131
var supportedKeys []interfaces.Key
125132
for _, key := range keys {
126-
for _, supportedModel := range key.Models {
127-
if supportedModel == model {
128-
supportedKeys = append(supportedKeys, key)
129-
break
130-
}
133+
if slices.Contains(key.Models, model) {
134+
supportedKeys = append(supportedKeys, key)
131135
}
132136
}
133137

interfaces/logger.go

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package interfaces
2+
3+
// LogLevel represents the severity level of a log message
4+
type LogLevel string
5+
6+
const (
7+
LogLevelDebug LogLevel = "debug"
8+
LogLevelInfo LogLevel = "info"
9+
LogLevelWarn LogLevel = "warn"
10+
LogLevelError LogLevel = "error"
11+
)
12+
13+
// Logger defines the interface for logging operations
14+
type Logger interface {
15+
// Debug logs a debug level message
16+
Debug(msg string, err error)
17+
18+
// Info logs an info level message
19+
Info(msg string, err error)
20+
21+
// Warn logs a warning level message
22+
Warn(msg string, err error)
23+
24+
// Error logs an error level message
25+
Error(msg string, err error)
26+
}

logger.go

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package bifrost
2+
3+
import (
4+
"fmt"
5+
"os"
6+
"time"
7+
8+
"bifrost/interfaces"
9+
)
10+
11+
// DefaultLogger implements the Logger interface with stdout printing
12+
type DefaultLogger struct {
13+
level interfaces.LogLevel
14+
}
15+
16+
// NewDefaultLogger creates a new DefaultLogger instance
17+
func NewDefaultLogger(level interfaces.LogLevel) *DefaultLogger {
18+
return &DefaultLogger{
19+
level: level,
20+
}
21+
}
22+
23+
// formatMessage formats the log message with timestamp and level
24+
func (logger *DefaultLogger) formatMessage(level interfaces.LogLevel, msg string, err error) string {
25+
timestamp := time.Now().Format(time.RFC3339)
26+
baseMsg := fmt.Sprintf("[BIFROST-%s] %s: %s", timestamp, level, msg)
27+
if err != nil {
28+
return fmt.Sprintf("%s (error: %v)", baseMsg, err)
29+
}
30+
return baseMsg
31+
}
32+
33+
// Debug logs a debug level message
34+
func (logger *DefaultLogger) Debug(msg string, err error) {
35+
if logger.level == interfaces.LogLevelDebug {
36+
fmt.Fprintln(os.Stdout, logger.formatMessage(interfaces.LogLevelDebug, msg, err))
37+
}
38+
}
39+
40+
// Info logs an info level message
41+
func (logger *DefaultLogger) Info(msg string, err error) {
42+
if logger.level == interfaces.LogLevelDebug || logger.level == interfaces.LogLevelInfo {
43+
fmt.Fprintln(os.Stdout, logger.formatMessage(interfaces.LogLevelInfo, msg, err))
44+
}
45+
}
46+
47+
// Warn logs a warning level message
48+
func (logger *DefaultLogger) Warn(msg string, err error) {
49+
if logger.level == interfaces.LogLevelDebug || logger.level == interfaces.LogLevelInfo || logger.level == interfaces.LogLevelWarn {
50+
fmt.Fprintln(os.Stdout, logger.formatMessage(interfaces.LogLevelWarn, msg, err))
51+
}
52+
}
53+
54+
// Error logs an error level message
55+
func (logger *DefaultLogger) Error(msg string, err error) {
56+
fmt.Fprintln(os.Stderr, logger.formatMessage(interfaces.LogLevelError, msg, err))
57+
}
58+
59+
// SetLevel sets the logging level
60+
func (logger *DefaultLogger) SetLevel(level interfaces.LogLevel) {
61+
logger.level = level
62+
}

tests/setup.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ func getBifrost() (*bifrost.Bifrost, error) {
4444
return nil, err
4545
}
4646

47-
bifrost, err := bifrost.Init(&account, []interfaces.Plugin{plugin})
47+
bifrost, err := bifrost.Init(&account, []interfaces.Plugin{plugin}, nil)
4848
if err != nil {
4949
return nil, err
5050
}

0 commit comments

Comments
 (0)