版权声明 本站原创文章 由 萌叔 发表 转载请注明 萌叔 | http://vearne.cc 前言 uber开源的高性能日志库zap, 除了性能远超logrus之外,还有很多诱人的功能,比如支持日志采样、支持通过HTTP服务动态调整日志级别。本文简单聊一下日志采样。 使用说明 Sampling:Sampling实现了日志的流控功能,或者叫采样配置,主要有两个配置参数,Initial和Thereafter,实现的效果是在1s的时间单位内,如果某个日志级别下同样内容的日志输出数量超过了Initial的数量,那么超过之后,每隔Thereafter的数量,才会再输出一次。是一个对日志输出的保护功能。 注意 这里画个重点 仅对”同样内容” 的日志做采样 默认1s的时间单位内 示例 package main import ( “go.uber.org/zap” ) func main() { config := zap.NewProductionConfig() // 默认值:Initial:100 Thereafter:100 config.Sampling = &zap.SamplingConfig{ Initial: 5, // 从第6条数据开始 Thereafter: 3, // 每3条打印一条 } // 可以置为nil 来关闭采样… 继续阅读 玩转高性能日志库ZAP (6)-采样

版权声明 本站原创文章 由 萌叔 发表 转载请注明 萌叔 | http://vearne.cc 1. 前言 在复杂的业务逻辑中,一个请求就有可能带来10 ~ 30条日志的写入。打日志造成的开销很大,是无法被忽略的一环。怎样才能提高日志的写入速度? 2. 实验 首先来看几个实验 完整程序见 vearne/golab/zaplog 中的log.go log2.go log3.go 2.1 打印到文件 打印到指定文件中,并做归档 package zaplog import ( “go.uber.org/zap” “go.uber.org/zap/zapcore” “gopkg.in/natefinch/lumberjack.v2” ) func InitLogger() *zap.Logger { // 动态调整日志级别 alevel := zap.NewAtomicLevel() hook := lumberjack.Logger{ Filename: “/tmp/tt1.log”, MaxSize: 1024, //… 继续阅读 玩转高性能日志库ZAP(5)-异步写日志

版权声明 本站原创文章 由 萌叔 发表 转载请注明 萌叔 | http://vearne.cc 引言 前几天有朋友问我,zap库是否支持同时打印到多个目标地址,比如1份打印到文件,1份到控制台,1份打印到kafka中。这是所有日志库都会支持的功能,zap当然也不例外。 示例 package main import ( “io/ioutil” “go.uber.org/zap” “go.uber.org/zap/zapcore” “gopkg.in/natefinch/lumberjack” “os” ) func main(){ // First, define our level-handling logic. // 仅打印Error级别以上的日志 highPriority := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool { return lvl >= zapcore.ErrorLevel }) // 打印所有级别的日志 lowPriority := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool… 继续阅读 玩转高性能日志库ZAP(3)

版权声明 本站原创文章 由 萌叔 发表 转载请注明 萌叔 | http://vearne.cc 前言 uber开源的高性能日志库zap, 除了性能远超logrus之外,还有很多诱人的功能,比如支持日志采样、支持通过HTTP服务动态调整日志级别。不过他原生不支持文件归档,如果要支持文件按大小或者时间归档,必须要使用第三方库, 根据官方资料参考资料1,官方推荐的是 natefinch/lumberjack 示例 package main import ( “go.uber.org/zap” “go.uber.org/zap/zapcore” “gopkg.in/natefinch/lumberjack.v2” ) // logpath 日志文件路径 // loglevel 日志级别 func initLogger(logpath string, loglevel string) *zap.Logger { hook := lumberjack.Logger{ Filename: logpath, // 日志文件路径 MaxSize: 1024, // megabytes MaxBackups: 3, //… 继续阅读 玩转高性能日志库ZAP (2)

版权声明 本站原创文章 由 萌叔 发表 转载请注明 萌叔 | http://vearne.cc 前言 uber开源的高性能日志库zap, 除了性能远超logrus之外,还有很多诱人的功能,比如支持数据采样、支持通过HTTP服务动态调整日志级别 参考资料1虽然提到了可以通过HTTP服务动态调整日志级别,但是没有给出可用的代码实现,这里给出一个样例。 动态调整日志级别 非常简单直接上代码 package main import ( “fmt” “go.uber.org/zap” “net/http” “time” ) func main() { alevel := zap.NewAtomicLevel() http.HandleFunc(“/handle/level”, alevel.ServeHTTP) go func() { if err := http.ListenAndServe(“:9090”, nil); err != nil { panic(err) } }() // 默认是Info级别 logcfg… 继续阅读 玩转高性能日志库zap (1)