首页 > 其他分享 >golang: 用协程异步写日志

golang: 用协程异步写日志

时间:2024-11-30 10:54:27浏览次数:6  
标签:11 异步 26 21 10 用协程 golang 2024 日志

一,代码

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

 

标签:11,异步,26,21,10,用协程,golang,2024,日志
From: https://www.cnblogs.com/architectforest/p/18569597

相关文章

  • JavaScript异步编程和与之相关的概念
    JavaScript中有很多具有一定难度的知识点,很难绝对地说哪一点是最难的,不过异步编程和与之相关的概念(如回调函数、Promise、async/await等)常常被认为是较难掌握的部分,下面结合例子来全方位说明一下:一、异步编程的概念及产生背景在JavaScript中,异步编程主要是为了处理那......
  • .NET Core 异步(Async)底层原理浅谈
    简介多线程与异步是两个完全不同的概念,常常有人混淆。异步异步适用于"IO密集型"的场景,它可以避免因为线程等待IO形成的线程饥饿,从而造成程序吞吐量的降低。其本质是:让线程的cpu片不再浪费在等待上,期间可以去干其它的事情。要注意的是:Async不能加速程序的执行,它只能做到不......
  • 前端异步的使用场景有哪些?
    前端异步的使用场景非常广泛,主要为了避免阻塞主线程,提升用户体验。以下是一些常见的场景:1.网络请求(NetworkRequests):这是最常见的异步使用场景。从服务器获取数据(例如,API调用,AJAX请求)需要一定的时间。如果使用同步方式,浏览器会在请求完成前被阻塞,导致页面卡顿,用户无法进......
  • 异步加载和延迟加载有什么区别?
    在前端开发中,异步加载和延迟加载都是优化网页性能的策略,它们的目标都是减少初始页面加载时间,但实现方式和使用场景有所不同。异步加载(AsynchronousLoading)定义:异步加载是指在不阻塞页面其他部分渲染的情况下,加载资源(例如脚本、样式表、图片等)。这意味着浏览器会在解析......
  • JS的异步函数的理解
    异步函数是JavaScript语言中的一个重要特性,它使得编写异步代码变得更加直观和易于管理。以下是对异步函数的深入理解:1. 概念理解异步函数是使用async关键字声明的函数。当这样的函数被调用时,它返回一个Promise对象。这使得异步函数在语法上看起来与普通同步函数非常相似,但它......
  • Golang - json omitempty的用法
    omitempty的作用是在json数据结构转换时,当该字段的值为该字段类型的零值时,忽略该字段。packagemainimport("fmt""encoding/json")typeStudentstruct{Namestring`json:"name"`Ageint`json:"age"`Gradestring`json:"......
  • golang map的底层结构
    1.Map的主要结构map 的底层数据结构定义在Go源码的 runtime 包中,其核心结构体是 hmap。Go的 map 使用 哈希表 存储键值对,并结合了**桶(bucket)**机制来优化存储和查找。hmap 的主要字段count:存储的键值对数量。buckets:哈希桶的数组,存储键值对的实际数据。hash0:......
  • 如何用协程扒光一部小说
    前言本次爬取的小说对象是《西游记》,如标题所示,利用协程来完成,为何利用协程?协程(Coroutine)是一种轻量级的程序执行单元,它可以在一个线程内实现多个任务的并发执行。通过协程我可以更快的爬取小说的内容和下载小说的内容。相比于我之前所写的单线程来说,效率提高了n倍。虽然我所爬......
  • golang实现比特币内核:区块链交易“transaction“二进制数据结构解析和代码实现1
    对于比特币,最重要的组成部分是交易。如果你需要通过比特币与他人交易,你可能需要像支付购买商品或服务一样,将一些比特币发送给他人。交易有四个关键字段,它们是版本、输入、输出和锁定时间。交易的二进制内容可能因不同的版本而有所不同,我们需要解析版本号以决定如何解码交易......
  • 支付宝小程序支付及支付后异步通知 C# NeCore3.1
    十年河东,十年河西,莫欺少年穷学无止境,精益求精1、支付异步通知usingAliyunHelper.AliPayHelper;usingAop.Api.Util;usingMicrosoft.AspNetCore.Authorization;usingMicrosoft.AspNetCore.Http;usingMicrosoft.AspNetCore.Mvc;usingMicrosoft.Extensions.Logging;u......