golang中使用zap日志库
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),
)
}
golang中使用zap日志库的更多相关文章
- 在Go语言项目中使用Zap日志库
在Go语言项目中使用Zap日志库 本文先介绍了Go语言原生的日志库的使用,然后详细介绍了非常流行的Uber开源的zap日志库,同时介绍了如何搭配Lumberjack实现日志的切割和归档. 在Go语言项 ...
- Go语言项目中使用zap日志库(翻译)
本文先介绍了Go语言原生的日志库的使用,然后详细介绍了非常流行的Uber开源的zap日志库,同时介绍了如何搭配Lumberjack实现日志的切割和归档. 在Go语言项目中使用Uber-go的Zap L ...
- Go之Zap日志库集成Gin
简介 在许多Go语言项目中,我们需要一个好的日志记录器能够提供下面这些功能: 1 . 能够将事件记录到文件中,而不是应用程序控制台; 2 . 日志切割-能够根据文件大小.时间或间隔等来切割日志文件; ...
- 这可能是php世界中最好的日志库——monolog
由于一些历史原因,php中并没有内建的日志接口,故长期以来也没一个功能完备并且应用广泛的日志库.在我的工作生涯中,如果系统需要记录一些应用日志的话,基本上就是封装一个日志类,然后把一些要记录的字段写入 ...
- golang-Zap和Go Logger日志库
目录 在Go语言项目中使用Zap日志库 介绍 默认的Go Logger日志库 实现Go Logger 设置Logger 使用Logger Logger的运行 Go Logger的优势和劣势 优势 劣势 ...
- 自行实现的jar包中,日志库的适配实现
日常情况下,我们自己都会自行实现一些基础的jar包,如dao包.service包或一些其他完成特定功能的jar包.如果没有一套调试日志信息,出现问题时想查找问题非常不方便.可能大多数小伙伴都会有自 ...
- 开源日志库log4cplus+VS2008使用
一.简介 log4cplus是C++编写的开源的日志系统,功能非常全面.本文介绍如何在Windows+VS2008中使用该日志库. 二.下载 可从网站[url]http://log ...
- [转]开源日志库<log4cplus+VS2008使用>整理
转 开源日志库<log4cplus+VS2008使用>整理 转http://pyhcx.blog.51cto.com/713166/143549 一.简介 log4cplus是C+ ...
- python logging日志库
项目中使用的日志库是使用python官方库logging封装的,但是居然一直么有设置日志自动滚动,经常会受到告警说哪台机器磁盘空间又满,清理一下,于是研究一下,解决这个问题. 参考:https://d ...
随机推荐
- Spring整合ActiveMQ,实现队列主题消息生产消费
1.引入依赖 pom.xml 1 <!-- activemq --> 2 <dependency> 3 <groupId>org.springframework&l ...
- xcode导出手机的崩溃日志
1.第一步将手机连接xcode 点击window 2.选择 Device and Simulators 3.选择View Device Logs 4.导出文件 右键鼠标选择Export Logs 5. ...
- 关于编写c++动态库常用的定义
1. 关于 1.1 最近一段时间,写了不少动态库,慢慢的也积累了东西. 1.2 之前一直做Windows的动态库,没有做过Linux和OS X的动态库,太缺乏经验了: 代码缺乏 编译器支持的判断.缺乏 ...
- 【LeetCode】457. Circular Array Loop 环形数组是否存在循环 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题思路 快慢指针 代码 日期 题目地址:https://le ...
- 【LeetCode】149. Max Points on a Line 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 字典+最大公约数 日期 题目地址:https://l ...
- The Longest Straight(FZUoj2216)
Problem 2216 The Longest Straight Accept: 82 Submit: 203Time Limit: 1000 mSec Memory Limit : ...
- 1025 - The Specials Menu
1025 - The Specials Menu PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 32 ...
- SOA 和微服务
====>场景 不可能让客户端与6个不同的应用/系统都一一去通信来去完成数据的展示.而是6个应用/系统之间进行彼此通信来完成调用,最后客户端只需要调用一个接口来获取数据即可. SOA架构 SOA ...
- Gradient-based Hyperparameter Optimization through Reversible Learning
目录 概 主要内容 算法 finite precision arithmic 实验 Maclaurin D, Duvenaud D, Adams R P, et al. Gradient-based ...
- HTML5 纯CSS3实现div按照顺序出入效果
效果: 源代码: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> < ...