【Go】Logを別ファイルで管理する

今回はGo言語を使ってのLogファイルの作成方法についての紹介です。
目次
全体コード

まずは全体のコードの共有です
package logger
import (
"fmt"
"log"
"os"
"time"
)
// ロガーを作成する関数
var currentLogger *log.Logger
var lastLogFile string
func StartLogger() *log.Logger {
currentTime := time.Now()
// 現在の日付を使ってディレクトリを生成
currentDate := currentTime.Format("20060102") // YYYYMMDD 形式
logDir := "logs/" + currentDate
// ディレクトリが存在しない場合は作成
err := os.MkdirAll(logDir, os.ModePerm)
if err != nil {
log.Printf("Error: %v", err)
}
// ログファイル名を分単位で作成
logFileName := fmt.Sprintf("%s/log_%s.log", logDir, currentTime.Format("1504"))
// 同じファイル名の場合は新しいファイルを作成しない
if lastLogFile == logFileName {
return currentLogger
}
// 前回のログファイルが空なら削除
if lastLogFile != "" {
if info, err := os.Stat(lastLogFile); err == nil && info.Size() == 0 {
os.Remove(lastLogFile)
}
}
// 新しいファイルを作成する場合
file, err := os.OpenFile(logFileName, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
if err != nil {
log.Printf("Error: %v", err)
return nil
}
// 新しいロガーを作成(ファイルにログを記録)
currentLogger = log.New(file, "", log.LstdFlags)
lastLogFile = logFileName
return currentLogger
}
Loggerの呼び出し方(簡易説明)
loggerの使い方
import {
"app/logger"
}
func main() {
// logger初期化
logger := logger.StartLogger()
logger.Printf("ログを出す name: %s", name)
※nameは別途設定が必要
}
スポンサードサーチ
Loggerの呼び出し方(細かく説明)
Loggerの説明
importの説明です。
goで必要なパッケージをimportします。
import (
"fmt"
"log"
"os"
"time"
)
- fmt: フォーマットされたI/Oを提供します。
- log: ロギング機能を提供します。
- os: OSに依存した機能(ファイル操作など)を提供します。
- time: 時間の操作を行うためのパッケージです。
変数の宣言
var currentLogger *log.Logger
var lastLogFile string
- currentLogger: 現在のロガーインスタンスを保持します。
- lastLogFile: 最後に使用したログファイルの名前を保持します。
StartLogger関数
ロガーを初期化し、適切なログファイルを作成する役割を行います。

main以外のpackageでloogerを使用する場合も、インスタンスの初期化でloggerを使用することができます。
func StartLogger() *log.Logger {
currentTime := time.Now()
currentDate := currentTime.Format("20060102") // YYYYMMDD 形式
logDir := "logs/" + currentDate
現在の日付を取得し、「logs/YYYYMMDD 」形式のディレクトリ名を生成します。
ディレクトリの作成
指定したディレクトリが存在しない場合は作成します。作成に失敗した場合はエラーログを出力します。
err := os.MkdirAll(logDir, os.ModePerm)
if err != nil {
log.Printf("Error: %v", err)
}
同じファイル名の処理
前回のログファイルが存在し、サイズが0の場合は、そのファイルを削除します。
if lastLogFile == logFileName {
return currentLogger
}
前回のログファイルの処理
前回のログファイルが存在し、サイズが0の場合は、そのファイルを削除します。
if lastLogFile != "" {
if info, err := os.Stat(lastLogFile); err == nil && info.Size() == 0 {
os.Remove(lastLogFile)
}
}
新しいログファイルの作成
新しいログファイルを作成(または既存のファイルをオープン)します。エラーが発生した場合はエラーログを出力します。
file, err := os.OpenFile(logFileName, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
if err != nil {
log.Printf("Error: %v", err)
return nil
}
ロガーの設定
新しいロガーを作成し、ログファイルへの出力を設定します。最後に使用したファイル名を更新します。
currentLogger = log.New(file, "", log.LstdFlags)
lastLogFile = logFileName
ロガーの返却
初期化したロガーを返します。
return currentLogger
まとめ
この StartLogger 関数は、日付に基づいてディレクトリとログファイルを管理し、同じファイル名の重複を避け、空のログファイルを削除することで、効果的なロギングを実現します。