全部学科
Python全栈
python
NodeJS全栈
nodejs
小程序首页
📅 2026-05-14 5 分钟 ✍️ juanwangdev

Go log包

Go标准库log提供基本的日志记录功能。

基本日志函数

log.Print

Go
import "log"

// 基本输出
log.Print("hello")
// 输出:2026/05/14 10:30:45 hello

log.Println("hello", "world")
// 输出:2026/05/14 10:30:45 hello world

// 带格式
log.Printf("Name: %s, Age: %d", "Tom", 25)
// 输出:2026/05/14 10:30:45 Name: Tom, Age: 25

默认输出到标准错误,带时间戳。

log.Fatal

Go
// 输出日志并退出进程
log.Fatal("critical error")
// 输出:2026/05/14 10:30:45 critical error
// 然后调用os.Exit(1)

// Fatal不执行defer语句

log.Panic

Go
// 输出日志并panic
log.Panic("panic error")
// 输出日志后调用panic()

// Panic可被recover捕获
defer func() {
    if r := recover(); r != nil {
        fmt.Println("Recovered:", r)
    }
}()
log.Panic("error")

Print系列对比

函数行为示例
Print输出日志log.Print(msg)
Println输出+换行log.Println(msg)
Printf格式化输出log.Printf("%d", n)
Fatal输出+退出log.Fatal(err)
Fatalln输出+换行+退出log.Fatalln(err)
Fatalf格式化+退出log.Fatalf("%s", err)
Panic输出+paniclog.Panic(err)
Panicln输出+换行+paniclog.Panicln(err)
Panicf格式化+paniclog.Panicf("%s", err)

自定义Logger

log.New创建Logger

Go
// 创建自定义Logger
var logger = log.New(os.Stdout, "INFO: ", log.LstdFlags)

logger.Println("message")
// 输出:INFO: 2026/05/14 10:30:45 message

// 参数:输出目标,前缀,标志

输出到文件

Go
// 日志写入文件
file, _ := os.OpenFile("app.log", os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644)
defer file.Close()

logger := log.New(file, "APP: ", log.LstdFlags)
logger.Println("application started")

生产环境推荐日志写入文件。

Logger方法

SetPrefix

Go
logger := log.New(os.Stdout, "", log.LstdFlags)

// 设置前缀
logger.SetPrefix("ERROR: ")
logger.Println("something wrong")
// 输出:ERROR: 2026/05/14 10:30:45 something wrong

SetOutput

Go
logger := log.New(os.Stdout, "", log.LstdFlags)

// 更改输出目标
file, _ := os.OpenFile("log.txt", os.O_CREATE|os.O_APPEND, 0644)
logger.SetOutput(file)

SetFlags

Go
// 设置日志标志
logger.SetFlags(log.LstdFlags | log.Lshortfile)

logger.Println("message")
// 输出:2026/05/14 10:30:45 main.go:42: message

日志标志

标志常量

Go
const (
    Ldate         = 1 << iota  // 日期:2026/05/14
    Ltime                       // 时间:10:30:45
    Lmicroseconds               // 微秒:10:30:45.123456
    Llongfile                   // 文件路径:/a/b/c/main.go:42
    Lshortfile                  // 文件名:main.go:42
    LUTC                        // UTC时间
    Lmsgprefix                  // 前缀在消息前
    LstdFlags   = Ldate | Ltime // 标准格式
)

组合使用

Go
// 多个标志组合
logger := log.New(os.Stdout, "APP: ", log.Ldate|log.Ltime|log.Lshortfile)

logger.Println("message")
// 输出:APP: 2026/05/14 10:30:45 main.go:42: message

标志效果表

标志输出示例
Ldate2026/05/14
Ltime10:30:45
Lmicroseconds10:30:45.123456
Llongfile/path/to/main.go:42
Lshortfilemain.go:42
LstdFlags2026/05/14 10:30:45

全局Logger配置

log.SetOutput

Go
// 设置全局Logger输出
file, _ := os.OpenFile("app.log", os.O_APPEND|os.O_CREATE, 0644)
log.SetOutput(file)

log.Println("global log")

log.SetPrefix

Go
// 设置全局前缀
log.SetPrefix("MAIN: ")
log.Println("message")
// 输出:MAIN: 2026/05/14 10:30:45 message

log.SetFlags

Go
// 设置全局标志
log.SetFlags(log.LstdFlags | log.Lshortfile)

日志示例

分级日志

Go
// 不同级别Logger
var (
    infoLog  = log.New(os.Stdout, "INFO: ", log.LstdFlags)
    warnLog  = log.New(os.Stdout, "WARN: ", log.LstdFlags)
    errorLog = log.New(os.Stderr, "ERROR: ", log.LstdFlags|log.Lshortfile)
)

func main() {
    infoLog.Println("application started")
    warnLog.Println("config missing, using defaults")
    errorLog.Println("database connection failed")
}

日志轮转示例

Go
// 每日新文件
func dailyLogFile() *os.File {
    date := time.Now().Format("2006-01-02")
    name := fmt.Sprintf("app-%s.log", date)
    file, _ := os.OpenFile(name, os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0644)
    return file
}

logger := log.New(dailyLogFile(), "APP: ", log.LstdFlags)

log.Logger方法

方法用途示例
Print输出日志logger.Print(msg)
Printf格式化输出logger.Printf("%d", n)
Println输出+换行logger.Println(msg)
Fatal输出+退出logger.Fatal(err)
Panic输出+paniclogger.Panic(err)
SetPrefix设置前缀logger.SetPrefix("APP")
SetOutput设置输出logger.SetOutput(file)
SetFlags设置标志logger.SetFlags(log.Ldate)

注意事项

Go
// 1. log不提供日志级别过滤
// 推荐使用第三方库如logrus、zap

// 2. Fatal不执行defer
func main() {
    defer fmt.Println("cleanup")  // 不执行
    log.Fatal("error")
}

// 3. 默认输出到stderr
// 适合错误日志,非正常输出

// 4. 单线程安全
// Logger并发写入安全

要点总结

  • Print/Println/Printf输出日志
  • Fatal输出后调用os.Exit(1)
  • Panic输出后调用panic()
  • log.New创建自定义Logger
  • SetPrefix设置日志前缀
  • SetOutput更改输出目标
  • SetFlags设置时间格式
  • LstdFlags是默认格式
  • Lshortfile显示文件名和行号
  • 输出到文件用OpenFile
  • log包适合简单日志需求
  • 生产推荐第三方日志库

📝 发现内容有误?点击此处直接编辑

← 上一篇 Go io包
下一篇 → Go net包
想查看更多题目和详细解析?
小程序提供完整的题库、模拟考试和详细解析
马上就来

长按或扫描二维码,立即体验

扫码体验小程序
马上就来
使用微信扫描二维码
立即体验完整题库