🐡

slack,discordに直接通知するloggerをgoで作った

2023/07/08に公開

はじめに

僕は大学の三回生ですが、普段はハッカソンによく出ています。このハッカソンで問題になるのがログ問題です、ログを解析してslackなどに通知する機能は様々なサービスにより実現することが可能ですが、ハッカソンなど限られた期間の開発ではこれらを整備する時間を割けない場合が多いです。しかし、それをしないとdeploy先のエラーログはデプロイ先に確認しに行かないといけなかったりとすごく不便です。そこで開発したものが、logをそのままslack,discordに通知するloggerです。
それがloghookです。
https://github.com/seipan/loghook
このLoggerは本当に必要最低限の機能だけを保持しています。レベリング機能と通知する機能のみです、そのためwithContextやjsonなどの構造化loggerによくある機能を有していません。

使い方

まずloggerを作成します。

var (
	// DiscordWebhookURL is a webhook url for discord.
	DiscordWebhookURL = "https://discord.com/api/webhooks/xxxxxxxx/xxxxxxxx"
)

func main() {
	logger := loghook.NewLogger("", "test", "discord", DiscordWebhookURL)
	logger.SetLevel(loghook.DebugLevel)
	logger.SetWebhook(DiscordWebhookURL)
}

NewLoggerの第一引数に、通知するiconurlを第二引数に名前を、第三引数にtypeをいれます(slack,discordのいずれかです)、そして通知先のwebhookurlをあてます。
またログレベルをセットして、Webhookをセットします(これは無くても、最初のNewLoggerで設定しているので動作します)。


var (
	// DiscordWebhookURL is a webhook url for discord.
	DiscordWebhookURL = "https://discord.com/api/webhooks/xxxxxxxx/xxxxxxxx"
)

func main() {
	logger := loghook.NewLogger("", "test", "discord", DiscordWebhookURL)
	logger.SetLevel(loghook.DebugLevel)
	logger.SetWebhook(DiscordWebhookURL)

	logger.Debug("test")
	logger.Infof("test %s", "info")
}

実際に通知します。ここでは指定したwebhookurlにログを通知します。


var (
	// DiscordWebhookURL is a webhook url for discord.
	DiscordWebhookURL = "https://discord.com/api/webhooks/xxxxxxxx/xxxxxxxx"
)

func main() {
	logger := loghook.NewLogger("", "test", "discord", DiscordWebhookURL)
	logger.SetLevel(loghook.DebugLevel)
	logger.SetWebhook(DiscordWebhookURL)

	logger.Debug("test")
	logger.Infof("test %s", "info")
	logger.NoSendDebug()
	logger.Debug("test")
	logger.NoSendInfo()
	logger.Infof("test %s", "info")
}

NoSendメソッドによって、特定のレベルだと通知させなくすることもできます。これは、標準出力はされますが、webhookでの通知がされなくなります。


var (
	// DiscordWebhookURL is a webhook url for discord.
	DiscordWebhookURL = "https://discord.com/api/webhooks/xxxxxxxx/xxxxxxxx"
)

func main() {
	logger := loghook.NewLogger("", "test", "discord", DiscordWebhookURL)
	logger.SetLevel(loghook.DebugLevel)
	logger.SetWebhook(DiscordWebhookURL)

	logger.Debug("test")
	logger.Infof("test %s", "info")
	logger.NoSendDebug()
	logger.Debug("test")
	logger.NoSendInfo()
	logger.Infof("test %s", "info")
	
	logger.SetErrorWebhook(DiscordErrorWebhookURL)
	logger.Error("test")
}

ログレベルにより通知先を変えることも可能です、これによりそれぞれのレベルでの通知先を選ぶことができます。
より詳しい使い方はレポジトリを参照してください。

これから

WithCotextや構造化ロガーなど、zapなどに搭載されている標準的なメソッドを実装していこうと思います。あとテストコードを書きたいです。

最後に

個人開発の励みになるのでstarください!!!!!!!!
バグ報告や機能追加・改善はissue,PRにてお願いします。
https://github.com/seipan/loghook

Discussion