mirror of
https://github.com/kataras/iris.git
synced 2025-01-23 10:41:03 +01:00
76 lines
1.6 KiB
Go
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
|
|
}
|