基本演示
var logger *zap.Logger
func main() {
initLogger()
// 在程序退出之前把缓冲区里的文件都刷到硬盘上
defer logger.Sync()
httpGet("https://www.baidu.com")
httpGet("https://www.google.com")
}
func initLogger() {
// 这里还可以New Develp环境的日志 只是输出格式不太一样
logger, _ = zap.NewProduction()
}
func httpGet(url string) {
resp, err := http.Get(url)
if err != nil {
logger.Error("Error fetching url..", zap.String("url", url), zap.Error(err))
} else {
logger.Info("Success..", zap.String("statusCode", resp.Status), zap.String("url", url))
resp.Body.Close()
}
}
定制Logger
var logger *zap.Logger
func main() {
initLogger()
// 在程序退出之前把缓冲区里的文件都刷到硬盘上
defer logger.Sync()
httpGet("https://www.baidu.com")
httpGet("https://www.google.com")
}
func initLogger() {
writeSync := getLogWriter()
encoder := getEncoder()
// 第三个参数 可以 指定从哪个级别开始输出日志
core := zapcore.NewCore(encoder, writeSync, zapcore.ErrorLevel)
logger = zap.New(core)
}
// 返回一个json编码的格式 一般情况下都用这个
func getEncoder() zapcore.Encoder {
return zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig())
}
// 就是将日志写到何处
func getLogWriter() zapcore.WriteSyncer {
// 这里我们每次都是重新打开文件,你也可以用open和append来追加文件,免的每次写入文件 都会覆盖掉之前的
file, _ := os.Create("./test.log")
return zapcore.AddSync(file)
}
func httpGet(url string) {
resp, err := http.Get(url)
if err != nil {
logger.Error("Error fetching url..", zap.String("url", url), zap.Error(err))
} else {
logger.Info("Success..", zap.String("statusCode", resp.Status), zap.String("url", url))
resp.Body.Close()
}
}
这里的ts 代表时间戳,但是这个时间戳可读性是在是太差,当然也可以修改这个配置的
// 返回一个json编码的格式 一般情况下都用这个
func getEncoder() zapcore.Encoder {
config := zap.NewProductionEncoderConfig()
config.EncodeTime = zapcore.ISO8601TimeEncoder
return zapcore.NewJSONEncoder(config)
}
我们甚至可以在日志中打印 是哪个方法 调用了日志所在的方法
只要修改如下的方法即可:
logger = zap.New(core,zap.AddCaller())
日志切割
如果一直向一个文件里面写入信息,文件会很快膨胀到xxx gb 这显然是无法忍受的,因此我们还需要日志切割归档功能
go get -u github.com/natefinch/lumberjack
func getLogWriterByJack() zapcore.WriteSyncer {
logger := &lumberjack.Logger{
Filename: "./test.log",
MaxSize: 10,// 单位是mb
MaxBackups: 5,// 备份数量 切割文件之前 会把文件做备份
MaxAge: 30, // 备份天数
Compress: false, //默认不压缩
}
return zapcore.AddSync(logger)
}
写个测试函数测试一下
for i := 0; i < 10000000; i++ {
//httpGet("https://www.baidu.com")
//httpGet("https://www.google.com")
logger.Info("i:")
}
在gin中 集成zap
这里类似的文章有很多 甚至也有人直接做好了类似的功能 github.com/gin-contrib…
有兴趣的可以体验下,很简单,就不再过多介绍了,有需要的话 大家记得取一下即可。
整体上来说 并不难,也就是实现对应的logger和recovery 而已,大家可以自行下载源码以后
稍微改动一下 然后来适配成自己的项目