Golang学习笔记-自定义日志轮转及输出
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...) }
作者:jruing
出处:https://www.cnblogs.com/jruing/p/17852074.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
本文来自博客园,作者:Jruing,转载请注明原文链接:https://www.cnblogs.com/jruing/p/17852074.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具