Go言語でログファイルを出力する基本的な方法について記載します。
基本
まず、基本的なログ出力を見てみましょう。以下は、標準ライブラリのlog
パッケージを使用してログをファイルに出力するシンプルな例です。
// 必要なパッケージをインポート
package main
import (
"log"
"os"
)
func main() {
// ログを書き込むファイルを開く(なければ作成)
file, err := os.OpenFile("testlogfile.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
if err != nil {
// エラーハンドリング
log.Fatal(err)
}
// 関数が終了する際にファイルを閉じる
defer file.Close()
// ログの出力先をファイルに設定
log.SetOutput(file)
// ログを出力
log.Println("This is a test log entry")
}
ログレベルとカスタムフォーマット
しかし、これだけでは不十分です。私たちは異なるログレベルを持つメッセージを出力したいし、ログメッセージのフォーマットをカスタマイズしたい場合もあります。そこで登場するのが、logrus
というパッケージです。
// 必要なパッケージをインポート
package main
import (
"os"
log "github.com/sirupsen/logrus"
)
func main() {
// ログを書き込むファイルを開く(なければ作成)
file, err := os.OpenFile("testlogfile.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
if err != nil {
// エラーハンドリング
log.Fatal(err)
}
// 関数が終了する際にファイルを閉じる
defer file.Close()
// ログの出力先をファイルに設定
log.SetOutput(file)
// ログのフォーマットを設定(時間を含める)
log.SetFormatter(&log.TextFormatter{
FullTimestamp: true,
})
// 異なるログレベルでメッセージを出力
log.Info("This is an info message")
log.Warning("This is a warning message")
log.Error("This is an error message")
}
logrus
を使用すると、ログレベルを指定してメッセージを出力することができます。また、log.SetFormatter
を使用すると、ログメッセージのフォーマットをカスタマイズできます。
ログローテーション
さらに、ログファイルが大きくなりすぎると管理が難しくなるため、定期的に新しいログファイルに切り替える必要があります。これをログローテーションと呼びます。
Go言語でログローテーションを実装するには、lumberjack
というパッケージを使用します。
// 必要なパッケージをインポート
package main
import (
"github.com/natefinch/lumberjack"
log "github.com/sirupsen/logrus"
)
func main() {
// ログの出力先とローテーションの設定を行う
log.SetOutput(&lumberjack.Logger{
Filename: "testlogfile.log", // ログファイルの名前
MaxSize: 500, // ログファイルの最大サイズ(MB)
MaxBackups: 3, // バックアップファイルの最大数
MaxAge: 28, // バックアップファイルの最大保存日数
})
// ログのフォーマットを設定(時間を含める)
log.SetFormatter(&log.TextFormatter{
FullTimestamp: true,
})
// 異なるログレベルでメッセージを出力
log.Info("This is an info message")
log.Warning("This is a warning message")
log.Error("This is an error message")
}
以上のコードは、ログファイルが500MBに達すると新しいファイルに切り替わり、古いファイルは最大3つまで保存され、それぞれのファイルは最大28日間保存されます。