Linux下Golang日志工具推荐
一、推荐清单与适用场景
二、快速上手示例
package main
import (
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
"gopkg.in/natefinch/lumberjack.v2"
)
func main() {
w := zapcore.AddSync(&lumberjack.Logger{
Filename: "app.log",
MaxSize: 10, // MB
MaxBackups: 3, // 保留旧文件个数
MaxAge: 28, // 天
Compress: true, // 是否压缩
})
cfg := zap.NewProductionEncoderConfig()
cfg.TimeKey = "ts"
cfg.EncodeTime = zapcore.ISO8601TimeEncoder
core := zapcore.NewCore(
zapcore.NewJSONEncoder(cfg),
w,
zap.InfoLevel,
)
logger := zap.New(core, zap.AddCaller(), zap.AddStacktrace(zapcore.ErrorLevel))
defer logger.Sync()
logger.Info("service started", zap.String("version", "1.2.3"))
logger.Error("something went wrong", zap.Error(fmt.Errorf("boom")))
}
package main
import (
"os"
"github.com/sirupsen/logrus"
)
func main() {
logger := logrus.New()
logger.SetOutput(os.Stdout) // 也可 SetOutput(file)
logger.SetFormatter(&logrus.JSONFormatter{
TimestampFormat: "2006-01-02 15:04:05",
})
logger.SetLevel(logrus.InfoLevel)
logger.WithFields(logrus.Fields{
"module": "auth",
"user": 123,
}).Info("login success")
}
package main
import (
"log"
"os"
)
func main() {
f, err := os.OpenFile("app.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
if err != nil { log.Fatal(err) }
defer f.Close()
log.SetOutput(f)
log.Println("hello, log")
}
三、选型建议
四、生产落地要点