ZAP使用

本文介绍了Uber的高性能日志库ZAP,包括快速开始的非结构化和结构化日志打印,动态日志等级,记录日志到文件,以及动态等级结合文件记录的多种使用方式。内容涵盖了ZAP的性能优势和不同日志格式的示例。

ZAP使用

uber开源高性能日志库

一、快速开始

1.非结构化

性能比结构化的要差(性能比较:https://github.com/uber-go/zap)

(1)友好的日志打印
url := "https://www.baidu.com"
logger, _ := zap.NewDevelopment()
defer logger.Sync()
sugar := logger.Sugar()
sugar.Infow("failed to fetch URL",
	"url", url,
	"attempt", 3,
	"backoff", time.Second,
)
sugar.Infof("Failed to fetch URL: %s", url)

控制台

  • 2019-06-26T15:05:15.564+0800 INFO stuzap/main.go:13 failed to fetch URL {“url”: “https://www.baidu.com”, “attempt”: 3, “backoff”: “1s”}
  • 2019-06-26T15:05:15.591+0800 INFO stuzap/main.go:18 Failed to fetch URL: https://www.baidu.com
(2)易于程序识别的格式
url := "https://www.baidu.com"
logger, _ := zap.NewProduction()
defer logger.Sync()
sugar := logger.Sugar()
sugar.Infow("failed to fetch URL",
	"url", url,
	"attempt", 3,
	"backoff", time.Second,
)
sugar.Infof("Failed to fetch URL: %s", url)

控制台

  • {“level”:“info”,“ts”:1561532757.6966326,“caller”:“stuzap/main.go:13”,“msg”:“failed to fetch URL”,“url”:“https://www.baidu.com”,“attempt”:3,“backoff”:1}
  • {“level”:“info”,“ts”:1561532757.6966326,“caller”:“stuzap/main.go:18”,“msg”:“Failed to fetch URL: https://www.baidu.com”}

2.结构化

性能优于非结构化(性能比较https://github.com/uber-go/zap)

(1)友好的日志打印
url := "https://www.baidu.com"
logger, _ := zap.NewDevelopment()
defer logger.Sync()
logger.Info("failed to fetch URL",
	// Structured context as strongly typed Field values.
	zap.String("url", url),
	zap.Int("attempt", 3),
	zap.Duration("backoff", time.Second),
)

控制台

  • 2019-06-26T15:09:17.333+0800 INFO stuzap/main.go:12 failed to fetch URL {“url”: “https://www.baidu.com”, “attempt”: 3, “backoff”: “1s”}
(2)易于程序识别的格式
url := "https://www.baidu.com"
logger, _ := zap.NewProduction()
defer logger.Sync()
logger.Info("failed to fetch URL",
	// Structured context as strongly typed Field values.
	zap.String("url", url),
	zap.Int("attempt", 3),
	zap.Duration("backoff", time.Second),
)

控制台

  • {“level”:“info”,“ts”:1561533042.286673,“caller”:“stuzap/main.go:12”,“msg”:“failed to fetch URL”,“url”:“https://www.baidu.com”,“attempt”:3,“backoff”:1}

二、动态日志等级

dynamicLevel := zap.NewAtomicLevel()
// 默认Info级别
logcfg := zap.NewProductionConfig()
logcfg.Level = dynamicLevel

logger, err := logcfg.Build()
if err != nil {
	panic(err)
}
defer logger.Sync()

// 获取当前日志等级
level := dynamicLevel.String()
logger.Info("this info log", zap.String("logLevel", level))

// 设置当前日志等级为Debug
dynamicLevel.SetLevel(zap.DebugLevel)
logger.Debug("this is debug log.", zap.Int64("st", time.Now().Unix()))

// http设置日志等级
// 只支持get、put
// 格式:{"level":"info"}
// dynamicLevel.ServeHTTP

控制台

  • {“level”:“info”,“ts”:1561533922.949604,“caller”:“stuzap/main.go:22”,“msg”:“this info log”,“logLevel”:“info”}
  • {“level”:“debug”,“ts”:1561533922.949604,“caller”:“stuzap/main.go:26”,“msg”:“this is debug log.”,“st”:1561533922}

三、记录到文件中

package main

import (
	"go.uber.org/zap"
	"go.uber.org/zap/zapcore"
	"gopkg.in/natefinch/lumberjack.v2"
	"os"
	"time"
)

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

func NewEncoderConfig() zapcore.EncoderConfig {
	return zapcore.EncoderConfig{
		// Keys can be anything except the empty string.
		TimeKey:        "T",                           // json时时间键
		LevelKey:       "L",                           // json时日志等级键
		NameKey:        "N",                           // json时日志记录器键
		CallerKey:      "C",                           // json时日志文件信息键
		MessageKey:     "M",                           // json时日志消息键
		StacktraceKey:  "S",                           // json时堆栈键
		LineEnding:     zapcore.DefaultLineEnding,     // 友好日志换行符
		EncodeLevel:    zapcore.CapitalLevelEncoder,   // 友好日志等级名大小写(info INFO)
		EncodeTime:     TimeEncoder,                   // 友好日志时日期格式化
		EncodeDuration: zapcore.StringDurationEncoder, // 时间序列化
		EncodeCaller:   zapcore.ShortCallerEncoder,    // 日志文件信息(包/文件.go:行号)
	}
}

func main() {
	w := zapcore.AddSync(&lumberjack.Logger{
		Filename:   "all.log", // 输出文件
		MaxSize:    500,       // 日志文件最大大小(单位:MB)
		MaxBackups: 3,         // 保留的旧日志文件最大数量
		MaxAge:     28,        // 保存日期
	})
	core := zapcore.NewCore(
		zapcore.NewJSONEncoder(NewEncoderConfig()), // 日志形式
		//json形式
		//zapcore.NewJSONEncoder(NewEncoderConfig())
		//友好形式
		//zapcore.NewConsoleEncoder(NewEncoderConfig())
		zapcore.NewMultiWriteSyncer(zapcore.AddSync(os.Stdout), w), // 日志输出流可以添加多个
		zap.DebugLevel,                                             // 日志等级
	)
	logger := zap.New(core, zap.AddCaller())
	defer logger.Sync()

	logger.Info("this is info.", zap.Int("id", 1))
}

控制台

  • {“L”:“INFO”,“T”:“2019-06-26 15:46:46.895”,“C”:“stuzap/main.go:52”,“M”:“this is info.”,“id”:1}

四、动态日志等级+记录文件中

package main

import (
	"go.uber.org/zap"
	"go.uber.org/zap/zapcore"
	"gopkg.in/natefinch/lumberjack.v2"
	"os"
	"time"
)

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

func NewEncoderConfig() zapcore.EncoderConfig {
	return zapcore.EncoderConfig{
		// Keys can be anything except the empty string.
		TimeKey:        "T",                           // json时时间键
		LevelKey:       "L",                           // json时日志等级键
		NameKey:        "N",                           // json时日志记录器名
		CallerKey:      "C",                           // json时日志文件信息键
		MessageKey:     "M",                           // json时日志消息键
		StacktraceKey:  "S",                           // json时堆栈键
		LineEnding:     zapcore.DefaultLineEnding,     // 友好日志换行符
		EncodeLevel:    zapcore.CapitalLevelEncoder,   // 友好日志等级名大小写(info INFO)
		EncodeTime:     TimeEncoder,                   // 友好日志时日期格式化
		EncodeDuration: zapcore.StringDurationEncoder, // 时间序列化
		EncodeCaller:   zapcore.ShortCallerEncoder,    // 日志文件信息(包/文件.go:行号)
	}
}

func main() {
	// 动态日志等级
	dynamicLevel := zap.NewAtomicLevel()

	w := zapcore.AddSync(&lumberjack.Logger{
		Filename:   "all.log", // 输出文件
		MaxSize:    500,       // 日志文件最大大小(单位:MB)
		MaxBackups: 3,         // 保留的旧日志文件最大数量
		MaxAge:     28,        // 保存日期
	})
	core := zapcore.NewCore(
		zapcore.NewJSONEncoder(NewEncoderConfig()), // 日志形式
		//json形式
		//zapcore.NewJSONEncoder(NewEncoderConfig())
		//友好形式
		//zapcore.NewConsoleEncoder(NewEncoderConfig())
		zapcore.NewMultiWriteSyncer(zapcore.AddSync(os.Stdout), w), // 日志输出流可以添加多个
		dynamicLevel,                                             // 日志等级
	)
	logger := zap.New(core, zap.AddCaller())
	defer logger.Sync()

	// 将当前日志等级设置为Debug
	// 注意日志等级低于设置的等级,日志文件也不分记录
	dynamicLevel.SetLevel(zap.DebugLevel)

	logger.Info("this is info.", zap.Int("id", 1))
}

控制台

  • {“L”:“INFO”,“T”:“2019-06-26 15:49:57.866”,“C”:“stuzap/main.go:57”,“M”:“this is info.”,“id”:1}

五、动态等级+记录文件+控制台友好格式打印、文件json格式记录

package main

import (
	"go.uber.org/zap"
	"go.uber.org/zap/zapcore"
	"gopkg.in/natefinch/lumberjack.v2"
	"os"
	"time"
)

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

func NewEncoderConfig() zapcore.EncoderConfig {
	return zapcore.EncoderConfig{
		// Keys can be anything except the empty string.
		TimeKey:        "T",                           // json时时间键
		LevelKey:       "L",                           // json时日志等级键
		NameKey:        "N",                           // json时日志记录器名
		CallerKey:      "C",                           // json时日志文件信息键
		MessageKey:     "M",                           // json时日志消息键
		StacktraceKey:  "S",                           // json时堆栈键
		LineEnding:     zapcore.DefaultLineEnding,     // 友好日志换行符
		EncodeLevel:    zapcore.CapitalLevelEncoder,   // 友好日志等级名大小写(info INFO)
		EncodeTime:     TimeEncoder,                   // 友好日志时日期格式化
		EncodeDuration: zapcore.StringDurationEncoder, // 时间序列化
		EncodeCaller:   zapcore.ShortCallerEncoder,    // 日志文件信息(包/文件.go:行号)
	}
}

func main() {
	// 动态日志等级
	dynamicLevel := zap.NewAtomicLevel()

	w := zapcore.AddSync(&lumberjack.Logger{
		Filename:   "all.log", // 输出文件
		MaxSize:    500,       // 日志文件最大大小(单位:MB)
		MaxBackups: 3,         // 保留的旧日志文件最大数量
		MaxAge:     28,        // 保存日期
	})

	highPriority := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool {
		return lvl >= zapcore.InfoLevel
	})

	core := zapcore.NewTee(
		// 有好的格式、输出控制台、动态等级
		zapcore.NewCore(zapcore.NewConsoleEncoder(NewEncoderConfig()), os.Stdout, dynamicLevel),
		// json格式、输出文件、处定义等级规则
		zapcore.NewCore(zapcore.NewJSONEncoder(zap.NewDevelopmentEncoderConfig()), w, highPriority),
	)
	logger := zap.New(core, zap.AddCaller())
	defer logger.Sync()

	// 将当前日志等级设置为Debug
	// 注意日志等级低于设置的等级,日志文件也不分记录
	dynamicLevel.SetLevel(zap.DebugLevel)

	logger.Info("this is info.", zap.Int("ID", 1))
}

控制台

  • 2019-06-26 16:33:13.856 INFO stuzap/main.go:68 this is info. {“ID”: 1}

all.log

  • {“L”:“INFO”,“T”:“2019-06-26T16:33:13.856+0800”,“C”:“stuzap/main.go:68”,“M”:“this is info.”,“ID”:1}

参考

ZAP
lumberjack.v2
玩转高性能日志库zap (1)
玩转高性能日志库zap (2)
玩转高性能日志库zap (3)
go日志框架zap配置示例

OWASP ZAP是一个免费的开源Web应用程序安全扫描器,可以帮助您识别Web应用程序中的漏洞和安全问题。以下是OWASP ZAP使用教程的基本步骤: 1. 下载和安装OWASP ZAP 您可以从OWASP ZAP官方网站(https://www.zaproxy.org/download/)下载适合您操作系统的安装包,然后按照安装程序的指示进行安装。 2. 启动OWASP ZAP 完成安装后,运行OWASP ZAP应用程序。第一次启动时,您需要设置一个代理来拦截Web应用程序的流量。 3. 配置代理设置 在OWASP ZAP主界面中,选择“Tools > Options”菜单,选择“Local Proxy”选项卡,确保“Proxy Listening”选项已选中,并且“Port”选项设置为默认端口号“8080”。然后单击“Save”按钮保存更改。 4. 配置浏览器代理 在浏览器中,打开代理设置选项,并将代理服务器设置为“localhost”和端口号“8080”。这将使OWASP ZAP能够拦截浏览器的流量。 5. 启动扫描 在OWASP ZAP主界面中,选择“Quick Start”选项卡,输入要扫描的URL,并选择扫描类型。然后单击“Start Scan”按钮开始扫描。 6. 查看扫描结果 扫描完成后,OWASP ZAP将显示所有发现的漏洞和安全问题。您可以查看每个问题的详细信息,并采取必要的措施来修复它们。 7. 导出报告 如果需要,您可以导出扫描报告以供其他人查看。在OWASP ZAP主界面中,选择“Report”选项卡,选择要导出的报告类型,并单击“Generate Report”按钮生成报告。 以上是OWASP ZAP使用教程的基本步骤。请注意,这只是一个简单的指南,您还需要深入了解OWASP ZAP的功能和设置,以最大程度地利用它的强大功能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值