1. 快速使用

package main

import (
"go.uber.org/zap"
"time"
) func main() {
// 1. sugar日志
//logger, _ := zap.NewProduction()
//logger, _ := zap.NewDevelopment()
//defer logger.Sync() // 刷新缓冲区,存盘
//sugar := logger.Sugar()
//sugar.Infow("first logger",
// 结构化上下文为松散类型的键值对。
// "url", "https://sankuanedu.com",
// "name", "三宽教育",
//)
//sugar.Errorf("url: %s", "http://www.mayanan.cn") // 测试环境
// 输出:2022-01-17T15:36:40.833+0800 INFO zapTest/main.go:11 first logger {"url": "https://sankuanedu.com", "name": "三宽教育"}
// 输出:2022-01-17T15:51:18.915+0800 ERROR zapTest/main.go:16 url: http://www.mayanan.cn
//main.main
// C:/Users/mayanan/Desktop/pro_go/zapTest/main.go:16
//runtime.main
// D:/go_1_17_1/src/runtime/proc.go:255 // 正式环境
// {"level":"info","ts":1642405507.5565631,"caller":"zapTest/main.go:11","msg":"first logger","url":"https://sankuanedu.com","name":"三宽教育"}
// {"level":"error","ts":1642405507.5565631,"caller":"zapTest/main.go:16","msg":"url: http://www.mayanan.cn","stacktrace":"main.main\n\tC:/Users/mayanan/Desktop/pro_go/zapTest/main.go:16\nruntime.main\n\tD:/go_1_17_1/src/runtime/proc.go:255"} // 2. 高性能日志
// 当性能和类型安全至关重要时,请使用记录器。它甚至比 SugaredLogger 更快,分配也更少,但它只支持结构化日志记录。
logger, _ := zap.NewProduction()
//logger, _ := zap.NewDevelopment()
defer logger.Sync() // 刷新缓冲区,存盘
logger.Debug("faild to fetch url",
// 作为强类型字段值的结构化上下文.
zap.String("url", "https://www.mayanan.cn"),
zap.Int("age", 28),
zap.Duration("duration", time.Second),
)
// 输出结构跟sugar一致 }

由于zap日志zap.NewProduction()和zap.NewDevelopment()默认是将日志输出到控制台,我们生产中需要将日志写入到文件

定义logger,将日志写入文件而不是终端(zap.SugaredLogger)

package main

import (
"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 < 10000; i++ {
simpleHttpGet("www.sogo.com")
simpleHttpGet("http://www.sogo.com")
}
} func InitLogger() {
writeSyncer := getLogWriter()
encoder := getEncoder()
core := zapcore.NewCore(encoder, writeSyncer, zapcore.DebugLevel) logger := zap.New(core, zap.AddCaller())
sugarLogger = logger.Sugar()
} func getEncoder() zapcore.Encoder {
encoderConfig := zap.NewProductionEncoderConfig()
encoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder
encoderConfig.EncodeLevel = zapcore.CapitalLevelEncoder
//return zapcore.NewJSONEncoder(encoderConfig)
return zapcore.NewConsoleEncoder(encoderConfig)
} func getLogWriter() zapcore.WriteSyncer {
lumberJackLogger := &lumberjack.Logger{
Filename: "./test.log",
MaxSize: 1,
MaxBackups: 5,
MaxAge: 30,
Compress: false,
LocalTime: true,
}
return zapcore.AddSync(lumberJackLogger)
} func simpleHttpGet(url string) {
sugarLogger.Debugf("Trying to hit GET request for %s", url)
//resp, err := http.Get(url)
//if err != nil {
// sugarLogger.Errorf("Error fetching URL %s : Error = %s", url, err)
//} else {
// sugarLogger.Infof("Success! statusCode = %s for URL %s", resp.Status, url)
// resp.Body.Close()
//} sugarLogger.Errorf("Error fetching URL %s : Error = %s", url, "这是一个错误")
sugarLogger.Infof("Success! statusCode = %d for URL %s", 200, url)
}

日志输出结果图:



参考文档:zap+Lumberjack 记录日志同时实现日志切割归档

高性能日志输出到(zap.Logger)

点击查看代码
package main

import (
"github.com/natefinch/lumberjack"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
"time"
) //var sugarLogger *zap.SugaredLogger
var logger *zap.Logger func main() {
InitLogger()
defer logger.Sync()
for i := 0; i < 10000; i++ {
simpleHttpGet("www.sogo.com")
simpleHttpGet("http://www.sogo.com")
}
} func InitLogger() {
writeSyncer := getLogWriter()
encoder := getEncoder()
core := zapcore.NewCore(encoder, writeSyncer, zapcore.DebugLevel) logger = zap.New(core, zap.AddCaller())
} func getEncoder() zapcore.Encoder {
encoderConfig := zap.NewProductionEncoderConfig()
encoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder
encoderConfig.EncodeLevel = zapcore.CapitalLevelEncoder
return zapcore.NewJSONEncoder(encoderConfig)
//return zapcore.NewConsoleEncoder(encoderConfig)
} func getLogWriter() zapcore.WriteSyncer {
lumberJackLogger := &lumberjack.Logger{
Filename: "./test.log",
MaxSize: 1,
MaxBackups: 5,
MaxAge: 30,
Compress: false,
LocalTime: true,
}
return zapcore.AddSync(lumberJackLogger)
} func simpleHttpGet(url string) {
logger.Debug("这是一条DEBUG的信息:",
zap.String("name", "sankaun"),
zap.Int("age", 18),
)
//resp, err := http.Get(url)
//if err != nil {
// sugarLogger.Errorf("Error fetching URL %s : Error = %s", url, err)
//} else {
// sugarLogger.Infof("Success! statusCode = %s for URL %s", resp.Status, url)
// resp.Body.Close()
//} logger.Error("这是一条Error的信息",
zap.Time("now", time.Now()),
zap.Bool("bool", false),
)
logger.Info("这是一条Info的信息",
zap.Duration("now", time.Second * 3),
zap.Bool("bool", true),
)
}

高性能日志输出到(zap.Logger),不同日志类型存储到不同目录文件

结构图:

点击查看代码
package main

import (
"github.com/natefinch/lumberjack"
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
"time"
) var infoLogger *zap.Logger
var errLogger *zap.Logger
var otherLogger *zap.Logger func main() {
InitLogger()
defer infoLogger.Sync()
defer errLogger.Sync()
defer otherLogger.Sync()
for i := 0; i < 10000; i++ {
simpleHttpGet("www.sogo.com")
simpleHttpGet("http://www.sogo.com")
}
} func InitLogger() {
infoWriteSyncer := getLogWriter("info")
errWriteSyncer := getLogWriter("error")
otherWriteSyncer := getLogWriter("other")
encoder := getEncoder()
infoCore := zapcore.NewCore(encoder, infoWriteSyncer, zapcore.InfoLevel)
errCore := zapcore.NewCore(encoder, errWriteSyncer, zapcore.ErrorLevel)
otherCore := zapcore.NewCore(encoder, otherWriteSyncer, zapcore.DebugLevel) infoLogger = zap.New(infoCore, zap.AddCaller())
errLogger = zap.New(errCore, zap.AddCaller())
otherLogger = zap.New(otherCore, zap.AddCaller())
} func getEncoder() zapcore.Encoder {
encoderConfig := zap.NewProductionEncoderConfig()
encoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder
encoderConfig.EncodeLevel = zapcore.CapitalLevelEncoder
return zapcore.NewJSONEncoder(encoderConfig)
//return zapcore.NewConsoleEncoder(encoderConfig)
} func getLogWriter(infoOrErr string) zapcore.WriteSyncer {
var lumberJackLogger *lumberjack.Logger
if infoOrErr == "info" {
lumberJackLogger = &lumberjack.Logger{
Filename: "./info/info.log",
MaxSize: 1,
MaxBackups: 5,
MaxAge: 30,
Compress: false,
LocalTime: true,
}
} else if infoOrErr == "error"{
lumberJackLogger = &lumberjack.Logger{
Filename: "./error/error.log",
MaxSize: 1,
MaxBackups: 5,
MaxAge: 30,
Compress: false,
LocalTime: true,
}
} else {
lumberJackLogger = &lumberjack.Logger{
Filename: "./other/other.log",
MaxSize: 1,
MaxBackups: 5,
MaxAge: 30,
Compress: false,
LocalTime: true,
}
}
return zapcore.AddSync(lumberJackLogger)
} func simpleHttpGet(url string) {
otherLogger.Debug("这是一条DEBUG的信息:",
zap.String("name", "sankaun"),
zap.Int("age", 18),
)
//resp, err := http.Get(url)
//if err != nil {
// sugarLogger.Errorf("Error fetching URL %s : Error = %s", url, err)
//} else {
// sugarLogger.Infof("Success! statusCode = %s for URL %s", resp.Status, url)
// resp.Body.Close()
//} errLogger.Error("这是一条Error的信息",
zap.Time("now", time.Now()),
zap.Bool("bool", false),
)
infoLogger.Info("这是一条Info的信息",
zap.Duration("now", time.Second * 3),
zap.Bool("bool", true),
)
}

go.uber.org/zap

zap官方文档

golang中使用zap日志库的更多相关文章

  1. 在Go语言项目中使用Zap日志库

    在Go语言项目中使用Zap日志库 本文先介绍了Go语言原生的日志库的使用,然后详细介绍了非常流行的Uber开源的zap日志库,同时介绍了如何搭配Lumberjack实现日志的切割和归档. 在Go语言项 ...

  2. Go语言项目中使用zap日志库(翻译)

    本文先介绍了Go语言原生的日志库的使用,然后详细介绍了非常流行的Uber开源的zap日志库,同时介绍了如何搭配Lumberjack实现日志的切割和归档. 在Go语言项目中使用Uber-go的Zap L ...

  3. Go之Zap日志库集成Gin

    简介 在许多Go语言项目中,我们需要一个好的日志记录器能够提供下面这些功能: 1 . 能够将事件记录到文件中,而不是应用程序控制台; 2 . 日志切割-能够根据文件大小.时间或间隔等来切割日志文件; ...

  4. 这可能是php世界中最好的日志库——monolog

    由于一些历史原因,php中并没有内建的日志接口,故长期以来也没一个功能完备并且应用广泛的日志库.在我的工作生涯中,如果系统需要记录一些应用日志的话,基本上就是封装一个日志类,然后把一些要记录的字段写入 ...

  5. golang-Zap和Go Logger日志库

    目录 在Go语言项目中使用Zap日志库 介绍 默认的Go Logger日志库 实现Go Logger 设置Logger 使用Logger Logger的运行 Go Logger的优势和劣势 优势 劣势 ...

  6. 自行实现的jar包中,日志库的适配实现

    ​ 日常情况下,我们自己都会自行实现一些基础的jar包,如dao包.service包或一些其他完成特定功能的jar包.如果没有一套调试日志信息,出现问题时想查找问题非常不方便.可能大多数小伙伴都会有自 ...

  7. 开源日志库log4cplus+VS2008使用

    一.简介     log4cplus是C++编写的开源的日志系统,功能非常全面.本文介绍如何在Windows+VS2008中使用该日志库.   二.下载     可从网站[url]http://log ...

  8. [转]开源日志库<log4cplus+VS2008使用>整理

    转 开源日志库<log4cplus+VS2008使用>整理 转http://pyhcx.blog.51cto.com/713166/143549 一.简介     log4cplus是C+ ...

  9. python logging日志库

    项目中使用的日志库是使用python官方库logging封装的,但是居然一直么有设置日志自动滚动,经常会受到告警说哪台机器磁盘空间又满,清理一下,于是研究一下,解决这个问题. 参考:https://d ...

随机推荐

  1. 二叉树c++实现

    !!版权声明:本文为博主原创文章,版权归原文作者和博客园共有,谢绝任何形式的 转载!! 作者:mohist --- 欢迎指正--- 二叉树特点: 要么为空树:要么,当前结点的左孩子比当前结点值小,当前 ...

  2. java源码——统计字符串中字符出现的次数

    对于任意输入的一段字符串,读取并且计算其中所有字符出现的次数. 使用HashMap存储字符和其对应的出现的次数,输出时,对HashMap进行遍历. 难点在于对HashMap的遍历,第一次使用,也是学习 ...

  3. 【LeetCode】364. Nested List Weight Sum II 解题报告 (C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 递归 日期 题目地址:https://leetcode ...

  4. 【LeetCode】157. Read N Characters Given Read4 解题报告(C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客:http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 直接调用 日期 题目地址:https://leetco ...

  5. 【LeetCode】915. Partition Array into Disjoint Intervals 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址: https://leetcode.com/problems/partitio ...

  6. MLP-Mixer: An all-MLP Architecture for Vision

    目录 概 主要内容 代码 Tolstlkhin I., Houlsby N., Kolesnikov A., Beyer L., Zhai X., Unterthiner T., Yung J., S ...

  7. Java语言程序设计复习提纲

     这是我在准备Java考试时整理的提纲,如果是通过搜索引擎搜索到这篇博客的师弟师妹,建议还是先参照PPT和课本,这个大纲也不是很准确,自己总结会更有收获,多去理解含义,不要死记硬背,否则遇到概念辨析题 ...

  8. CS5211完全替代兼容LT7211|PS8625|CH7511方案|EDP转LVDS|Capstone CS5211

    CH7511|LT7211|PS8625替代方案--Capstone CS5211AN 设计EDP转LVDS优势方案原理图+PCB板设计 CH7511|LT7211|PS8625这三款都是专门用于设计 ...

  9. <数据结构>XDOJ326.网络延时

    问题与解答 问题描述 有N个网络节点,标记为1到N. 给定一个二维数组times[M][3],表示信号经过有向边的传递时间.times[i][3] = {u, v, w}, 其中u是源节点,v是目标节 ...

  10. gPRC基本介绍

    1.说明 gRPC英文全名为Google Remote Procedure Call, 即Google远程过程调用, 是Google发布的一个高性能.通用的开源RPC框架, 2.gRPC定义 gRPC ...