温馨提示×

Golang日志如何输出到文件

小樊
47
2026-07-13 00:25:07
栏目: 编程语言

在 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)
}

✅ 特点

  • 简单、无依赖
  • 无日志级别(info / error 等)
  • 适合小型项目或简单需求

二、按日期或大小切割日志(标准库进阶)

标准库本身不支持日志切割,但你可以通过:

  • 定时切换文件
  • 自己实现 io.Writer

示例(按天切换文件)

func 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

0