在Ubuntu环境下配置Golang日志的第一步是选择合适的日志库,需根据项目规模、性能需求及功能复杂度决定:

log:适合小型项目或初学者,提供基础的Println、Printf等方法,支持设置输出前缀(如INFO:)和日志格式(时间、文件名),但功能有限(无日志级别、结构化输出)。caller、stacktrace),但API较底层。logrus-json)。以zap和logrus为例,通过go get安装:
go get -u go.uber.org/zap# 安装zapgo get github.com/sirupsen/logrus# 安装logrus日志级别用于过滤不必要的日志,常见级别:Debug(调试)、Info(信息)、Warn(警告)、Error(错误)。示例:
config := zap.NewProductionConfig()config.Level = zap.NewAtomicLevelAt(zap.InfoLevel) // 设置为Info级别logger, _ := config.Build()logrus.SetLevel(logrus.InfoLevel) // 设置为Info级别可将日志输出到控制台(开发环境)或文件(生产环境):
config.OutputPaths = []string{"stdout"} // 输出到标准输出file, _ := os.OpenFile("app.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)logrus.SetOutput(file) // 输出到文件结构化日志(如JSON)更易被监控工具解析,示例:
config.EncoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder // ISO8601时间格式config.EncoderConfig.EncodeLevel = zapcore.LowercaseLevelEncoder // 小写级别logger, _ := config.Build()logger.Info("User logged in", zap.String("username", "admin")) // 添加字段logrus.SetFormatter(&logrus.JSONFormatter{TimestampFormat: "2006-01-02 15:04:05",})logrus.WithFields(logrus.Fields{"username": "admin",}).Info("User logged in")防止日志文件过大,可使用Lumberjack库(与zap/logrus集成)或系统工具**logrotate`:
import "gopkg.in/natefinch/lumberjack.v2"writer := &lumberjack.Logger{Filename: "/var/log/myapp/app.log", // 日志文件路径MaxSize:100, // 单个文件最大100MBMaxBackups: 5, // 保留5个备份MaxAge: 30,// 保留30天Compress: true,// 压缩旧日志}core := zapcore.NewCore(zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig()),zapcore.AddSync(writer),zap.InfoLevel,)logger := zap.New(core)/etc/logrotate.d/myapp配置文件:/var/log/myapp/*.log {daily # 每天轮转rotate 7# 保留7天missingok # 文件不存在不报错notifempty# 文件为空不轮转compress# 压缩旧日志delaycompress # 延迟压缩(避免影响当前日志)postrotate# 轮转后执行命令(如重启应用)systemctl restart myapp.serviceendscript}避免日志写入阻塞主流程,可使用law库(适配zap/logrus/zerolog):
import "github.com/qiniu/logkit/law"func main() {logger := zap.NewExample() // 初始化zap loggerasyncLogger := law.NewAsync(logger, law.WithWorkerNum(5)) // 5个worker协程asyncLogger.Info("Async log message") // 异步写入}将Golang日志与监控工具集成,实现日志分析、报警:
zap或zerolog(高性能),启用结构化日志(JSON),配置日志轮转(避免磁盘爆满)。zap时,务必调用defer logger.Sync()(刷新缓冲区);logrus无需额外处理。