Golang Logrus에서 Channel hook 만들기
Logrus는 golang의 아주 좋은 logger 패키지입니다. logrus는 hook을 이용해서 지정된 한번에 여러곳에 로그를 남길 수 있습니다. built-in hook으로는 현재 syslog와 io.Writer가 있고 저는 channel로 hook을 쓸 일이 있어 간단하게 작성하여 공유해봅니다 :D
type Hook struct {
Channel chan string
LogLevels []logrus.Level
}
func (hook *Hook) Fire(entry *logrus.Entry) error {
line, err := entry.Bytes()
if err != nil {
return err
}
hook.Channel <- string(line)
return nil
}
func (hook *Hook) Levels() []logrus.Level {
return hook.LogLevels
}
로직은 특별히 뭐 없습니다.. 그냥 Hook에서 entry.Bytes()
로 얻은 값을 string으로 캐스팅하여 채널로 전달합니다. 이후에 logrus.AddHook()
으로 위 Hook을 등록해주면 됩니다.
logrus 기본 예시에 channel hook을 추가하면 이렇습니다.
package main
import (
"fmt"
"time"
logrus "github.com/sirupsen/logrus"
)
type Hook struct {
Channel chan string
LogLevels []logrus.Level
}
func (hook *Hook) Fire(entry *logrus.Entry) error {
line, err := entry.Bytes()
if err != nil {
return err
}
hook.Channel <- string(line)
return nil
}
func (hook *Hook) Levels() []logrus.Level {
return hook.LogLevels
}
func main() {
logChannel := make(chan string)
go func(receiveCh <-chan string) {
for data := range receiveCh {
fmt.Println("[Hooked] " + data)
}
}(logChannel)
log := logrus.New()
log.AddHook(&Hook{
Channel: logChannel,
LogLevels: []logrus.Level{
logrus.InfoLevel,
},
})
log.WithFields(logrus.Fields{
"animal": "walrus",
}).Info("A walrus appears")
time.Sleep(time.Second * 3)
}
간단하죠? 😉
time="2009-11-10T23:00:00Z" level=info msg="A walrus appears" animal=walrus
[Hooked] time="2009-11-10T23:00:00Z" level=info msg="A walrus appears" animal=walrus