golang分级执行日志记录插件库glog的使用

golang分级执行日志记录插件库glog的使用

glog是一个高效的Go语言分级日志记录库,它实现了类似Google内部C++ INFO/ERROR/V日志系统的功能。

基本功能

glog提供了以下日志级别函数:

  • Info
  • Warning
  • Error
  • Fatal 以及对应的格式化版本(如Infof、Errorf等)

基本示例

package main

import (
	"flag"
	"github.com/golang/glog"
)

func main() {
	// 必须调用flag.Parse()来解析命令行参数
	flag.Parse()
	defer glog.Flush() // 确保在程序退出前刷新所有日志

	// 基本日志记录
	glog.Info("Prepare to repel boarders")
	glog.Warning("This is a warning message")
	glog.Error("This is an error message")
	
	// 格式化日志
	err := "example error"
	glog.Fatalf("Initialization failed: %s", err) // Fatal会调用os.Exit(1)
}

V级别日志

glog提供了V级别的日志记录,可以通过-v和-vmodule=file=2标志进行精细控制:

package main

import (
	"flag"
	"github.com/golang/glog"
)

func main() {
	flag.Parse()
	defer glog.Flush()

	// V级别日志示例
	if glog.V(2) {
		glog.Info("Starting transaction...") // 只有当-v=2或更高时才会记录
	}
	
	// 另一种写法
	glog.V(2).Infoln("Processed", 100, "elements")
}

命令行参数

glog支持以下命令行参数来控制日志行为:

  • -log_dir: 日志文件目录
  • -v: 设置V日志级别
  • -vmodule: 按文件设置V日志级别

完整示例

package main

import (
	"flag"
	"github.com/golang/glog"
)

func init() {
	// 设置日志目录(可选)
	flag.Set("log_dir", "./logs")
}

func processItems(n int) {
	glog.V(2).Info("Processing items...")
	for i := 0; i < n; i++ {
		glog.V(3).Infof("Processing item %d", i)
	}
	glog.V(2).Infof("Processed %d items", n)
}

func main() {
	flag.Parse()
	defer glog.Flush()

	glog.Info("Application starting")
	glog.Warning("This is a sample warning")
	
	// 记录不同级别的日志
	glog.V(1).Info("Verbose level 1")
	glog.V(2).Info("Verbose level 2")
	glog.V(3).Info("Verbose level 3")
	
	processItems(5)
	
	glog.Error("Sample error occurred")
	glog.Info("Application exiting")
}

注意事项

  1. 必须调用flag.Parse()来解析命令行参数
  2. 建议使用defer glog.Flush()确保日志被正确写入
  3. 日志文件默认会按日期和进程ID自动轮转
  4. Fatal级别的日志会调用os.Exit(1)

glog是Google内部使用的日志包的开放源代码版本,功能稳定但不再添加新特性。如需报告问题,可以发送邮件至golang-nuts@googlegroups.com。


更多关于golang分级执行日志记录插件库glog的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang分级执行日志记录插件库glog的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


glog 分级执行日志记录插件库使用指南

glog 是 Google 开发的一个分级日志记录库,提供了不同级别的日志记录功能,适合在 Golang 项目中使用。下面详细介绍 glog 的使用方法。

安装 glog

首先需要安装 glog 库:

go get github.com/golang/glog

基本使用方法

package main

import (
	"flag"
	"github.com/golang/glog"
)

func main() {
	// 必须调用 flag.Parse() 来解析命令行参数
	flag.Parse()
	defer glog.Flush() // 确保在程序退出前刷新所有日志

	glog.Info("这是一条普通信息日志")
	glog.Infof("这是一条带格式的信息日志: %s", "format example")
	
	glog.Warning("这是一条警告日志")
	glog.Warningf("这是一条带格式的警告日志: %d", 404)
	
	glog.Error("这是一条错误日志")
	glog.Errorf("这是一条带格式的错误日志: %v", "something wrong")
	
	glog.V(1).Info("这是一条详细级别1的日志")
	glog.V(2).Infof("这是一条详细级别2的带格式日志: %t", true)
	
	// 致命日志会调用 os.Exit(1)
	// glog.Fatal("这是一条致命错误日志")
	// glog.Fatalf("这是一条带格式的致命错误日志: %f", 3.14)
}

日志级别

glog 提供了以下几种日志级别:

  1. Info - 普通信息日志
  2. Warning - 警告日志
  3. Error - 错误日志
  4. Fatal - 致命错误日志(会终止程序)
  5. V(level) - 详细级别日志(可自定义级别)

命令行参数

glog 提供了一些命令行参数来控制日志行为:

  • -log_dir - 指定日志文件目录(默认为空,输出到标准错误)
  • -alsologtostderr - 同时输出日志到标准错误和文件
  • -stderrthreshold - 设置输出到标准错误的日志级别(INFO/WARNING/ERROR/FATAL)
  • -v - 设置 V 日志的级别
  • -vmodule - 按模块设置 V 日志级别

示例运行命令:

go run main.go -log_dir=./logs -alsologtostderr -v=2

高级用法

按模块设置日志级别

package main

import (
	"flag"
	"github.com/golang/glog"
)

func module1() {
	glog.V(1).Info("Module 1 - V1")
	glog.V(2).Info("Module 1 - V2")
}

func module2() {
	glog.V(1).Info("Module 2 - V1")
	glog.V(2).Info("Module 2 - V2")
}

func main() {
	flag.Parse()
	defer glog.Flush()
	
	// 运行时可使用 -vmodule=module1=2,module2=1 来设置不同模块的日志级别
	module1()
	module2()
}

自定义日志格式

package main

import (
	"flag"
	"fmt"
	"github.com/golang/glog"
	"time"
)

type customLogger struct{}

func (l *customLogger) Write(data []byte) (n int, err error) {
	// 自定义日志格式
	msg := fmt.Sprintf("[%s] %s", time.Now().Format("2006-01-02 15:04:05"), string(data))
	return glog.InfoDepth(1, msg)
}

func main() {
	flag.Parse()
	defer glog.Flush()
	
	// 设置自定义日志输出
	glog.SetOutput(&customLogger{})
	glog.Info("这条日志将使用自定义格式")
}

最佳实践

  1. 始终调用 flag.Parse() - 必须在 main 函数开始时调用 flag.Parse()
  2. 使用 defer glog.Flush() - 确保程序退出前所有日志都被刷新
  3. 合理使用日志级别 - 不要滥用高日志级别
  4. 生产环境配置 - 在生产环境中配置 -log_dir 将日志输出到文件
  5. 避免频繁的 V 日志 - 高频率的详细日志可能影响性能

与标准库 log 的对比

  1. 分级日志 - glog 提供多级别日志,标准库 log 只有单一级别
  2. 文件输出 - glog 支持自动日志文件分割和滚动
  3. 性能优化 - glog 在日志量大的情况下性能更好
  4. 线程安全 - glog 是线程安全的,适合并发环境

glog 是一个功能强大且高效的日志库,特别适合大型项目或需要精细控制日志级别的场景。

回到顶部