输出到文件
package main
import (
"log"
"os"
)
func main() {
logFile, err := os.OpenFile("/var/log/myapp.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
if err != nil {
log.Fatal(err)
}
defer logFile.Close()
log.SetOutput(logFile) // 设置输出目标
log.SetPrefix("[INFO] ") // 日志前缀
log.SetFlags(log.Ldate | log.Ltime | log.Lshortfile) // 日期、时间、文件名
log.Println("这是一条普通日志")
}
os.OpenFile
指定日志文件路径,SetOutput
定向输出,支持控制台或文件。日志轮转(防止文件过大)
使用第三方库lumberjack
:
import "gopkg.in/natefinch/lumberjack.v2"
log.SetOutput(&lumberjack.Logger{
Filename: "/var/log/myapp.log",
MaxSize: 10, // 单个文件最大10MB
MaxBackups: 5, // 保留5个旧文件
MaxAge: 30, // 保留30天
Compress: true, // 压缩旧文件
})
go get github.com/sirupsen/logrus
package main
import (
"github.com/sirupsen/logrus"
"os"
)
func main() {
logger := logrus.New()
logger.SetLevel(logrus.InfoLevel) // 日志级别(Debug/Info/Warn/Error)
logger.SetFormatter(&logrus.JSONFormatter{}) // 输出JSON格式
file, _ := os.OpenFile("/var/log/myapp.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
logger.Out = file
logger.WithFields(logrus.Fields{"key": "value"}).Info("带字段的日志")
}
go get go.uber.org/zap
package main
import (
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
)
func main() {
config := zap.NewProductionConfig()
config.OutputPaths = []string{"/var/log/myapp.log"} // 输出路径
logger, _ := config.Build()
defer logger.Sync()
logger.Info("高性能日志记录", zap.String("key", "value"))
}
rsyslog集中管理
/etc/rsyslog.conf
,添加规则:*.* /var/log/golang.log
systemctl restart rsyslog
os.OpenFile
将日志输出到指定路径,由rsyslog统一管理。logrotate定时轮转
/etc/logrotate.d/myapp
:/var/log/myapp.log {
daily
rotate 7
compress
missingok
notifempty
}
logrotate -f /etc/logrotate.d/myapp
。logrus
或zap
的Debug
级别,输出详细日志到文件。zap
(高性能),普通服务用logrus
(易扩展)。logrotate
和rsyslog
实现日志的集中存储与分析。zap
的zapcore.Redact
或logrus
的Mask
功能脱敏。