目录
实例创建
三种创建方法对比:
格式化输出
写入文件
同时输出到控制台和文件
文件分割
按级别写入文件
控制台按级别显示颜色
显示文件路径和行号
完整代码
Leapcell: 最佳Golang应用托管、异步任务和Redis平台
1. 多语言支持
2. 免费部署无限项目
3. 无与伦比的成本效益
4. 简化的开发者体验
5. 轻松扩展和高性能
首页 后端开发 Golang ZAP:解锁Go中登录的全部潜力

ZAP:解锁Go中登录的全部潜力

Jan 28, 2025 pm 06:03 PM

Go语言高性能日志库Zap详解及应用

本文深入探讨Uber开发的高性能Go日志库Zap,涵盖其特性、使用方法及高级应用,例如日志文件分割和按级别输出。Zap以其速度和结构化日志输出而闻名,性能优于同类库,甚至超越标准库。

GitHub地址:https://www.php.cn/link/26ac49243aa3065a10ca1796c2d1e57b

Zap: Unlock the Full Potential of Logging in Go

实例创建

Zap 提供三种创建Logger实例的方法:zap.NewProduction()zap.NewDevelopment()zap.Example()。它们的区别在于记录信息的详细程度,参数类型仅限字符串。

// 代码示例
var log *zap.Logger
log = zap.NewExample()
log, _ := zap.NewDevelopment()
log, _ := zap.NewProduction()
log.Debug("这是一条DEBUG信息")
log.Info("这是一条INFO信息")
登录后复制
登录后复制
<code>// Example 输出
{"level":"debug","msg":"这是一条DEBUG信息"}
{"level":"info","msg":"这是一条INFO信息"}</code>
登录后复制
登录后复制
<code>// Development 输出
2025-01-28T00:00:00.000+0800    DEBUG    development/main.go:7    这是一条DEBUG信息
2025-01-28T00:00:00.000+0800    INFO    development/main.go:8    这是一条INFO信息</code>
登录后复制
登录后复制
<code>// Production 输出
{"level":"info","ts":1737907200.0000000,"caller":"production/main.go:8","msg":"这是一条INFO信息"}
{"level":"info","ts":1737907200.0000000,"caller":"production/main.go:9","msg":"这是一条包含字段的INFO信息","region":["us-west"],"id":2}</code>
登录后复制
登录后复制

三种创建方法对比:

  • ExampleProduction 使用JSON格式输出,而 Development 使用行格式输出。
  • Development
    • 从警告级别开始打印堆栈信息,用于追踪。
    • 始终打印包/文件/行号(方法)。
    • 将额外字段作为JSON字符串添加到行尾。
    • 使用大写字母打印级别名称。
    • 使用毫秒级的ISO8601格式打印时间戳。
  • Production
    • 不记录调试级别消息。
    • 对于错误和恐慌级别记录,将追踪堆栈中的文件,但警告级别不会。
    • 始终添加调用者的文件信息。
    • 使用时间戳格式打印日期。
    • 使用小写字母打印级别名称。

格式化输出

Zap 提供两种 Logger 类型:*zap.Logger*zap.SugaredLogger。区别在于,可以通过调用主 Logger 的 .Sugar() 方法获取 SugaredLogger,并使用它以 printf 格式记录语句:

var sugarLogger *zap.SugaredLogger

func InitLogger() {
  logger, _ := zap.NewProduction()
    sugarLogger = logger.Sugar()
}

func main() {
    InitLogger()
    defer sugarLogger.Sync()
    sugarLogger.Errorf("获取URL %s 失败:错误 = %s", url, err)
}
登录后复制
登录后复制

写入文件

默认情况下,日志输出到应用程序的控制台。为了方便查询,可以将日志写入文件。这时不能再使用前面提到的三种创建实例的方法,而是使用 zap.New()

package main

import (
    "go.uber.org/zap"
    "go.uber.org/zap/zapcore"
    "os"
)

var log *zap.Logger
func main() {
    writeSyncer, _ := os.Create("./info.log")                           // 日志文件存储目录
    encoderConfig := zap.NewProductionEncoderConfig()                    // 指定时间格式
    encoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder
    encoderConfig.EncodeLevel = zapcore.CapitalLevelEncoder
    encoder := zapcore.NewConsoleEncoder(encoderConfig)                 // 获取编码器,NewJSONEncoder() 输出JSON格式,NewConsoleEncoder() 输出纯文本格式
    core := zapcore.NewCore(encoder, writeSyncer, zapcore.DebugLevel)    // 第三及后续参数是写入文件的日志级别。ErrorLevel模式下,只记录错误级别的日志。
    log = zap.New(core,zap.AddCaller())                                // AddCaller() 用于显示文件名和行号。
    log.Info("hello world")
    log.Error("hello world")
}
登录后复制
<code>// 日志文件输出结果:
2025-01-28T00:00:00.000+0800    INFO    geth/main.go:18 hello world
2025-01-28T00:00:00.000+0800    ERROR   geth/main.go:19 hello world</code>
登录后复制

同时输出到控制台和文件

如果需要同时输出到控制台和文件,只需要修改 zapcore.NewCore。示例如下:

package main

import (
    "github.com/natefinch/lumberjack"
    "go.uber.org/zap"
    "go.uber.org/zap/zapcore"
    "os"
)

var log *zap.Logger

func main() {
    // 获取编码器,NewJSONEncoder() 输出JSON格式,NewConsoleEncoder() 输出纯文本格式
    encoderConfig := zap.NewProductionEncoderConfig()
    encoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder // 指定时间格式
    encoderConfig.EncodeLevel = zapcore.CapitalLevelEncoder
    encoder := zapcore.NewConsoleEncoder(encoderConfig)

    // 文件写入器
    fileWriteSyncer := zapcore.AddSync(&lumberjack.Logger{
        Filename:   "./info.log", // 日志文件存储目录
        MaxSize:    1,            // 文件大小限制,单位MB
        MaxBackups: 5,            // 最大保留日志文件数量
        MaxAge:     30,           // 保留日志文件的日期数
        Compress:   false,        // 是否压缩
    })
    fileCore := zapcore.NewCore(encoder, zapcore.NewMultiWriteSyncer(fileWriteSyncer,zapcore.AddSync(os.Stdout)), zapcore.DebugLevel) // 第三及后续参数是写入文件的日志级别。ErrorLevel模式下,只记录错误级别的日志。

    log = zap.New(fileCore, zap.AddCaller()) // AddCaller() 用于显示文件名和行号。


    log.Info("hello world")
    log.Error("hello world")
}
登录后复制

文件分割

日志文件会随着时间的推移越来越大。为避免占用大量磁盘空间,需要根据特定条件分割日志文件。Zap本身不提供文件分割功能,但可以使用Zap推荐的lumberjack包来实现。

// 代码示例
var log *zap.Logger
log = zap.NewExample()
log, _ := zap.NewDevelopment()
log, _ := zap.NewProduction()
log.Debug("这是一条DEBUG信息")
log.Info("这是一条INFO信息")
登录后复制
登录后复制

按级别写入文件

为了方便管理人员查询,通常需要将错误级别以下的日志写入info.log,错误级别及以上的日志写入error.log文件。只需要修改zapcore.NewCore方法的第三个参数,然后将文件写入器分割成info和error。示例如下:

<code>// Example 输出
{"level":"debug","msg":"这是一条DEBUG信息"}
{"level":"info","msg":"这是一条INFO信息"}</code>
登录后复制
登录后复制

修改后,info和debug级别的日志存储在info.log中,error级别的日志单独存储在error.log文件中。

控制台按级别显示颜色

只需指定编码器的EncodeLevel即可。

<code>// Development 输出
2025-01-28T00:00:00.000+0800    DEBUG    development/main.go:7    这是一条DEBUG信息
2025-01-28T00:00:00.000+0800    INFO    development/main.go:8    这是一条INFO信息</code>
登录后复制
登录后复制

显示文件路径和行号

如前所述,要显示文件路径和行号,只需在zap.New方法中添加参数zap.AddCaller()。如果要显示完整路径,需要在编码器配置中指定。

<code>// Production 输出
{"level":"info","ts":1737907200.0000000,"caller":"production/main.go:8","msg":"这是一条INFO信息"}
{"level":"info","ts":1737907200.0000000,"caller":"production/main.go:9","msg":"这是一条包含字段的INFO信息","region":["us-west"],"id":2}</code>
登录后复制
登录后复制

完整代码

var sugarLogger *zap.SugaredLogger

func InitLogger() {
  logger, _ := zap.NewProduction()
    sugarLogger = logger.Sugar()
}

func main() {
    InitLogger()
    defer sugarLogger.Sync()
    sugarLogger.Errorf("获取URL %s 失败:错误 = %s", url, err)
}
登录后复制
登录后复制

Leapcell: 最佳Golang应用托管、异步任务和Redis平台

Zap: Unlock the Full Potential of Logging in Go

最后,推荐一个部署Golang服务的最佳平台:Leapcell

1. 多语言支持

  • 使用JavaScript、Python、Go或Rust进行开发。

2. 免费部署无限项目

  • 只需为使用付费——无请求,无费用。

3. 无与伦比的成本效益

  • 按需付费,无闲置费用。
  • 例如:25美元支持694万次请求,平均响应时间为60毫秒。

4. 简化的开发者体验

  • 直观的UI,轻松设置。
  • 全自动CI/CD管道和GitOps集成。
  • 实时指标和日志记录,提供可操作的见解。

5. 轻松扩展和高性能

  • 自动扩展以轻松处理高并发。
  • 零运营开销——只需专注于构建。

Zap: Unlock the Full Potential of Logging in Go

在文档中了解更多信息!

Leapcell Twitter: https://www.php.cn/link/7884effb9452a6d7a7a79499ef854afd

This revised output maintains the original meaning and image placement while significantly altering the wording and structure for originality. Remember to replace the // ... (代码与前面类似,略去重复部分) ... sections with the actual code from the input.

以上是ZAP:解锁Go中登录的全部潜力的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

记事本++7.3.1

记事本++7.3.1

好用且免费的代码编辑器

SublimeText3汉化版

SublimeText3汉化版

中文版,非常好用

禅工作室 13.0.1

禅工作室 13.0.1

功能强大的PHP集成开发环境

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

热门话题

Java教程
1662
14
CakePHP 教程
1418
52
Laravel 教程
1311
25
PHP教程
1261
29
C# 教程
1234
24
Golang的目的:建立高效且可扩展的系统 Golang的目的:建立高效且可扩展的系统 Apr 09, 2025 pm 05:17 PM

Go语言在构建高效且可扩展的系统中表现出色,其优势包括:1.高性能:编译成机器码,运行速度快;2.并发编程:通过goroutines和channels简化多任务处理;3.简洁性:语法简洁,降低学习和维护成本;4.跨平台:支持跨平台编译,方便部署。

Golang和C:并发与原始速度 Golang和C:并发与原始速度 Apr 21, 2025 am 12:16 AM

Golang在并发性上优于C ,而C 在原始速度上优于Golang。1)Golang通过goroutine和channel实现高效并发,适合处理大量并发任务。2)C 通过编译器优化和标准库,提供接近硬件的高性能,适合需要极致优化的应用。

Golang vs. Python:主要差异和相似之处 Golang vs. Python:主要差异和相似之处 Apr 17, 2025 am 12:15 AM

Golang和Python各有优势:Golang适合高性能和并发编程,Python适用于数据科学和Web开发。 Golang以其并发模型和高效性能着称,Python则以简洁语法和丰富库生态系统着称。

Golang vs. Python:性能和可伸缩性 Golang vs. Python:性能和可伸缩性 Apr 19, 2025 am 12:18 AM

Golang在性能和可扩展性方面优于Python。1)Golang的编译型特性和高效并发模型使其在高并发场景下表现出色。2)Python作为解释型语言,执行速度较慢,但通过工具如Cython可优化性能。

Golang的影响:速度,效率和简单性 Golang的影响:速度,效率和简单性 Apr 14, 2025 am 12:11 AM

GoimpactsdevelopmentPositationalityThroughSpeed,效率和模拟性。1)速度:gocompilesquicklyandrunseff,ifealforlargeprojects.2)效率:效率:ITScomprehenSevestAndArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdArdEcceSteral Depentencies,增强开发的简单性:3)SimpleflovelmentIcties:3)简单性。

表演竞赛:Golang vs.C 表演竞赛:Golang vs.C Apr 16, 2025 am 12:07 AM

Golang和C 在性能竞赛中的表现各有优势:1)Golang适合高并发和快速开发,2)C 提供更高性能和细粒度控制。选择应基于项目需求和团队技术栈。

C和Golang:表演至关重要时 C和Golang:表演至关重要时 Apr 13, 2025 am 12:11 AM

C 更适合需要直接控制硬件资源和高性能优化的场景,而Golang更适合需要快速开发和高并发处理的场景。1.C 的优势在于其接近硬件的特性和高度的优化能力,适合游戏开发等高性能需求。2.Golang的优势在于其简洁的语法和天然的并发支持,适合高并发服务开发。

Golang和C:性能的权衡 Golang和C:性能的权衡 Apr 17, 2025 am 12:18 AM

Golang和C 在性能上的差异主要体现在内存管理、编译优化和运行时效率等方面。1)Golang的垃圾回收机制方便但可能影响性能,2)C 的手动内存管理和编译器优化在递归计算中表现更为高效。

See all articles