slogslack

package module
v2.5.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: May 5, 2024 License: MIT Imports: 5 Imported by: 3

README

slog: Slack handler

tag Go Version GoDoc Build Status Go report Coverage Contributors License

A Slack Handler for slog Go library.

See also:

HTTP middlewares:

Loggers:

Log sinks:

🚀 Install

go get github.com/samber/slog-slack/v2

Compatibility: go >= 1.21

No breaking changes will be made to exported APIs before v3.0.0.

💡 Usage

GoDoc: https://pkg.go.dev/github.com/samber/slog-slack/v2

Handler options
type Option struct {
    // log level (default: debug)
    Level slog.Leveler

    // slack webhook url
    WebhookURL string
    // slack bot token
    BotToken string
    // slack channel (default: webhook channel)
    Channel string
    // bot username (default: webhook username)
    Username string
    // bot emoji (default: webhook emoji)
    IconEmoji string
    // bot emoji (default: webhook emoji)
    IconURL string
    // Not implemented yet, but we would like your feedback here: #7
    // ThreadTimestamp string

	Timeout time.Duration // default: 10s

    // optional: customize Slack message builder
    Converter Converter

    // optional: see slog.HandlerOptions
    AddSource   bool
    ReplaceAttr func(groups []string, a slog.Attr) slog.Attr
}

Attributes will be injected in message attachments.

Other global parameters:

slogslack.SourceKey = "source"
slogslack.ColorMapping = map[slog.Level]string{...}

screenshot

Example
Using webhook

Generate a webhook here.

import (
    slogslack "github.com/samber/slog-slack/v2"
    "log/slog"
)

func main() {
    webhook := "https://hooks.slack.com/services/xxx/yyy/zzz"
    channel := "alerts"

    logger := slog.New(slogslack.Option{Level: slog.LevelError, WebhookURL: webhook, Channel: channel}.NewSlackHandler())
    logger = logger.
        With("environment", "dev").
        With("release", "v1.0.0")

    // log error
    logger.
        With("category", "sql").
        With("query.statement", "SELECT COUNT(*) FROM users;").
        With("query.duration", 1*time.Second).
        With("error", fmt.Errorf("could not count users")).
        Error("caramba!")

    // log user signup
    logger.
        With(
            slog.Group("user",
                slog.String("id", "user-123"),
                slog.Time("created_at", time.Now()),
            ),
        ).
        Info("user registration")

    // push record to a thread
    logger.ErrorContext(
        slogslack.WithThreadTimestamp(context.Background(), "1714929099.4238"),
        "An error",
    )
}
Using bot token

Use Bot token.

import (
	slogslack "github.com/samber/slog-slack/v2"
	"log/slog"
)

func main() {
    token := "xoxb-"
    channel := "alerts"

    logger := slog.New(slogslack.Option{Level: slog.LevelError, BotToken: token, Channel: channel}.NewSlackHandler())
    logger = logger.
        With("environment", "dev").
        With("release", "v1.0.0")
}

🤝 Contributing

Don't hesitate ;)

# Install some dev dependencies
make tools

# Run tests
make test
# or
make watch-test

👤 Contributors

Contributors

💫 Show your support

Give a ⭐️ if this project helped you!

GitHub Sponsors

📝 License

Copyright © 2023 Samuel Berthe.

This project is MIT licensed.

Documentation

Index

Constants

This section is empty.

Variables

View Source
var ColorMapping = map[slog.Level]string{
	slog.LevelDebug: "#63C5DA",
	slog.LevelInfo:  "#63C5DA",
	slog.LevelWarn:  "#FFA500",
	slog.LevelError: "#FF0000",
}
View Source
var SourceKey = "source"

Functions

func DefaultConverter

func DefaultConverter(addSource bool, replaceAttr func(groups []string, a slog.Attr) slog.Attr, loggerAttr []slog.Attr, groups []string, record *slog.Record) *slack.WebhookMessage

func WithReplyBroadcast added in v2.5.0

func WithReplyBroadcast(ctx context.Context) context.Context

broadcast to channel when replies to thread if set

func WithThreadTimestamp added in v2.5.0

func WithThreadTimestamp(ctx context.Context, ts string) context.Context

reply in thread to posts with timestamps set this

Types

type Converter

type Converter func(addSource bool, replaceAttr func(groups []string, a slog.Attr) slog.Attr, loggerAttr []slog.Attr, groups []string, record *slog.Record) *slack.WebhookMessage

type Option

type Option struct {
	// log level (default: debug)
	Level slog.Leveler

	// slack webhook url
	WebhookURL string
	// slack bot token
	BotToken string
	// slack channel (default: webhook channel)
	Channel string
	// bot username (default: webhook username)
	Username string
	// bot emoji (default: webhook emoji)
	IconEmoji string
	// bot emoji (default: webhook emoji)
	IconURL string

	Timeout time.Duration // default: 10s

	// optional: customize Slack message builder
	Converter Converter

	// optional: see slog.HandlerOptions
	AddSource   bool
	ReplaceAttr func(groups []string, a slog.Attr) slog.Attr
}

func (Option) NewSlackHandler

func (o Option) NewSlackHandler() slog.Handler

type SlackHandler

type SlackHandler struct {
	// contains filtered or unexported fields
}

func (*SlackHandler) Enabled

func (h *SlackHandler) Enabled(_ context.Context, level slog.Level) bool

func (*SlackHandler) Handle

func (h *SlackHandler) Handle(ctx context.Context, record slog.Record) error

func (*SlackHandler) WithAttrs

func (h *SlackHandler) WithAttrs(attrs []slog.Attr) slog.Handler

func (*SlackHandler) WithGroup

func (h *SlackHandler) WithGroup(name string) slog.Handler

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL