コンテンツにスキップ

ログファイルの書き方

ログをファイルに書き込むことは、デバッグ、監査、モニタリングのためにリクエスト履歴を保持する必要がある本番アプリケーションにとって不可欠です。デフォルトでは、Ginはすべてのログ出力をos.Stdoutに書き込みます。ルーターを作成する前にgin.DefaultWriterを設定することで、これをリダイレクトできます。

package main
import (
"io"
"os"
"github.com/gin-gonic/gin"
)
func main() {
// コンソールの色を無効にします。ログをファイルに書き込む場合、コンソールカラーは不要です。
gin.DisableConsoleColor()
// ファイルにロギング。
f, _ := os.Create("gin.log")
gin.DefaultWriter = io.MultiWriter(f)
// ログをファイルとコンソールに同時に書き込みたい場合は、以下のコードを使用してください。
// gin.DefaultWriter = io.MultiWriter(f, os.Stdout)
router := gin.Default()
router.GET("/ping", func(c *gin.Context) {
c.String(200, "pong")
})
router.Run(":8080")
}

ファイルとコンソールへの同時書き込み

Go標準ライブラリのio.MultiWriter関数は複数のio.Writer値を受け取り、すべてに対して書き込みを複製します。これは開発中にターミナルでログを確認しながらディスクにも永続化したい場合に便利です:

f, _ := os.Create("gin.log")
gin.DefaultWriter = io.MultiWriter(f, os.Stdout)

この設定により、すべてのログエントリがgin.logとコンソールの両方に同時に書き込まれます。

本番環境でのログローテーション

上記の例ではos.Createを使用しており、アプリケーションが起動するたびにログファイルが切り詰められます。本番環境では通常、既存のログに追加し、サイズや時間に基づいてファイルをローテーションしたいものです。lumberjackなどのログローテーションライブラリの使用を検討してください:

import "gopkg.in/natefinch/lumberjack.v2"
func main() {
gin.DisableConsoleColor()
gin.DefaultWriter = &lumberjack.Logger{
Filename: "gin.log",
MaxSize: 100, // メガバイト
MaxBackups: 3,
MaxAge: 28, // 日数
}
router := gin.Default()
router.GET("/ping", func(c *gin.Context) {
c.String(200, "pong")
})
router.Run(":8080")
}

関連項目