Go中使用Zap日志库与Lumberjack日志切割

news/2025/3/17 22:31:37/文章来源:https://www.cnblogs.com/cheyunhua/p/18342079

Go中使用Zap日志库与Lumberjack日志切割

Go中使用Zap日志库与Lumberjack日志切割

原创 何泽丰 ProgrammerHe
 

Go中使用Zap日志库与Lumberjack日志切割

概述

在项目中使用日志记录有助于快速定位和修复问题,能帮助我们监控系统健康状态及时发现问题。Zap是Uber开源的一个高性能、结构化、分级记录的日志记录包。这篇笔记会简单介绍Zap,以及通过Lumberjack组件根据文件大小、日期来分割日志文件。

思路

 Zap的主要特点:

  1. 1. 高性能Zap通过减少内存分配和避免interface{}的使用,实现了极高的性能。

图片

  1. 2. 结构化日志Zap支持结构化日志记录,方便将日志信息以键值对的方式记录下来,对于日志搜索、分析和聚合很有帮助。

  2. 3. 日志分级Zap支持不同的日志级别,包括Debug,Info,Warn,Error等。Debug只在开发和调适阶段启用,在生产环境中使用会产生大量日志影响性能。Info用于帮助了解系统的正常运行情况,Warn在生产环境中帮助提前发现和处理潜在问题。Error在生产环境中用于记录立即处理的错误和异常。

Zap日志库中,有两种主要的日志记录方式,分别是zap.Loggerzap.SugaredLoggerzap.Logger性能更、类型更严格,在使用时需要指定字段类型和名称,虽然代码冗长但意思更明确。SugaredLogger性能稍差(在大部分情况下可以忽略),但提供了简化的API使用起来更便捷。 Zap通过使用Lumberjack第三方库来实现日志切割,Lumberjack是一个用Go语言编写的日志滚动库,将日志文件按照一定的规则进行拆分和归档,防止单个文件过大影响性能或占用太多的磁盘空间。Lumberjack可以设置文件最大值、根据文件大小、日志文件数量、保留天数(设置文件保存天数,过期自动删除)等条件来操作日志文件。

实现

Zap的安装

go get -u go.uber.org/zap

Zap的使用

Logger

// 初始化loger
logger, err := zap.NewProduction() // 创建一个预配置的日志管理器,用于生产环境
if err != nil{
  panic(err)
}

defer logger.Sync() //刷新缓存日志

logger.Info("hello zap info")
logger.Warn("hello zap warn")
logger.Error("hello zap error")

// 结构化日志记录
logger.Info("User Logged in",
        zap.String("username", "Dawei"),
        zap.Int("age", 20),
)

SugaredLogger

SugaredLogger提供了简便的方法使日志更加易用。如InfowInfofInfow用于记录带有键值对的日志信息,w代表With;Infof用于记录格式化字符串的信息日志,f代表format
// 初始化logger
logger, err := zap.NewProduction() // 创建一个预配置的日志管理器,用于生产环境
if err != nil{
  panic(err)
}
defer logger.Sync() //刷新缓存日志

// 使用SugaredLogger
sugar := logger.Sugar()

sugar := logger.Sugar()
// 记录带有上下文的信息
num := 12345
str := "夏天夏天悄悄过去"
sugar.Infow("Error 是因为", "数字", num, "语句", str)
sugar.Infof("Error %s", "留下小秘密")

// {"level":"info","ts":1718096086.7370722,"caller":"ZapDemo/main.go:26","msg":"Error 是因为","数字":12345,"语句":"夏天夏天悄悄过去"}
// {"level":"info","ts":1718096086.7371142,"caller":"ZapDemo/main.go:27","msg":"Error 留下小秘密"}

Lumberjack的安装

go get gopkg.in/natefinch/lumberjack.v2

Lumberjack的使用

首先我们需要初始化Lumberjack的配置,再将该配置添加到zap.logger中。在Lumberjack的配置中,可以指定Filename日志文件的名称和路径、MaxSize单个日志文件的最大值(如达到最大值就触发滚动),MaxBackups最大备份数,MaxAge(日志文件最长保留期限),Compress(是否压缩旧文件)
lumberjackLogger := &lumberjack.Logger{
        Filename:   "./project/ZapDemo/log/test.log",
        MaxSize:    10, //MB
        MaxBackups: 2,
        MaxAge:     28,   // days
        Compress:   true, // 是否压缩文件
    }
    // 初始化logger
    zapLogger := zap.New(zapcore.NewCore(
        zapcore.NewConsoleEncoder(zap.NewProductionEncoderConfig()),  //使用控制台编码器
        zapcore.AddSync(lumberjackLogger), // 将日志写入到 lumberjackLogger 提供的输出中
        zap.InfoLevel,  // 设置日志级别为 InfoLevel,即只记录 Info 级别及以上的日志消息
    ))
    defer zapLogger.Sync()

    for i := 0; i < 100; i++ {
        str := fmt.Sprintf("hi %d", i)
        zapLogger.Info(str)
    }

图片

 

Go · 目录
上一篇基于GitLab搭建Go项目自动构建环境下一篇Casbin笔记(1)
阅读 277
 

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

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

相关文章

[UnrealCircle]腾讯 罗谦 | UnLua-UE4下的Lua脚本插件

传送门:[UnrealCircle]腾讯 罗谦 | UnLua-UE4下的Lua脚本插件_哔哩哔哩_bilibili参考PPT:UnrealCircle921北京PPT_免费高速下载|百度网盘-分享无限制一. UnLua 基础 1.1 概念UnLua 是一个脚本插件 UnLua 不是蓝图的替代,而是一种补充没有 Asset 预览 不支持 nativization 无…

Zigzag :nested loop 的教科书

Zigzag 在 PE array-memory hierarchy level 上对 nested-loop based 算子数据部署设计策略进行详细分析。文章作者来自鲁汶 MICAS [1]实验室。 软硬件建模 软件上只涉及 MAC-based 的网络算子(Linear、Convolutional),沿用 time-loop [2] 方法使用 nested-loop 建模,从 op…

6、Qt-pyqt6常用基本控件 - 选择列表类控件

选择列表类控件主要以列表形式为童虎提供选择的项目,用户可以从中选择项 此选项在QTDesigner的:Input Widgets下ComboBox FontComBoBox ListWidget🎣 1.ComboBox 下拉框 常用的方法:方法 说明addItem() 添加一个下拉表选项addItems() 从列表中给添加下拉选项currentText()…

蒙特卡洛模拟(4)————书店买书问题(0-1规划)

目录一、问题提出二、模型建立1.符号建立2.规定约束3.获得目标函数三、代码求解1.预备知识(1)unique函数(2)randi函数2.变量设置与初始化3.输入循环进行模拟四、模型拓展 一、问题提出二、模型建立 1.符号建立 在图表上,我们可以看见有六家商店和五本书,在代码中我们往往…

KubeSphere 社区双周报| 2024.07.19-08.01

KubeSphere 社区双周报主要整理展示新增的贡献者名单和证书、新增的讲师证书以及两周内提交过 commit 的贡献者,并对近期重要的 PR 进行解析,同时还包含了线上/线下活动和布道推广等一系列社区动态。 本次双周报涵盖时间为:2024.07.19-08.01。 贡献者名单新晋 KubeSphere co…

内核简介

Linux内核基础 楔子 这部分的内容首先要回忆一下计算机的基础知识,基本的计算机结构包括CPU(算数逻辑单元ALU、控制单元CU)、存储器、输入和输出。CPU和其它设备是通过总线连接的。CPU执行的基础被称为指令集,CPU执行存储器存取指令时:CPU发出存取信号,然后就从存储器存取…

logback下日志输出前处理操作——以日志脱敏为例

使用lockback 目前Java Spring服务在打印日志时一般使用slf4j和logback这种组合,其基本原理图如下具体的:大多数会先定义一个loackback-dev.xml文件,而后使用<appender>标签定义输出格式 <appender name="file" class="ch.qos.logback.core.rolling…

边分治维护强连通分量(CF1989F,P5163)

这里的边分治和树上的点分治边分治不一样,是维护强连通分量用的,每条边有一个出现时间,通过将每条边按连通关系分流重新排列,从而维护每个时间点整张图的连通性。具体的,这个算法是维护这样的一类问题: n 个点,m 条边按时间顺序依次加入,每加入一条边,你需要回答一些问…

使用 C# 和 ONNX 來玩转Phi-3 SLM

LLM 席卷世界刷新 AI 的认知之后,由于 LLM 需要的硬件要求实在太高,很难在普通设备上运行,因此 SLM 逐漸受到重視,Phi-3 SLM 是由 Microsoft 所开发的模型,可以在你的电脑、手机等设备来运行,小型语言模型 (SLM) 和 ONNX 的结合改变了 AI 互操作性的游戏规则。让我们展…

到底什么是@RestController

@RestController是Spring框架的一个注解,通常用于标识一个类是RESTful服务的Controller。 @RestController经常用来处理HTTP请求,是SpringMVC中用于构建RESTful Web服务的注解,是@Controller注解的变体 通过@RestController注解,SpringMVC可以识别出这个类是一个控制器这个…