-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathslacklogger.go
More file actions
87 lines (69 loc) · 1.8 KB
/
slacklogger.go
File metadata and controls
87 lines (69 loc) · 1.8 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
package slacklogger
import (
"context"
"fmt"
"net/http"
"log/slog"
)
// SlackLogger provides functionality to send messages to slack.
type SlackLogger struct {
client *http.Client
url string
token string
channel string
environment string
isDebug bool
}
// NewSlackLogger creates a new instance of SlackLogger.
func NewSlackLogger(url, channel string, options ...Option) *SlackLogger {
sl := SlackLogger{
client: new(http.Client),
url: url,
channel: channel,
}
for i := range options {
options[i](&sl)
}
return &sl
}
// Log sends a simple message to slack.
func (l *SlackLogger) Log(message string) {
l.log(context.Background(), message)
}
// LogContext sends a simple message to slack with the given context.Context.
func (l *SlackLogger) LogContext(ctx context.Context, message string) {
l.log(ctx, message)
}
// Write implements the io.Writer interface.
func (l *SlackLogger) Write(message []byte) (int, error) {
l.Log(string(message))
return len(message), nil
}
// Send sends the given payload to slack.
func (l *SlackLogger) Send(ctx context.Context, payload *Payload) {
const errMessage = "error while logging to slack"
if err := l.send(ctx, payload); err != nil {
slog.Error(errMessage, ErrorAttr(err))
}
}
func (l *SlackLogger) log(ctx context.Context, message string) {
const (
errMessage = "error while logging to slack"
envPrefixFormat = "environment: %s\n\n, %s"
debugMessage = "pretending to log to slack"
)
if l.environment != "" {
message = fmt.Sprintf(envPrefixFormat, l.environment, message)
}
if l.isDebug {
slog.Debug(debugMessage, MessageAttr(message))
return
}
payload := Payload{
Channel: l.channel,
Text: message,
}
if err := l.send(ctx, &payload); err != nil {
slog.Error(errMessage, ErrorAttr(err))
}
}