Go语言常用的打log方式详解
本文详细介绍了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日志配置优化的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









