golang: 用協程非同步寫日誌

刘宏缔的架构森林發表於2024-11-30

一,程式碼

1,全域性檔案:

// 日誌訊息結構體
type LogMessage struct {
	Level   string
	Message string
}

//通道
var LogChan chan LogMessage

//日誌檔案控制代碼
var GlobalLogFile *os.File

// 非同步日誌函式
func AsyncLog(logCh chan LogMessage) {

	for {
		select {
		case msg := <-logCh:
			// 獲取當前時間
			now := time.Now()
			nowTime:=now.Format("2006-01-02 15:04:05")
			fmt.Println("協程中接收到了訊息:"+nowTime)
			writeString, err := GlobalLogFile.WriteString(nowTime + " [" + msg.Level + "] " + msg.Message + "\n")
			if err != nil {
				fmt.Printf("寫入時報錯:",err)
			}
			fmt.Println(writeString)
		}
	}
}

2,啟用協程:

	//得到年月日
	now := time.Now()
	dateStr:=now.Format("2006-01-02")
	filePath := "/data/goapp/logs/"+dateStr+".log"
	// 建立一個日誌檔案
	var errLog error
	config.GlobalLogFile, errLog = os.OpenFile(filePath, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
	if errLog != nil {
		log.Fatalf("無法開啟日誌檔案:%v", errLog)
	}
	defer config.GlobalLogFile.Close()

	// 建立日誌訊息的buffered channel
	config.LogChan = make(chan config.LogMessage, 1000)

	// 啟動非同步日誌goroutine
	go config.AsyncLog(config.LogChan)

3,傳送訊息

	//得到開啟的日誌檔案的路徑
	origFilePath := config.GlobalLogFile.Name();
    fmt.Println("日誌檔案路徑:",origFilePath)

    //得到當前要使用的檔案路徑:
	now := time.Now()
	dateStr:=now.Format("2006-01-02")
	curFilePath := "/data/goapp/logs/"+dateStr+".log"

	//如果檔名不一致時重新生成日誌檔案
	if curFilePath != origFilePath {
		//關閉前一個檔案控制代碼
		config.GlobalLogFile.Close()
		// 建立一個日誌檔案
		var errLog error
		config.GlobalLogFile, errLog = os.OpenFile(curFilePath, os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
		if errLog != nil {
			log.Fatalf("無法開啟日誌檔案:%v", errLog)
		}
	}

	// 傳送日誌訊息
	config.LogChan <- config.LogMessage{"INFO", "這是一條info資訊."}
	config.LogChan <- config.LogMessage{"ERROR", "這是一條錯誤資訊."}

二,測試效果

檢視檔案內容:

2024-11-26 10:21:10 [INFO] 這是一條info資訊.
2024-11-26 10:21:10 [ERROR] 這是一條錯誤資訊.
2024-11-26 10:21:16 [INFO] 這是一條info資訊.
2024-11-26 10:21:16 [ERROR] 這是一條錯誤資訊.
2024-11-26 10:21:17 [INFO] 這是一條info資訊.
2024-11-26 10:21:17 [ERROR] 這是一條錯誤資訊.
2024-11-26 10:21:18 [INFO] 這是一條info資訊.
2024-11-26 10:21:18 [ERROR] 這是一條錯誤資訊.
2024-11-26 10:21:20 [INFO] 這是一條info資訊.
2024-11-26 10:21:20 [ERROR] 這是一條錯誤資訊.
2024-11-26 10:21:22 [INFO] 這是一條info資訊.
2024-11-26 10:21:22 [ERROR] 這是一條錯誤資訊.
2024-11-26 10:21:24 [INFO] 這是一條info資訊.
2024-11-26 10:21:24 [ERROR] 這是一條錯誤資訊.

相關文章