ginのログ出力先をsyslogにする

こんなかんじ

package main

import "github.com/gin-gonic/gin"
import "log/syslog"

func main() {
        logger, err := syslog.New(
                syslog.LOG_NOTICE|syslog.LOG_USER,
                "gin-test")
        if err != nil {
                panic(err)
        }
        gin.SetMode(gin.ReleaseMode)
        gin.DisableConsoleColor()
        gin.DefaultWriter = logger
        app := gin.Default()
        grp := app.Group("/api")
        grp.GET("/", func(ctx *gin.Context) {
                ctx.JSON(200, gin.H{"message": "ok"})
        })
        app.Run("localhost:3000")
}

まぁでもsupervisorとか使うだろうからログも標準出力にだして、あとはsupervisorに任せればよいでしょう。(※と、当初書いたけれど、systemdでやればいいんじゃないのって言われたが、とりあえず記事はそのまま残しておく。)

RHEL8系の場合、

sudo dnf install epel-release

ってやって(すでにやってあれば当然不要)

sudo yum -y install supervisor

とかやるとインストールされ、設定ファイルは /etc/supervisord.conf になっているので、そのなかに設定を追記するなり、設定ファイルをよく見るとわかるように /etc/supervisord.d/*.iniが読み込まれるようになっているのでそれにマッチする個別の設定ファイルを置くなりして自分のプログラムがsupervisordに起動されるようにすればよい。

例えば自分のプログラムがapiという名前で識別されるようにしたかったら、/etc/supervisord.d/api.ini などといった名前のファイルを作って、その中に

[program:api]
command=/usr/local/bin/api
autostart=true
autorestart=true
stderr_logfile=/var/log/api.err.log
stderr_logfile=/var/log/api.out.log

などと書いてやればよいだろう。

ってsupervisorの話のほうが長くなった。