go 日志的分装和使用 Zap + lumberjack

自带的log无法满足 按大小轮转 ,按天数清理旧日志 ,自动压缩 ,限制备份数量 ,防止磁盘写满 ,生产环境推荐 等

使用 Zap + lumberjack

package mainimport ("go.uber.org/zap""go.uber.org/zap/zapcore""gopkg.in/natefinch/lumberjack.v2""os""path/filepath"
)var logger *zap.Logger
// 初始化日志配置
func InitLogger() {// 确保 log 目录存在logDir := "log"if err := os.MkdirAll(logDir, 0755); err != nil {panic("无法创建日志目录: " + err.Error())}// 日志文件路径logFilePath := filepath.Join(logDir, "app.log")//每天一个文件logName := time.Now().Format("2006-01-02")logFilePath := filepath.Join(logDir, fmt.Sprintf("%v.log", logName))// lumberjack 配置:日志轮转writeSyncer := zapcore.AddSync(&lumberjack.Logger{Filename:   logFilePath, // 日志文件路径MaxSize:    100,         // 单文件最大 100 MBMaxBackups: 10,          // 最多保留 10 个备份MaxAge:     28,          // 文件最多保留 28 天Compress:   true,        // 是否压缩旧日志(.gz)})// 编码器配置(JSON 格式)encoderConfig := zap.NewProductionEncoderConfig()encoderConfig.TimeKey = "time"encoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder // 人类可读时间格式encoder := zapcore.NewJSONEncoder(encoderConfig)// 日志级别:生产环境一般用 InfoLevelcore := zapcore.NewCore(encoder, writeSyncer, zap.InfoLevel)// 构建 Loggerlogger = zap.New(core, zap.AddCaller()) // 可选:添加调用位置
}// 获取 Logger 实例
func GetLogger() *zap.Logger {return logger
}// 确保日志缓冲区落盘
func SyncLogger() {if logger != nil {logger.Sync()}
}// 示例错误
var ErrExample = &MyError{Msg: "示例错误"}// 自定义错误类型
type MyError struct {Msg string
}
// 实现 error 接口
func (e *MyError) Error() string {return e.Msg
}func main() {InitLogger()defer SyncLogger() // 确保缓冲区日志落盘log := GetLogger()log.Info("服务启动成功",zap.String("version", "1.0.0"),zap.Int("port", 8080),)log.Warn("这是一个警告",zap.String("reason", "磁盘空间不足"),)log.Error("发生错误",zap.Error(ErrExample),)}

结果配置如下

{"level":"info","time":"2025-09-11T16:13:12.515+0800","caller":"test/main.go:71","msg":"服务启动成功","version":"1.0.0","port":8080}
{"level":"warn","time":"2025-09-11T16:13:12.523+0800","caller":"test/main.go:76","msg":"这是一个警告","reason":"磁盘空间不足"}
{"level":"error","time":"2025-09-11T16:13:12.523+0800","caller":"test/main.go:80","msg":"发生错误","error":"示例错误"}
{"level":"info","time":"2025-09-11T16:20:18.157+0800","caller":"logger/main.go:71","msg":"服务启动成功","version":"1.0.0","port":8080}
{"level":"warn","time":"2025-09-11T16:20:18.165+0800","caller":"logger/main.go:76","msg":"这是一个警告","reason":"磁盘空间不足"}
{"level":"error","time":"2025-09-11T16:20:18.165+0800","caller":"logger/main.go:80","msg":"发生错误","error":"示例错误"}
{"level":"info","time":"2025-09-11T16:20:27.451+0800","caller":"logger/main.go:71","msg":"服务启动成功","version":"1.0.0","port":8080}
{"level":"warn","time":"2025-09-11T16:20:27.458+0800","caller":"logger/main.go:76","msg":"这是一个警告","reason":"磁盘空间不足"}
{"level":"error","time":"2025-09-11T16:20:27.458+0800","caller":"logger/main.go:80","msg":"发生错误","error":"示例错误"}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/922049.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/922049.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【.Net技术栈梳理】01-核心框架与运行时(CLR)

文章目录1 .NET Runtime(CLR-公共语言运行时)1.1 中间语言 IL1.1.1 从源代码到通用中间语言(IL)1.1.2 运行时加载:CLR登场1.1.3 核心步骤:即时编译 (JIT Compilation)1.1.4 执行与内存管理(GC&a…

Claude Code 平替:OpenAI发布 Codex CLI ,GPT-5 国内直接使用

openai推出的命令行编程工具codex已经可以使用最新 GPT-5 模型,拥有可媲美 Claude Code 的 AI 编码能力。本文将指导你在 Windows 系统上部署原生的 Codex CLI 程序,并接入超低价中转 API,让你在国内直接用上超高性价比的 OpenAI Codex CLI 应…

在VS2022的WPF仿真,为什么在XAML实时预览点击 ce.xaml页面控件,却不会自动跳转到具体代码,这样不方便我修改代码,

在VS2022的WPF仿真,为什么在XAML实时预览点击 WpfApp1\FunctionalModule\08Replace\Replace.xaml页面控件,却不会自动跳转到具体代码,这样不方便我修改代码,

Git Bash 别名

有些常用的指令参数非常多,每次都要输入好多参数,我们可以使用别名。Linux 系统中很多 shell,包括 bash,sh,zsh,dash 和 korn 等,不管哪种 shell 都会有一个 .bashrc 的隐藏文件,它就…

Centos7部署ceph存储

一、准备5台centos7主机 node节点双网卡&#xff08;1个内部检测&#xff0c;1个外部使用&#xff09;node节点都添加新网卡关闭防火墙和上下文都需要添加hosts文件都需要cat > /etc/hosts << EOF > 127.0.0.1 localhost localhost.localdomain localhost4 loca…

2025.9.10总结

今日感悟&#xff1a;刷到00后下班去菜市场捡菜的热点视频&#xff0c;确实挺有意思&#xff0c;不得不说&#xff0c;又省钱又好玩。虽然每天晚上能免费领个25块钱的水果回去&#xff0c;但确实没有什么新鲜感了。别人下班还能捡捡菜放松下&#xff0c;我下班&#xff0c;除了…

【数据结构与算符Trip第2站】稀疏数组

稀疏sparsearray数组 什么是稀疏数组&#xff1f; 稀疏数组是一种特殊的数据结构&#xff0c;用于高效存储和表示大部分元素为零&#xff08;或默认值&#xff09;的数组。它通过只存储非零元素的位置和值来节省内存空间。是一种压缩数组。 实现原理 在Go语言中&#xff0c;稀疏…

Sub-GHz无线收发单片机,低功耗物联网通信的硬件“基石”

随着物联网应用持续向规模化部署、广域化覆盖与高效化协同迈进&#xff0c; 作为IoT终端设备实现无线交互的核心通信单元之一——Sub-GHz无线收发单片机&#xff08;Sub-GHz射频收发芯片与单片机高度集成&#xff09;已成为系统设计中进一步简化外围元件数量、缩小硬件体积、降…

用Typescript 的方式封装Vue3的表单绑定,支持防抖等功能

在 Vue3 中结合 TypeScript 封装表单绑定方案时&#xff0c;需要综合考虑类型安全、功能扩展性和开发体验。以下是一个包含防抖功能、支持多种表单控件、具备完整类型推导的封装方案&#xff0c;全文约 2300 字&#xff1a; 方案设计思路 组合式函数封装&#xff1a;使用 Vue3 …

中悦大华通过订单日记实现流程重构之路

一、客户背景 安徽中悦大华高速流体机械有限公司&#xff0c;成立于2023年&#xff0c;位于安徽省宣城市&#xff0c;是一家以从事电子设备制造为主的企业&#xff0c;在多年的商业经营中已成为业界翘楚。 在业务不断壮大的过程中&#xff0c;面临生产协作效率低&#xff0c;库…

【Springboot】介绍启动类和启动过程

【Springboot】介绍启动类和启动过程【一】Spring Boot 启动类的注解【1】核心注解&#xff1a;SpringBootApplication&#xff08;1&#xff09;​SpringBootConfiguration​&#xff1a;Spring容器会从该类中加载Bean定义&#xff08;2&#xff09;​EnableAutoConfiguration…

Gears实测室:第一期·音游跨设备性能表现与工具价值实践

在音游品类中&#xff0c;《跳舞的线》以 “音乐与操作节奏深度绑定” 的玩法特性&#xff0c;对设备性能提出了特殊要求 —— 稳定的帧率与低延迟的渲染响应&#xff0c;直接影响玩家对音符时机的判断&#xff0c;一旦出现卡顿或帧波动&#xff0c;易导致操作失误&#xff0c;…

格式刷+快捷键:Excel和WPS表格隔行填充颜色超方便

有时候我们会对Excel或WPS表格的数据区域每隔一行填充一个底纹&#xff0c;便于阅读和查看。可以使用条件格式搭配公式实现&#xff0c;也可以手动设置。通常手动设置的时候是先设置一行&#xff0c;然后再双击格式刷应用。可以有更快的方式&#xff1a;先设置一行底纹&#xf…

将现有Spring Boot项目作为模块导入到另一个Spring Boot项目

将现有Spring Boot项目作为模块导入到另一个Spring Boot项目的操作步骤如下&#xff1a;‌项目结构调整‌将待导入的项目文件夹复制到主项目的根目录下修改子模块目录名保持命名规范&#xff08;如ms-xxx格式&#xff09;‌父POM配置‌在主项目的pom.xml中添加<modules>声…

激光频率梳 3D 轮廓测量 - 铣刀刀片的刀口钝化值 R 的测量

一、引言铣刀刀片的刀口钝化值 R 是影响切削性能的关键参数&#xff0c;其精度直接关系到工件表面质量与刀具寿命。传统测量方法在面对微米级钝化圆角时存在分辨率不足、接触式测量易损伤刃口等问题。激光频率梳 3D 轮廓测量技术凭借飞秒级时频基准与亚微米级测量精度&#xff…

3-10〔OSCP ◈ 研记〕❘ WEB应用攻击▸XSS攻击理论基础

郑重声明&#xff1a; 本文所有安全知识与技术&#xff0c;仅用于探讨、研究及学习&#xff0c;严禁用于违反国家法律法规的非法活动。对于因不当使用相关内容造成的任何损失或法律责任&#xff0c;本人不承担任何责任。 如需转载&#xff0c;请注明出处且不得用于商业盈利。 …

《嵌入式硬件(四):温度传感器DS1820》

一、DS1820的引脚DS1820单总线数字温度计&#xff1a;异步串行半双工特性&#xff1a;1&#xff09;独特的单线接口&#xff0c;只需 1 个接口引脚即可通信2&#xff09;多点&#xff08;multidrop&#xff09;能力使分布式温度检测应用得以简化3&#xff09;不需要外部元件4&a…

langchain 输出解析器 Output Parser

示例中使用的公共代码&#xff1a; from langchain_deepseek import ChatDeepSeek chat ChatDeepSeek(model"deepseek-chat",temperature0,api_keyAPI_KEY, )使用方法&#xff1a; 引入解析器实例化解析器调用解析器的get_format_instructions()获得提示词&#xff…

LeetCode算法日记 - Day 37: 验证栈序列、N叉树的层序遍历

目录 1. 验证栈序列 1.1 题目解析 1.2 解法 1.3 代码实现 2. N叉树的层序遍历 2.1 题目解析 2.2 解法 2.3 代码实现 1. 验证栈序列 https://leetcode.cn/problems/validate-stack-sequences/description/ 给定 pushed 和 popped 两个序列&#xff0c;每个序列中的 值…

金融数据库--3Baostock

一、 Baostock 是什么&#xff1f;Baostock&#xff08;宝硕股票&#xff09;是一个免费、开源的证券数据平台&#xff08;SDK&#xff09;&#xff0c;旨在为金融量化投资者、研究人员和学生提供稳定、准确、易用的A股历史数据和相关金融数据。其核心是一个 Python 库&#xf…