golang zap日志使用

本文详细介绍Zap日志框架的使用方法,包括如何配置日志级别、输出路径及滚动策略,展示了三种不同场景下的Zap日志初始化实例,帮助读者快速掌握Zap在实际项目中的应用。

zap日志使用

package main

import (
	"encoding/json"
	"fmt"
	"github.com/natefinch/lumberjack"
	"go.uber.org/zap"
	"go.uber.org/zap/zapcore"
)

func initLogger (logpath string,loglevel string) *zap.Logger {
	hook := lumberjack.Logger{
		Filename:   logpath,  //日志文件路径
		MaxSize:    128, //最大字节
		MaxAge:     30,
		MaxBackups: 7,
		Compress:   true,
	}
	w := zapcore.AddSync(&hook)
	// 设置日志级别,debug可以打印出info,debug,warn;info级别可以打印warn,info;warn只能打印warn
    // debug->info->warn->error
    var level zapcore.Level
	switch loglevel {
	case "debug":
		level = zap.DebugLevel
	case "info":
		level= zap.InfoLevel
	case "error":
		level = zap.ErrorLevel
	default:
		level = zap.InfoLevel
	}

	encoderConfig := zap.NewProductionEncoderConfig()
	encoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder
	core := zapcore.NewCore(
		zapcore.NewConsoleEncoder(encoderConfig),
		w,
		level,
	)

	logger := zap.New(core)
	logger.Info("DefaultLogger init success")
	return logger
}

type Person struct {
	Name string `json:"name"`
	Age int `json:"age"`
}

func main(){
	t:= &Person{
		Name: "zhangsan",
		Age:  21,
	}
	data,err := json.Marshal(t)
	if err!=nil {
		fmt.Println("marshal is failed,err:",err)
	}

	// 历史记录日志名字为:all-2018-11-15T07-45-51.763.log,服务重新启动,日志会追加,不会删除
	logger := initLogger("./all.log","debug")
	for i:=0;i<6;i++{
		//结构化日志输出,即字段和消息
		//字段用来结构化输出错误相关的上下文环境,而消息简明扼要的阐述错误本身
		logger.Info(fmt.Sprint("test log",i),zap.Int("line",47))
		logger.Debug(fmt.Sprint("debug log",i),zap.ByteString("level",data))
		logger.Info(fmt.Sprint("Info log",i),zap.String("level",`{"a":"4","b":"5"}`))
		logger.Warn(fmt.Sprint("Info log ", i), zap.String("level", `{"a":"7","b":"8"}`))
		// 用户不存在的错误消息
		logger.Error("User does not exist",zap.String("Name",t.Name))
	}
	//supgar的使用,不推荐,适合简单使用
	sugar := logger.Sugar()
	sugar.Debugf("hello world : %s","zap-sugar")
}

示例代码二

package logger

import (
	"os"
	"time"

	"go.uber.org/zap"
	"go.uber.org/zap/zapcore"
	lumberjackv2 "gopkg.in/natefinch/lumberjack.v2"
)

const (
	Console = "console"
	File    = "file"
)

var (
	Leavel = zap.DebugLevel
	Target = Console
)

var (
	Logger *zap.Logger
	Sugar  *zap.SugaredLogger
)

func NewEncoderConfig() zapcore.EncoderConfig {
	return zapcore.EncoderConfig{
		// Keys can be anything except the empty string.
		TimeKey:        "T",
		LevelKey:       "L",
		NameKey:        "N",
		CallerKey:      "C",
		MessageKey:     "M",
		StacktraceKey:  "S",
		LineEnding:     zapcore.DefaultLineEnding,
		EncodeLevel:    zapcore.CapitalLevelEncoder,
		EncodeTime:     TimeEncoder,
		EncodeDuration: zapcore.StringDurationEncoder,
		EncodeCaller:   zapcore.ShortCallerEncoder,
	}
}

func TimeEncoder(t time.Time, enc zapcore.PrimitiveArrayEncoder) {
	enc.AppendString(t.Format("2006-01-02 15:04:05.000"))
}

func init() {
	w := zapcore.AddSync(&lumberjackv2.Logger{
		Filename:   "log/im.log",
		MaxSize:    1024, // megabytes
		MaxBackups: 10,
		MaxAge:     7, // days
	})

	var writeSyncer zapcore.WriteSyncer
	if Target == Console {
		writeSyncer = zapcore.NewMultiWriteSyncer(zapcore.AddSync(os.Stdout))
	}
	if Target == File {
		writeSyncer = zapcore.NewMultiWriteSyncer(w)
	}

	core := zapcore.NewCore(
		zapcore.NewConsoleEncoder(NewEncoderConfig()),
		writeSyncer,
		Leavel,
	)
	Logger = zap.New(core, zap.AddCaller())
	Sugar = Logger.Sugar()
}

示例代码三

package logger

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

// 初始化zaplogger日志库
var MyLogger *zap.Logger

func initLogger(logpath string) *zap.Logger {
	hook := lumberjack.Logger{
		Filename:   logpath, // 日志文件路径
		MaxSize:    128,     // 每个日志文件保存的最大尺寸 单位:M
		MaxBackups: 30,      // 日志文件最多保存多少个备份
		MaxAge:     7,       // 文件最多保存多少天
		Compress:   true,    // 是否压缩
	}

	encoderConfig := zapcore.EncoderConfig{
		TimeKey:        "time",
		LevelKey:       "level",
		NameKey:        "logger",
		CallerKey:      "linenum",
		MessageKey:     "msg",
		StacktraceKey:  "stacktrace",
		LineEnding:     zapcore.DefaultLineEnding,
		EncodeLevel:    zapcore.LowercaseLevelEncoder,  // 小写编码器
		EncodeTime:     zapcore.ISO8601TimeEncoder,     // ISO8601 UTC 时间格式
		EncodeDuration: zapcore.SecondsDurationEncoder, //
		EncodeCaller:   zapcore.ShortCallerEncoder,      // 短路径编码器
		EncodeName:     zapcore.FullNameEncoder,
	}

	// 设置日志级别
	atomicLevel := zap.NewAtomicLevel()
	atomicLevel.SetLevel(zap.DebugLevel)

	core := zapcore.NewCore(
		zapcore.NewJSONEncoder(encoderConfig),                                           // 编码器配置
		zapcore.NewMultiWriteSyncer(zapcore.AddSync(os.Stdout), zapcore.AddSync(&hook)), // 打印到控制台和文件
		atomicLevel,                                                                     // 日志级别
	)

	// 开启开发模式,堆栈跟踪
	caller := zap.AddCaller()
	// 开启文件及行号
	development := zap.Development()

	// 设置初始化字段
	filed := zap.Fields(zap.String("serviceName", "webgo"))
	// 构造日志
	logger := zap.New(core, caller, development, filed)

	logger.Info("log 初始化成功")
	return logger
}

// 初始化日志
func init() {
	logPath := beego.AppConfig.String("LogPath")
	MyLogger = initLogger(logPath)
}
<think>好的,用户想了解如何使用Golangzap库进行日志收集,需要方法和配置示例。我需要先整理zap库的基本用法,包括快速启动和自定义配置。然后根据提供的引用内容,结合示例代码,确保引用标记正确。 首先,用户提到的三个预定义配置方法:NewExample、NewProduction、NewDevelopment,这些可以直接使用,但可能不够灵活。需要说明它们的特点,比如NewProduction使用JSON格式,适合生产环境。 接着是自定义配置,用户可能需要更详细的控制,比如输出位置、日志级别、编码格式等。这里需要引用提供的引用内容中的配置示例,特别是引用2中的gitlab地址和安装方法,以及引用3中的AddCallerSkip解决源文件显示问题。 然后,关于日志收集,用户可能需要将日志写入文件,这里要提供示例代码,使用zapcore的WriteSyncer和NewTee来同时输出到控制台和文件。同时,注意添加zap.AddCaller()来显示调用位置,以及引用3提到的AddCallerSkip(1)调整调用堆栈,避免显示内部文件。 还需要考虑配置选项,比如时间格式、编码器配置等,确保语法正确,使用中文解释每个步骤的作用。 最后生成相关问题,覆盖性能优化、高级配置、与其他库的比较、调试技巧等,确保问题相关且有深度。 检查是否所有数学表达式都用了正确的格式,但问题中没有数学内容,所以可能不需要。确保引用标记正确放置,比如在提到预定义配置时引用[^1],配置示例引用[^2],调用位置问题引用[^3]。 确认回答结构清晰,分步骤说明,代码示例正确,引用正确,问题相关且合理。</think>### 使用Golangzap库进行日志收集的方法与配置示例 #### 1. 快速构建日志记录器 zap提供了三个预定义配置方法,适合快速搭建: - **NewExample()**:生成示例日志记录器(仅输出到`io.Discard`,用于测试) - **NewProduction()**:生产环境配置(JSON格式输出,包含调用堆栈信息) - **NewDevelopment()**:开发环境配置(彩色控制台输出,更易阅读) ```go // 生产环境日志示例 logger, _ := zap.NewProduction() defer logger.Sync() logger.Info("用户登录成功", zap.String("username", "test_user")) ``` #### 2. 自定义配置(推荐方式) 通过`zap.Config`实现灵活配置: ```go cfg := zap.Config{ Encoding: "json", // 或 "console" Level: zap.NewAtomicLevelAt(zap.DebugLevel), // 日志级别 OutputPaths: []string{"stdout", "/var/log/app.log"}, // 输出目标 ErrorOutputPaths: []string{"stderr"}, EncoderConfig: zapcore.EncoderConfig{ MessageKey: "msg", LevelKey: "level", TimeKey: "time", EncodeTime: zapcore.ISO8601TimeEncoder, // 时间格式 EncodeLevel: zapcore.CapitalLevelEncoder, }, } logger, _ := cfg.Build() ``` #### 3. 文件日志收集配置 使用`zapcore`实现多端输出: ```go // 创建文件输出器 file, _ := os.Create("app.log") fileWriteSyncer := zapcore.AddSync(file) // 创建控制台输出器 consoleEncoder := zapcore.NewConsoleEncoder(zap.NewDevelopmentEncoderConfig()) // 组合多个输出端 core := zapcore.NewTee( zapcore.NewCore(consoleEncoder, zapcore.AddSync(os.Stdout), zap.DebugLevel), zapcore.NewCore(consoleEncoder, fileWriteSyncer, zap.InfoLevel), ) logger := zap.New(core, zap.AddCaller()) // 添加调用位置信息 ``` #### 4. 关键配置选项说明 - **日志级别控制**:`AtomicLevel`支持动态调整级别 - **调用方信息**:通过`zap.AddCaller()`显示日志位置,若出现位置偏移可使用`zap.AddCallerSkip(1)`调整 - **日志轮转**:需配合`lumberjack`等第三方库实现 - **性能优化**:避免在热路径中使用反射,优先使用类型安全字段
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值