iris/_examples/logging/request-logger/accesslog-slack/slack_formatter.go
2022-10-17 22:45:47 +03:00

76 lines
1.6 KiB
Go

package main
import (
"io"
"github.com/kataras/iris/v12/middleware/accesslog"
"github.com/slack-go/slack"
)
type Slack struct {
// Client is the underline slack slack.
// This or Token are required.
Client *slack.Client
// Token is the oauth slack client token.
// Read more at: https://api.slack.com/web#authentication.
//
// If Client is not null then this is used to initialize the Slack.Client field.
Token string
// ChannelIDs specifies one or more channel the request logs
// will be printed to.
ChannelIDs []string
// HandleMessage set to true whether the slack formatter
// should just send the log to the slack channel(s) and
// stop printing the log to the accesslog's io.Writer output.
HandleMessage bool
// Template is the underline text template format of the logs.
// Set to a custom one if you want to customize the template (how the text is rended).
Template *accesslog.Template
}
func (f *Slack) SetOutput(dest io.Writer) {
if f.Client == nil && f.Token == "" {
panic("client or token fields must be provided")
}
if len(f.ChannelIDs) == 0 {
panic("channel ids field is required")
}
if f.Token != "" {
c := slack.New(f.Token)
f.Client = c
}
if f.Template == nil {
f.Template = &accesslog.Template{}
}
f.Template.SetOutput(dest)
}
func (f *Slack) Format(log *accesslog.Log) (bool, error) {
text, err := f.Template.LogText(log)
if err != nil {
return false, err
}
for _, channelID := range f.ChannelIDs {
_, _, err := f.Client.PostMessage(
channelID,
slack.MsgOptionText(text, false),
slack.MsgOptionAsUser(true),
)
if err != nil {
return false, err
}
}
return f.HandleMessage, nil
}