golang: 用协程异步写日志

一,代码

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] 这是一条错误信息.

 

posted @ 2024-11-30 10:48  刘宏缔的架构森林  阅读(9)  评论(0编辑  收藏  举报