はじめに
Go言語でsyslogを受信するためのパッケージgo-syslog
の使い方を説明します。
syslogを受信するプログラムの作り方
インストール
$go get gopkg.in/mcuadros/go-syslog.v2
受信プログラム
package main
import (
"fmt"
"log"
"gopkg.in/mcuadros/go-syslog.v2"
)
func main() {
channel := make(syslog.LogPartsChannel)
handler := syslog.NewChannelHandler(channel)
server := syslog.NewServer()
server.SetFormat(syslog.Automatic)
server.SetHandler(handler)
err := server.ListenUDP("0.0.0.0:514")
if err != nil {
log.Fatalln(err)
}
err = server.Boot()
if err != nil {
log.Fatalln(err)
}
go func(channel syslog.LogPartsChannel) {
for logParts := range channel {
fmt.Println(logParts)
}
}(channel)
server.Wait()
}
このプログラムのポイントは
チャネルの作成とハンドラー登録
channel := make(syslog.LogPartsChannel)
handler := syslog.NewChannelHandler(channel)
受信したsyslogを受け取るチャネルを作成してハンドラーに登録します。
syslogの形式を自動判別
server.SetFormat(syslog.Automatic)
です、フォーマットが決まっている場合は、
RFC3164 = &format.RFC3164{} // RFC3164: http://www.ietf.org/rfc/rfc3164.txt
RFC5424 = &format.RFC5424{} // RFC5424: http://www.ietf.org/rfc/rfc5424.txt
RFC6587 = &format.RFC6587{} // RFC6587: http://www.ietf.org/rfc/rfc6587.txt - octet counting variant
Automatic = &format.Automatic{} // Automatically identify the format
の指定ができます。
TCPで受信する場合は、
- err := server.ListenUDP("0.0.0.0:8514")
+ err := server.ListenTCP("0.0.0.0:8514")
if err != nil {
log.Fatalln(err)
}
のようにすればよいです。両方受信もできます。
実行結果
$go run main.go
map[client:192.168.1.13:37943 content:/dev/root 30450024 8009816 21151964 28% / facility:1 hostname:raspberrypi priority:13 severity:5 tag:diskmon timestamp:2024-09-26 17:13:01 +0000 UTC tls_peer:]
map[client:192.168.1.13:37943 content:Mem: 3878088 114700 3137720 197104 625668 3436204 facility:1 hostname:raspberrypi priority:13 severity:5 tag:memmon timestamp:2024-09-26 17:13:01 +0000 UTC tls_peer:]
余談
このパッケージは、TWSNMP FC/FKの中で使っています。
1日数GB受信するようなヘビーな環境でも問題なく使えています。