首页 > 其他分享 >Golang学习笔记-自定义日志轮转及输出

Golang学习笔记-自定义日志轮转及输出

时间:2023-11-23 17:36:01浏览次数:30  
标签:自定义 next Golang slog func time 日志 now os

package pkg

import (
	"fmt"
	"log"
	"log/slog"
	"os"
	"time"
)

var controlLogger *slog.Logger
var fileLogger *slog.Logger

const (
	timeFormat = "2006-01-02"
)

func InitLog(filepath string) {
	options := slog.HandlerOptions{
		// 是否打印文件名称及行号
		AddSource: false,
		Level:     slog.LevelDebug,
		ReplaceAttr: func(groups []string, a slog.Attr) slog.Attr {
			if a.Key == slog.TimeKey {
				a.Value = slog.AnyValue(time.Now().Format("2006-01-02 15:04:05"))
			}
			return a
		},
	}
	// 打开文件
	file, err := os.OpenFile(filepath, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0666)
	if err != nil {
		fmt.Println(err)
	}
	// 文件写入
	fileLogger = slog.New(slog.NewJSONHandler(file, &options))
	// 控制台输出
	controlLogger = slog.New(slog.NewTextHandler(os.Stdout, &options))

	// 启动定时器,每天零点进行日志轮转
	startTimer(file, filepath)
}

// 计时器
func startTimer(fileObj *os.File, filepath string) {
	now := time.Now()
	//// 计算下一分钟的开始时间
	//next := now.Truncate(time.Minute).Add(time.Minute)
	// 计算下一个零点时间
	next := now.Add(time.Hour * 24)
	next = time.Date(next.Year(), next.Month(), next.Day(), 0, 0, 0, 0, next.Location())
	// 计算当前时间到下一个零点的时间间隔
	timer := time.NewTimer(next.Sub(now))
	// 每秒钟
	//timer := time.NewTicker(time.Second)

	go func() {
		<-timer.C
		rotateLogs(fileObj, filepath)
		startTimer(fileObj, filepath)
	}()
}

// 日志轮转函数
func rotateLogs(fileObj *os.File, filepath string) {
	// 关闭当前的日志文件
	fileObj.Close()

	// 生成新的日志文件名
	newPath := fmt.Sprintf("%s_%s", filepath, time.Now().Format(timeFormat))

	// 将当前日志文件重命名为新的文件名
	err := os.Rename(filepath, newPath)
	if err != nil {
		log.Fatal("无法重命名日志文件:", err)
	}

	// 创建一个新的日志文件
	writer, err := os.OpenFile(filepath, os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0666)
	if err != nil {
		log.Fatal("无法打开日志文件:", err)
	}
	options := slog.HandlerOptions{
		// 是否打印文件名称及行号
		AddSource: false,
		Level:     slog.LevelDebug,
		ReplaceAttr: func(groups []string, a slog.Attr) slog.Attr {
			if a.Key == slog.TimeKey {
				a.Value = slog.AnyValue(time.Now().Format("2006-01-02 15:04:05"))
			}
			return a
		},
	}
	// 设置日志输出到新的日志文件
	fileLogger = slog.New(slog.NewJSONHandler(writer, &options))
	// 控制台输出
	controlLogger = slog.New(slog.NewTextHandler(os.Stdout, &options))
}

func Info(msg string, args ...any) {
	controlLogger.Info(msg, args...)
	fileLogger.Info(msg, args...)
}

func Error(msg string, args ...any) {
	controlLogger.Error(msg, args...)
	fileLogger.Error(msg, args...)
}

func Debug(msg string, args ...any) {
	controlLogger.Debug(msg, args...)
	fileLogger.Debug(msg, args...)
}

func Warn(msg string, args ...any) {
	controlLogger.Warn(msg, args...)
	fileLogger.Warn(msg, args...)
}

标签:自定义,next,Golang,slog,func,time,日志,now,os
From: https://www.cnblogs.com/jruing/p/17852074.html

相关文章

  • 手把手教你玩转 SpringBoot 日志
    本文根据文章:https://lebron.blog.csdn.net/article/details/132953586?spm=1001.2014.3001.5502进行修改一、日志重要吗程序中的日志重要吗?在回答这个问题前,笔者先说个事例:笔者印象尤深的就是去年某个同事,收到了客户反馈的紧急bug。尽管申请到了日志文件,但因为很多关键步骤......
  • golang常用包详解之: errgroup
    前言:并发编程在现代软件开发中变得越来越重要。Go语言通过goroutine和channel等语言特性为并发编程提供了非常强大的支持,但是在实际开发中,如何有效管理多个goroutine并处理它们可能产生的错误是一个挑战。这时,Go语言的官方库中的errgroup包就能发挥作用。正文:1.errgroup包概述......
  • Vue自定义页面路由
    错误1:webpackEmptyContext(evalat./src/store/modulessyncrecursive(0.js:10),<anonymous>:2:10)路由信息由后端给出,那么前端需要动态加载路由,同时component的路径也是后端给出,但是动态加载该路径会报错//假如path='@/views/user'constcom=()=>import(path)//这......
  • Golang Gin 请求参数的获取值 & 路由分组 & 控制器继承
    一. 请求参数的获取值  动态路由1typeUserstruct{2Usernamestring`form:"username"json:"username"`3Passwordstring`form:"password"json:"password"`4Ageint`form:"age"json:"......
  • python脚本把日志转成excel
    之前go写的,转成了python版本,日志是json格式的,按行读取{"aid":"1111","cid":"2222","callback_url":"http:\/\/ad.toutiao.com\/track\/activate\/?callback=B.eDCQxxxxxGCB&os=0&muid=","advertiser_id"......
  • core中间件全局日志
    参考学习项目zradmin在Configure中配置请求参数缓存//使可以多次多去body内容app.Use((context,next)=>{context.Request.EnableBuffering();returnnext();//请求通道走向下一步});在Configure......
  • Sqlserver日志传送高可用搭建
    1.原理主数据库定时备份事务日志到共享文件夹,辅助数据库定时从共享文件夹把事务日志备份复制到本地文件夹中,辅助数据库定时将本地文件夹中的事务日志备份还原到数据库上。2.修改服务启动账户2.1.为什么修改如果使用默认的NTSERVICE\MSSQLSERVER用户启动SQLServer,NTSERVICE\S......
  • Nginx loki监控日志的学习
    Nginxloki监控日志的学习背景学习自:https://mp.weixin.qq.com/s/Qt1r7vzWvCcJpNDilWHuxQ增加了一些自己的理解第一部分nginx日志的完善在logformat的后面增加一个:log_formatjson_analyticsescape=json'{''"msec":"$msec",'......
  • QT实战 之自定义控件(QSpinBox+QSlider)
    QT实战之自定义控件(QSpinBox+QSlider)创建自定义控件(QT设计师界面类)打开ui文件,拖拽需要用到的基础控件(QSpinBox+QSlider)事件绑定(注意QSpinBox::valueChanged有重载,需要用函数指针指定信号函数)使用自定义控件(拖拽添加Widget容器控件,右键菜单--提升为,打开提升对话框,填写提升的......
  • html自定义标签参数
    html的input中使用onclick()事件可以向js传递当前标签中的属性 利用input的name属性。制作一个JSON字符串既可以把想传递数据传递给js,js接受后对数据进行处理得到想要的数据。也可以用html的data-*=“”的方式向js传递参数如下例子品名<inputtype="text"name="proName"......