在 CentOS 上用 Golang 日志高效调试
一 日志输出与级别配置
// 标准库 log 示例
package main
import (
"log"
"os"
)
func main() {
f, err := os.OpenFile("/var/log/myapp.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0644)
if err != nil { log.Fatal(err) }
defer f.Close()
log.SetOutput(f)
log.SetFlags(log.Ldate | log.Ltime | log.Lshortfile)
log.Println("started")
}
// logrus 示例(JSON)
package main
import (
"github.com/sirupsen/logrus"
"os"
)
func main() {
logger := logrus.New()
logger.SetLevel(logrus.InfoLevel)
logger.SetFormatter(&logrus.JSONFormatter{})
logger.SetOutput(os.Stdout) // 生产可改为文件
logger.WithFields(logrus.Fields{"svc": "myapp"}).Info("started")
}
// zap 示例(结构化、生产友好)
package main
import (
"go.uber.org/zap"
"go.uber.org/zap/zapcore"
)
func main() {
cfg := zap.NewProductionConfig()
cfg.Encoding = "json"
cfg.EncoderConfig.TimeKey = "ts"
cfg.EncoderConfig.LevelKey = "level"
cfg.EncoderConfig.MessageKey = "msg"
cfg.OutputPaths = []string{"stdout"} // 生产可写 /var/log/myapp.log
cfg.ErrorOutputPaths = []string{"stderr"}
logger, _ := cfg.Build()
defer logger.Sync()
logger.Info("started")
}
二 运行与实时查看
三 日志轮转与保留策略
# /etc/logrotate.d/myapp 示例
/var/log/myapp.log {
daily
rotate 7
compress
missingok
notifempty
create 0644 root root
}
# 手动触发一次轮转(测试用)
sudo logrotate -f /etc/logrotate.d/myapp
四 集中化与可视化分析
五 进阶调试与性能定位