首页 > 其他分享 >Go中使用Zap日志库与Lumberjack日志切割

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

时间:2024-08-04 19:08:14浏览次数:7  
标签:Lumberjack Zap Go 日志 logger zap

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

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

原创 何泽丰 ProgrammerHe    2024年06月11日 20:15 广东 听全文

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)
    }

图片

 

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

标签:Lumberjack,Zap,Go,日志,logger,zap
From: https://www.cnblogs.com/cheyunhua/p/18342079

相关文章

  • Go必知必会:深入剖析Go语言中的结构体
    Go必知必会:深入剖析Go语言中的结构体原创王中阳王中阳 2024年07月24日06:03北京1人听过文末有面经共享群本文来自极客学院专栏,欢迎订阅:Go入门进阶实战专栏:其实学Go很简单。 Go语言以其清晰的语法和强大的内置类型系统,为构建高效且易于维护的软件程序提供了坚实的基础......
  • logback下日志输出前处理操作——以日志脱敏为例
    使用lockback目前JavaSpring服务在打印日志时一般使用slf4j和logback这种组合,其基本原理图如下具体的:大多数会先定义一个loackback-dev.xml文件,而后使用<appender>标签定义输出格式<appendername="file"class="ch.qos.logback.core.rolling.RollingFileAppender">......
  • Jquery正确发送headers值,Django后台request.Meta取值
    jquery发送请求$.ajax({method:"POST",headers:{"Auth_xxx":"yes"},data:{},url:"",success:function(response){console.log("respons......
  • 为什么我在 html 页面的格式化段落中没有收到 google gemini 响应
    我在我的django中使用googlegeminiapi,一切都很顺利,在终端中生成的Gemini响应非常完美,两个段落和所有段落之间都有空格,但是当我将此响应传递到html页面时,所有格式都消失了,那里两段之间没有空格,我不知道为什么它在响应中产生不必要的星星**,请告诉我如何修复它。......
  • go高并发之路——消息中间件kafka(中)
    接着上篇,我们继续聊聊kafka的那些事儿。一、消费者组消费者组,即ConsumerGroup,是Kafka的一大亮点设计。一个组内可以有多个消费者或消费者实例(ConsumerInstance),它们共享一个公共的ID,这个ID被称为GroupID。组内的所有消费者协调在一起来消费订阅主题(topic)的所有分区(Part......
  • 在 Python 中从 HTML 中抓取嵌入的 Google Sheet
    这对我来说相对棘手。我正在尝试提取来自python中的google工作表的嵌入表。这是链接我不拥有该工作表,但它是公开可用的。这是迄今为止我的代码,当我输出标题时,它向我显示“”。任何帮助将不胜感激。最终目标是将此表转换为pandasDF。多谢你们importlx......
  • 使用 django 的 EmailMessage 发送波斯语电子邮件时出现问题
    我对django相当陌生,并尝试使用django.core.mail.EmailMessage发送包含波斯语字母的电子邮件。这是我的代码:fromdjango.core.mailimportEmailMessagefromdjango.confimportsettingsdefcustom_sender(subject:str,body:str,recipient_list:list[str],......
  • 如何使用 Python 在 Google 或 DuckDuckGo 中快速获取答案
    我有一个人工智能助手项目,我希望它在互联网上搜索。我想使用适用于Python的GoogleQuickAnswerBox或DuckDuckGoInstantAnswerAPI。我看到了其他问题,但它们对我没有多大帮助。这是我想要实现的一个示例:问题:什么是长颈鹿?Google的答案:DuckDuckGo的......
  • django增删改查
    1.增classRole(models.Model):title=models.CharField(verbose_name="角色",max_length=32)od=models.IntegerField(verbose_name="排序",default=0)defstr(self):return"{}-{}-{}".format(self.id,self.title,self.od)方法一:obj1......
  • springboot+vue前后端分离项目-项目搭建17-集成AOP系统日志
    后端1.新增logs表和实体类,新增com/example/demo/mapper/LogsMapper.java,新增com/example/demo/controller/LogsController.javapackagecom.example.demo.controller;importcn.hutool.core.util.StrUtil;importcn.hutool.poi.excel.ExcelReader;importcn.hutool.poi......