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

Go

kamiです。
TwitterYoutubeもやってます。

今回は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 関数は、日付に基づいてディレクトリとログファイルを管理し、同じファイル名の重複を避け、空のログファイルを削除することで、効果的なロギングを実現します。

Go

Posted by kami