使用zap记录日志, 使用lumberjack切割备份日志
为什么使用这个方案
- 性能好
- 详细的日志级别
- 记录函数调用, 代码行数
- 格式化时间
- 输出到文件
package main
import (
"github.com/natefinch/lumberjack"
"net/http"
"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++ {
go func () {
simpleHttpGet("www.google.com")
simpleHttpGet("http://www.google.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.NewConsoleEncoder(encoderConfig)
}
func getLogWriter() zapcore.WriteSyncer {
lumberJackLogger := &lumberjack.Logger{
Filename: "./test.log", // 日志路径
MaxSize: 1, // 达到多少Mb会切割
MaxBackups: 5, // 备份数量
MaxAge: 30, // 备份天数
Compress: false, // 是否压缩
}
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()
}
}