Golang zap和lumberjack实现日志存储和自动管理

Go项目MySQL、Redis与日志系统配置实战指南 在现代后端开发中,数据库连接池和缓存系统是提升应用性能的核心技术。通过连接池管理数据库连接可以显著减少TCP握手开销,而Redis作为内存数据库能有效降低磁盘I/O压力。Go语言凭借其原生并发特性,配合GORM和go-redis等成熟库,可以高效实现MySQL连接池配置和Redis缓存集成。日志系统方面,Zap日志库以其高性能著称,配合lumberjack实现日志切割,满足生产环境需求。本文以Go语言为例,详细演示如何配置MySQL连接池参数、实现Redis慢查询监控,以及构建高性能日志系统,这些技术组合能 阅读详情

期望实现功能

按不同的日志级别存储到不同的日志文件中(这里只实现了info和error级别)

控制最多保留的日志文件及保留最近多少天的日志文件(控制日志的最大磁盘使用量)

控制每个日志文件的大小

 

我们使用zap和lumberjack框架实现

go get -u go.uber.org/zap
go get gopkg.in/natefinch/lumberjack.v2

 

lumberjack的Logger结构体如下
type Logger struct {
	//写日志的文件名称
	Filename string `json:"filename" yaml:"filename"`


	//每个日志文件长度的最大大小,默认100M。
	MaxSize int `json:"maxsize" yaml:"maxsize"`


	//日志保留的最大天数(只保留最近多少天的日志)
	MaxAge int `json:"maxage" yaml:"maxage"`


	//只保留最近多少个日志文件,用于控制程序总日志的大小
	MaxBackups int `json:"maxbackups" yaml:"maxbackups"`


	//是否使用本地时间,默认使用UTC时间
	LocalTime bool `json:"localtime" yaml:"localtime"`


	// 是否压缩日志文件,压缩方法gzip
	Compress bool `json:"compress" yaml:"compress"`

	size int64   //记录当前日志文件的字节数
	file *os.File  //当前的日志文件
	mu   sync.Mutex

	millCh    chan bool
	startMill sync.Once
}

lumberjack的使用及源码可参考:https://mp.youkuaiyun.com/console/editor/html/107142274

 

示例

package applog

import(
	"strings"
	"path/filepath"

	"go.uber.org/zap"
	"go.uber.org/zap/zapcore"

	"gopkg.in/natefinch/lumberjack.v2"
)

var (
	infoLevel = "info"
	errorLevel = "error"
	debugLevel = "debug"
)


func NewLog(dir, prefix,level  string,maxSize,maxBackups,maxAge int) (*zap.Logger, func(),error) {

	if maxSize < 0 {
		maxSize = 0
	}
	if maxBackups < 0 {
		maxBackups = 0
	}
	if maxAge < 0 {
		maxAge = 0
	}

	infoLog := &lumberjack.Logger{
		Filename:   getFilePath(dir, prefix, infoLevel),
		MaxSize:    maxSize,
		MaxBackups: maxBackups,
		MaxAge:     maxAge,
		LocalTime:  true,
		Compress:   false,
	}

	errLog := &lumberjack.Logger{
		Filename:   getFilePath(dir, prefix, errorLevel),
		MaxSize:    maxSize,
		MaxBackups: maxBackups,
		MaxAge:     maxAge,
		LocalTime:  true,
		Compress:   false,
	}

	cronLogger := &lumberLog{
		dir:dir,
		prefix: prefix,
		level: level,
		infoLog: infoLog,
		errLog: errLog,
	}

	return cronLogger.getLoggerWithCron(), func() {cronLogger.StopLogger()},nil
}

func (l *lumberLog) rotate()  {
	if l.infoLog != nil {
		l.infoLog.Rotate()
	}
	if l.errLog != nil {
		l.errLog.Rotate()
	}
}

type lumberLog struct {
	dir string
	prefix  string
	level   string
	infoLog  *lumberjack.Logger
	errLog *lumberjack.Logger
}

func (l *lumberLog) StopLogger() {
	l.infoLog.Close()
	l.errLog.Close()
}

func (l *lumberLog)getLoggerWithCron()  (*zap.Logger) {
	highPriority := zap.LevelEnablerFunc(func(lev zapcore.Level) bool{
		return lev >= zap.ErrorLevel
	})

	lowLevel := zap.InfoLevel
	if  strings.EqualFold(l.level,debugLevel) {
		lowLevel = zap.DebugLevel
	}

	lowPriority := zap.LevelEnablerFunc(func(lev zapcore.Level) bool {
		return lev < zap.ErrorLevel && lev >= lowLevel
	})

	prodEncoder := zap.NewProductionEncoderConfig()
	prodEncoder.EncodeTime = zapcore.ISO8601TimeEncoder
	prodEncoder.CallerKey = ""

	highCore := zapcore.NewCore(zapcore.NewJSONEncoder(prodEncoder),zapcore.AddSync(l.errLog),highPriority)
	lowCore := zapcore.NewCore(zapcore.NewJSONEncoder(prodEncoder),zapcore.AddSync(l.infoLog),lowPriority)

	return zap.New(zapcore.NewTee(highCore,lowCore))
}



func getFilePath(dir, prefile, level string) string  {
	return filepath.Join(dir,level,prefile+"-"+level)+".log"
}

 

Gin框架日志控制实战:从基础输出到生产级结构化日志方案 在Web服务开发中,日志是系统可观测性的基石,它记录了请求处理、错误追踪和性能分析的关键信息。其核心原理是通过中间件拦截HTTP请求与响应,将结构化数据写入指定输出目标。良好的日志实践能极大提升运维效率和故障排查能力,尤其在微服务和云原生场景下至关重要。常见的应用场景包括请求链路追踪、性能监控、安全审计和业务分析。本文聚焦于Go语言Gin框架的日志控制,针对生产环境中常见的日志管理挑战,如海量日志导致的磁盘撑爆、非结构化日志难以解析等问题,深入探讨了如何实现日志的持久化、结构化输出与生命周期管理。通过集成Z 阅读详情

相关推荐

Gin框架日志输出全攻略:从基础配置到生产级轮转与结构化

在Web服务开发中,日志管理是构建可观测性系统的核心环节,它记录了服务运行状态、用户请求轨迹和系统异常信息。其基本原理是通过统一的日志接口,将程序运行信息定向输出到不同目标(如控制台、文件、网络流),并辅以格式化和分级机制。良好的日志实践能极大提升线上问题的排查效率,是服务稳定性的重要保障。常见的应用场景包括开发调试时的实时反馈、测试阶段的自动化分析,以及生产环境下的集中收集与监控告警。本文聚焦于Go生态中广泛使用的Gin Web框架,深入探讨如何精细控制其日志输出,涵盖使用lumberjack实现日志轮转

dglf54292的博客 454

Go:日志滚动(rolling)记录器 lumberjack 简介

lumberjack是一个日志滚动记录器。写入lumberjack的日志达到一定的条件后会进行存档(普通文件的形式,或压缩文件的形式),然后新建另一个同名文件(原文件存档时会重命名)继续记录。但是lumberjack本身并不包含日志的基础功能,例如日志等级、日志格式化等。理论上可以向lumberjack写入任意文本,并实现滚动记录。一般情况下,lumberjack配合其他日志库,实现日志的滚动(rolling)记录。

GIS摆渡人 2961

go.uber.org/zap 日志库高性能写入

完整实现约需150-200行代码,核心在于正确配置lumberjack与zap的协同工作。实际部署时建议将日志目录挂载到独立磁盘分区。

yolo模型训练找我,AI游戏合作找我 968

Golang高性能日志库zap + lumberjack 日志切割组件详解

Golang 高性能日志库 zap 的详细使用!!! Gin集成zap!!! lumberjack 日志切割组件的详细使用!!!

脑袋装水的博客 9514

Go日志采集:ELK与Loki集成

日志采集的第一步是让zap输出结构化JSON,字段名用Filebeat能识别的标准名(@timestampmessagetrace_id串联跨服务日志是排查问题的关键。ES必须配置ILM索引生命周期管理,否则日志堆积会导致OOM。日志量大时引入Loki,只索引标签不索引正文,存储成本降一个数量级。上一篇讲了zap结构化日志,这篇把日志采集和检索讲完,日志体系从产出、采集到查询形成完整流程。

白话机器学习 108

手把手教你用Three.js+Vue打造3D机房可视化系统(附完整代码)

本文详细介绍了如何使用Three.js与Vue 3构建企业级3D机房可视化系统。从技术选型、项目架构设计到3D场景构建、设备建模与渲染策略,提供了完整的开发方案和实战代码。重点讲解了如何实现设备状态实时监控、交互操作与性能优化,帮助开发者快速掌握3D可视化开发的核心技术。

ttt77的博客 320

golang 日志库logrus和lumberjack 日志切割库实践

golang 日志库logrus和lumberjack 日志切割库实践

qq_32421489的博客 2601

TEC 高精度控温算法:实现精准升降温与恒温控制

本文深入解析了TEC高精度控温算法的核心原理与工程实践。针对TEC非线性、时变的特性,算法通过智能状态机实现精准升降温与恒温控制,并详细阐述了参数整定、硬件协同及调试优化的系统性方法,为半导体激光器、PCR仪等高精度温控应用提供了一套完整的解决方案。

weixin_29212867的博客 1013

golang lumberjack 日志包

Lumberjackloglogruszap` 等)结合使用。它的核心功能是自动管理日志文件的切割、备份和清理,避免日志文件无限增长占用磁盘空间。当单个日志文件大小超过设定阈值(如100MB)时,自动创建新文件,旧文件按时间戳重命名备份。支持设置日志文件的最大保留时间(如保留最近7 天的日志),超时文件自动删除。可设置最大备份文件数(如最多保留5 个备份),超出数量时删除最旧的日志。支持并发写入,适用于高并发场景。

zfj321的博客 752

从“Hello World”到区域赛银牌:我的ACM算法打怪升级全记录(附各阶段工具包)

本文记录了作者从编程新手到ACM区域赛银牌获得者的完整学习历程,详细分享了各阶段的算法学习路线、刷题策略和实战经验。涵盖从基础算法到动态规划的系统训练方法,并附赠经过竞赛检验的工具包和资源清单,为算法竞赛爱好者提供实用参考。

weixin_29201859的博客 123

go-lumberjack

lumberjack是一个用于日志文件滚动和归档的 Go 语言库。

wick_light的博客 1235

STM32F103ZE精英板驱动ESP8266与DHT11构建物联网网关,实现乐联网温湿度数据实时监控

本文详细介绍了如何使用STM32F103ZE精英板驱动ESP8266与DHT11构建物联网网关,实现乐联网温湿度数据实时监控。从硬件选型、连接调试到乐联网平台配置和STM32程序开发,提供了完整的实现步骤和常见问题解决方案,适合物联网入门开发者参考。

weixin_30823001的博客 80

go zap + lumberjack 日志按大小分割demo整理

安装: go get -u go.uber.org/zap go get -u github.com/natefinch/lumberjack // 如果使用go mod管理包需要在执行 go mod vendor package main import ( "net/http" "github.com/natefinch/lumberjack" "go.uber.org/zap" "go.uber.org/zap/zapcore" ) var sugarLogger *zap.Sugar

安安静静敲代码 2037

【AI助力科研】不看一篇文献,手把手教你用chatGPT写文献综述!

这篇文章以【AI助力科研】为题,介绍了如何利用ChatGPT编写文献综述的方法。作者通过详细的指导,展示了不需要阅读大量文献,只需依靠ChatGPT模型即可完成文献综述的过程。该方法旨在提高科研工作者的效率,减少阅读负担,并且能够生成具有逻辑性和准确性的文献综述。

研究方向//图像视频处理/信号算法/红外无损检测/数值仿真/机器学习/优化算法/python/matlab 2万+

YOLO26改进策略【模型轻量化】| 替换骨干网络为 2024轻量化网络MoblieNetV4:移动生态系统的通用模型

本文记录的是基于MobileNet V4的YOLO26目标检测轻量化改进方法研究。主要用于轻量化应用部署,相关轻量化改进与其整体架构非常适配。通过整合、以及优化的,能够在在不降低性能指标的前提下,降低计算成本。本文配置了原论文中、、、和五种模型,以满足不同的需求。MobileNetV4: Universal Models for the Mobile Ecosystem是一系列适用于移动生态系统的通用高效模型。以下将详细介绍其轻量化设计的出发点、原理、结构和优势:的实现代码如下: 四、修改步骤 4.1 修

Limiiiing的博客 827

Go日志管理:Zap与Lumberjack实战

本文介绍了Go语言中的日志记录方案。首先分析了标准库log包的优缺点:简单易用但功能有限,缺乏日志级别、格式化和切割功能。然后重点介绍了高性能日志库Zap的使用方法,包括创建Logger、定制Encoder和WriteSyncer等配置。针对日志切割需求,推荐结合Lumberjack库使用。最后展示了如何在Gin框架中集成Zap日志,替换默认的日志中间件。全文提供了完整的代码示例,帮助开发者实现高效、结构化的日志记录系统。

qq_21873887的博客 460

YOLOv11改进策略【模型轻量化】| 替换骨干网络 CVPR-2024 StarNet,超级精简高效的轻量化模块

本文记录的是基于StarNet的YOLOv11轻量化改进方法研究。StarNet设计简洁,没有复杂的设计和精细调整的超参数,仅是一个 4 阶段的分层架构。并且其中能够在低维空间计算的同时考虑极高维的特征这一特性,进而提高模型精度。本文在替换骨干网络中配置了原论文中的starnet_s1starnet_s2starnet_s3和starnet_s4七种模型,以满足不同的需求。

Limiiiing的博客 6001

go实现全局日志管理:结合使用 zap 和 Lumberjack

通过这种统一的日志使用方式,可以保持整个项目的日志风格一致,方便收集和分析日志,并可以快速定位问题,实现完善的审计追踪,轻松调整日志级别而不需要修改业务代码。

qq_35293533的博客 761

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Golang zap 快速上手

这个包有几个函数:Print、Printf、Println、Fatal、Fatalf、Fatalln、Panic、Panicf、Panicln,可以满足大部分日志的打印和处理需求。需要注意的是,Zap 的性能非常高,并且使用简单,因此它是 Golang 中最受欢迎的日志库之一。Uber zap 具有良好的可扩展性,具有许多配置选项,可以根据不同的需求进行灵活配置,同时也提供了多个插件,可以轻松地集成到其他应用程序中。在上面的示例中,我们创建了一个生产级别的 Logger,它将日志记录到控制台或文件中。

Doublelv 的博客专栏。 1610

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Golang基于zap封装的简单log包开发+函数式选项模式简介

zap.New构造函数采用了函数式选项模式为新增的每个成员变量写一个专门的只增加它的new构造函数,这样的话每次增加成员变量都需要新增构造函数,适合成员变量较少且变动小的情况将所有成员变量抽象成一个结构体,这样的话就不需要改动当前对象的构造函数,但是当成员变量结构体面临变量拓展时,一样陷入第一种情况的困境。

weixin_60758357的博客 1375

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Go Gin框架日志轮转终极指南:使用Logrotate管理应用日志文件

Go Gin框架作为Go语言中最受欢迎的Web框架之一,为开发者提供了高性能的HTTP路由和中间件支持。在实际生产环境中,**日志管理**是每个应用都必须面对的重要课题。本文将为您详细介绍如何在Go Gin项目中实现**日志轮转**功能,确保应用日志的完整性和可管理性。 ## 为什么需要日志轮转? 🚀 日志文件会随着应用运行时间增长而不断增大,如果不加以管理,可能会带来以下问题: 1. *

gitblog_00339的博客 817

Go 项目配置与日志:Viper + Zap 实践

本文系统讲解 Go 项目中配置管理与日志系统的核心实践,围绕 Viper 和 Zap 两个标准库展开。内容涵盖配置管理的演进(从硬编码到配置中心)、Viper 的基本使用与结构体映射、环境变量覆盖、多环境隔离、配置热加载,以及 Zap 的高性能日志定制与 lumberjack 日志切割集成。笔记还提供了完整的项目目录结构与 Gin 框架集成示例,将配置和日志注入中间件,实现统一的请求日志记录。全文以可运行的代码示例贯穿,适合已掌握 Go 基础、希望在项目中落地标准化配置和日志管理的开发者阅读。

ylj__的博客 422

Go项目日志混乱?一文解决日志级别、输出、切割等9大难题(实战配置模板)

解决Go项目日志混乱难题,提供完整的Go日志配置方案,涵盖日志级别控制、多输出目标、文件切割归档等9大实战技巧。适用于微服务、后台系统等场景,提升排查效率与可维护性,配置模板开箱即用,值得收藏。

InstrFun的博客 325

golang 日志模块

package main import ( "net/http" "github.com/natefinch/lumberjack" "go.uber.org/zap" "go.uber.org/zap/zapcore" ) var sugarLogger *zap.SugaredLogger func main() { InitLogger() defer sugarLogger.Sync() for i := 0;i<100000;i++{ sugarLogger.Inf.

zhangdell的专栏 271

【Gin 日志实战】参考 GoFrame 优雅实现日志拆分 + 双输出(终端 + 文件),排查问题效率翻倍!

本文介绍了如何为Gin框架打造企业级日志方案,借鉴GoFrame日志模块的设计思想。方案实现了日志按业务拆分(访问/错误/运行/SQL日志)、终端+文件双输出、自动轮转等核心功能,采用JSON结构化格式便于解析。通过YAML配置文件集中管理参数,基于zap高性能日志库和lumberjack轮转组件实现,具有配置灵活、性能优异、易于扩展等优势。代码精简可直接复用,能显著提升Gin项目的日志管理能力。

wqm71的博客 350
上一篇: Golang日志框架lumberjack包源码分析
下一篇: Golang退出多层循环
思维的深度
博客等级 码龄11年 2万+粉丝 391原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值