Go语言常用的打log方式详解

温以宁
温以宁
发布时间:2026-10-15 | 6人浏览过
原创

本文详细介绍了Go语言中三种常用的日志记录实现方式:将日志写入缓存字节切片、写入本地文件,以及使用Beego框架获取分级日志功能。文章重点对比了Print、Fatal和Panic的行为差异,提供了完整的代码示例供参考。

日志行为差异与注意事项

在深入具体代码实现前,需明确Go标准库中三个核心方法的执行逻辑,这决定了程序的最终走向:

  • Print:仅输出日志信息,程序继续正常执行。
  • Fatal:先保存日志,随后调用os.Exit(1)终止程序运行。
  • Panic:先保存日志,随后触发panic(异常),若未recover则导致程序崩溃。

建议在实际测试时分开验证这三种情况,特别是在涉及文件写入或外部依赖时,观察程序的不同终止状态。

第一种方式:日志写入内存缓存

此方法适用于需要捕获日志内容并在后续进行自定义处理(如发送HTTP请求或存储到非文件系统介质)的场景。

第1步:初始化缓冲区与Logger实例

定义一个bytes.Buffer作为日志的输出目标,并传入前缀信息与标志位。

// 定义缓存变量
var buf bytes.Buffer
// 创建logger:指定写入对象、前缀字符串、标志位(长文件名)
logger := log.New(&buf, "logger: ", log.Llongfile)

// 打印测试信息
logger.Print("Hello, log file!")

// 查看缓冲区内容
fmt.Println(&buf)

此处参数对应关系为:第一个参数是io.Writer接口实现(即Buffer),第二个参数是每行日志前的固定前缀,第三个参数控制是否包含文件名和行号等元数据。

第二种方式:日志写入本地文件

将日志持久化到文件中是最常见的做法。标准库提供两种创建文件的方式:os.Create和os.OpenFile。

第1步:使用 os.Create 创建文件

适合新建日志文件,若文件已存在会被清空。注意处理创建过程中的错误。

fileName := "debug.log"
logFile, err := os.Create(fileName)
defer logFile.Close() // 确保函数结束关闭文件

if err != nil {
    log.Fatalln("open file error !")
}

// 使用文件句柄创建logger
debugLog := log.New(logFile, "", log.Llongfile)
debugLog.Print("找到一个低级bug,低级别的日志报告")
// debugLog.Fatal("发现一个严重bug") // 触发会终止程序

第2步:使用 os.OpenFile 追加日志

适合长期运行的服务,使用os.O_CREATE | os.O_WRONLY | os.O_APPEND模式,保证日志不会因重启而丢失历史数据。

package main

import (
    "os"
    "log"
)

func main() {
    // 打开文件,支持创建、只写、追加模式
    file, err := os.OpenFile("./testLog/test.log",
        os.O_CREATE|os.O_WRONLY|os.O_APPEND,
        os.ModePerm)
    if err != nil {
        log.Fatalln(err)
    }
    defer file.Close()

    // LstdFlags 包含日期和时间, Llongfile 包含完整文件名和行号
    logger := log.New(file, "", log.LstdFlags|log.Llongfile)
    logger.Println("日志1.")
    logger.Println("日志23")
}

路径选择上,既可以使用相对路径(工程根目录下),也可以使用绝对路径。若用相对路径,请确保当前工作目录正确。

第三种方式:使用 Beego Logs 多级别日志

Go原生log包仅有Print/Fatal/Panic三个层级,若需更细致的Debug、Info、Warn等多级别管理,可使用第三方成熟库如github.com/astaxie/beego/logs。

第1步:引入并配置 Beego Logs

通过logs.GetLogger()获取默认实例,或通过名称获取特定前缀的Logger(如ORM模块)。它支持7种以上的日志级别。

import (
    "github.com/astaxie/beego/logs"
)

// 获取默认日志实例
logInstance := logs.GetLogger()
logInstance.Println("this is a message of http")

// 获取带前缀的实例 (例如 ORM)
logs.GetLogger("ORM").Println("this is a message of orm")

// 各级别调用示例
logs.Debug("my book is bought in the year of ", 2016)
logs.Info("this %s cat is %v years old", "yellow", 3)
logs.Warn("json is a type of kv like", map[string]int{"key": 2016})
logs.Error(1024, "is a very", "good game")

// 高优先级日志
logs.Critical("oh,crash")
logs.Notice("fuck")
logs.Alert("alert")
logs.Emergency("emergency")

该方法不仅简化了不同级别的调用,还提供了更强大的格式化支持和扩展性,非常适合复杂项目的日志追踪。

总结

以上即为Go语言常用日志打点方式的详细内容,更多关于Go日志库选型、Beego日志配置优化的资料请关注本站其它相关文章!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表