在 Go 语言中,将日志输出到文件有多种方式,从标准库到第三方库都可以实现。下面从简单到常用,给你几个典型方案。
log 输出到文件(最简单)package main
import (
"log"
"os"
)
func main() {
// 创建或打开日志文件
file, err := os.OpenFile(
"app.log",
os.O_CREATE|os.O_WRONLY|os.O_APPEND,
0666,
)
if err != nil {
log.Fatal(err)
}
defer file.Close()
// 设置日志输出到文件
log.SetOutput(file)
log.Println("这是一条日志信息")
log.Printf("带参数的日志: %d", 100)
}
✅ 特点
标准库本身不支持日志切割,但你可以通过:
io.Writerfunc logFile() *os.File {
filename := time.Now().Format("2006-01-02") + ".log"
file, _ := os.OpenFile(filename, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
return file
}
⚠️ 缺点:需要自己管理文件切换逻辑
logrus(最常用,推荐)go get github.com/sirupsen/logrus
package main
import (
"os"
log "github.com/sirupsen/logrus"
)
func main() {
file, err := os.OpenFile(
"app.log",
os.O_CREATE|os.O_WRONLY|os.O_APPEND,
0666,
)
if err != nil {
log.Fatal(err)
}
defer file.Close()
log.SetOutput(file)
log.SetFormatter(&log.TextFormatter{
FullTimestamp: true,
})
log.Info("info 日志")
log.Warn("warn 日志")
log.Error("error 日志")
}
✅ 优点
zap(高性能,生产推荐)go get go.uber.org/zap
package main
import (
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
"os"
)
func main() {
writeSyncer := zapcore.AddSync(os.Stdout)
file, _ := os.OpenFile("app.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
writeSyncer = zapcore.NewMultiWriteSyncer(
zapcore.AddSync(file),
zapcore.AddSync(os.Stdout),
)
encoder := zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig())
core := zapcore.NewCore(encoder, writeSyncer, zap.DebugLevel)
logger := zap.New(core)
logger.Info("zap 日志输出到文件")
}
✅ 优点
mw := io.MultiWriter(os.Stdout, logFile)
log.SetOutput(mw)
| 场景 | 推荐 |
|---|---|
| 简单脚本 | log |
| 一般服务 | logrus |
| 高性能 / 微服务 | zap |
| 需要日志切割 | lumberjack |
无论用哪种日志库,都建议配合:
go get gopkg.in/natefinch/lumberjack.v2
logger := &lumberjack.Logger{
Filename: "app.log",
MaxSize: 10, // MB
MaxBackups: 5,
MaxAge: 30, // days
Compress: true,
}
如果你愿意,我可以:
你现在用的是 标准库 / logrus / zap?