golang简单高效的层级日志记录插件库glg的使用

Golang简单高效的层级日志记录插件库glg的使用

glg是一个简单高效的Golang日志库,支持多级别日志记录、自定义日志级别、文件输出、网络日志等功能。

安装

go get github.com/kpango/glg

基本使用示例

package main

import (
	"github.com/kpango/glg"
)

func main() {
	// 基本日志记录
	glg.Info("info")
	glg.Infof("%s : %s", "info", "formatted")
	glg.Log("log")
	glg.Logf("%s : %s", "info", "formatted")
	glg.Debug("debug")
	glg.Debugf("%s : %s", "info", "formatted")
	glg.Warn("warn")
	glg.Warnf("%s : %s", "info", "formatted")
	glg.Error("error")
	glg.Errorf("%s : %s", "info", "formatted")
	glg.Success("ok")
	glg.Successf("%s : %s", "info", "formatted")
	glg.Fail("fail")
	glg.Failf("%s : %s", "info", "formatted")
	glg.Print("Print")
	glg.Println("Println")
	glg.Printf("%s : %s", "printf", "formatted")
}

高级功能示例

1. 设置日志级别

func main() {
	// 设置全局日志级别为ERR
	glg.Info("before setting level to ERR this message will show")
	glg.Get().SetLevel(glg.ERR)
	glg.Info("after setting level to ERR this message will not show")
	glg.Error("this log is ERR level this will show")
	glg.Get().SetLevel(glg.DEBG)
	glg.Info("log level is now DEBG, this INFO level log will show")
}

2. 文件日志输出

func main() {
	// 创建文件写入器
	infolog := glg.FileWriter("/tmp/info.log", 0666)
	errlog := glg.FileWriter("/tmp/error.log", 0666)
	defer infolog.Close()
	defer errlog.Close()

	// 配置日志输出到文件
	glg.Get().
		SetMode(glg.BOTH). // 同时输出到控制台和文件
		AddLevelWriter(glg.INFO, infolog). // INFO级别日志写入info.log
		AddLevelWriter(glg.ERR, errlog)    // ERR级别日志写入error.log

	glg.Info("This will be written to info.log")
	glg.Error("This will be written to error.log")
}

3. 自定义日志级别

func main() {
	customTag := "FINE"
	customErrTag := "CRIT"

	glg.Get().
		AddStdLevel(customTag, glg.STD, false).                    // 添加自定义日志级别
		AddErrLevel(customErrTag, glg.STD, true).                  // 添加自定义错误级别
		SetLevelColor(glg.TagStringToLevel(customTag), glg.Cyan).  // 设置自定义级别颜色
		SetLevelColor(glg.TagStringToLevel(customErrTag), glg.Red) // 设置自定义错误级别颜色

	glg.CustomLog(customTag, "custom logging")
	glg.CustomLog(customErrTag, "custom error logging")
}

4. 时间戳控制

func main() {
	glg.Get().DisableTimestamp()
	glg.Info("timestamp disabled")
	glg.Warn("timestamp disabled")
	glg.Log("timestamp disabled")
	glg.Get().EnableTimestamp()
	glg.Info("timestamp enabled")
	glg.Warn("timestamp enabled")
	glg.Log("timestamp enabled")
}

5. 行号追踪

func main() {
	glg.Info("error log shows none trace by default")
	glg.Get().SetLineTraceMode(glg.TraceLineShort)
	glg.Error("after configure TraceLineShort, error log shows short line trace")
	glg.Info("after configure TraceLineShort, info log shows short line trace")
	glg.Get().SetLineTraceMode(glg.TraceLineLong)
	glg.Error("after configure TraceLineLong, error log shows long line trace")
	glg.Info("after configure TraceLineLong, info log shows long line trace")
	glg.Get().SetLineTraceMode(glg.TraceLineNone)
	glg.Error("after configure TraceLineNone, error log without line trace")
	glg.Info("after configure TraceLineNone, info log without line trace")
}

6. JSON格式日志

func main() {
	glg.Get().EnableJSON()
	err := glg.Warn("kpango's glg", "support", "json", "logging")
	if err != nil {
		glg.Get().DisableJSON()
		glg.Error(err)
		glg.Get().EnableJSON()
	}
	
	err = glg.Info("hello", struct {
		Name   string
		Age    int
		Gender string
	}{
		Name:   "kpango",
		Age:    28,
		Gender: "male",
	}, 2020)
	if err != nil {
		glg.Get().DisableJSON()
		glg.Error(err)
		glg.Get().EnableJSON()
	}
}

7. 网络日志

// NetWorkLogger 网络日志示例
type NetWorkLogger struct{}

func (n NetWorkLogger) Write(b []byte) (int, error) {
	http.Get("http://127.0.0.1:8080/log")
	glg.Success("Requested")
	glg.Infof("RawString is %s", glg.RawString(b))
	return 1, nil
}

func main() {
	glg.Get().AddLevelWriter(glg.DEBG, NetWorkLogger{}) // 添加网络日志目标
}

8. HTTP日志处理器

func main() {
	http.Handle("/glg", glg.HTTPLoggerFunc("glg sample", func(w http.ResponseWriter, r *http.Request) {
		glg.New().
			AddLevelWriter(glg.Info, NetWorkLogger{}).
			AddLevelWriter(glg.Info, w).
			Info("glg HTTP server logger sample")
	}))

	http.ListenAndServe(":8080", nil)
}

日志模式设置

glg支持多种日志输出模式:

glg.Get().
	SetMode(glg.BOTH). // 同时输出到控制台和文件(默认是STD)
	// SetMode(glg.NONE).  // 不输出
	// SetMode(glg.WRITER). // 只输出到writer
	// SetMode(glg.BOTH).  // 同时输出到控制台和writer

glg是一个功能强大但使用简单的日志库,适合各种规模的Golang项目使用。它支持多种日志级别、自定义格式、文件输出等常见日志功能,同时保持了高性能和低内存占用。


更多关于golang简单高效的层级日志记录插件库glg的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang简单高效的层级日志记录插件库glg的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


glg - Go语言简单高效的层级日志库

glg是一个轻量级、高性能的Go语言日志库,支持多级别日志记录和灵活的配置选项。下面我将详细介绍glg的使用方法。

安装glg

go get github.com/kpango/glg

基本使用

1. 简单日志记录

package main

import (
	"github.com/kpango/glg"
)

func main() {
	glg.Info("这是一条info日志")
	glg.Warn("这是一条warn日志")
	glg.Error("这是一条error日志")
	glg.Debug("这是一条debug日志")
	glg.Print("这是一条普通日志")
}

2. 日志级别设置

glg支持以下日志级别(从低到高):

  • TRACE
  • DEBUG
  • INFO
  • WARN
  • ERROR
  • FATAL
func main() {
	// 设置日志级别为WARN,低于WARN的日志将不会被记录
	glg.Get().SetLevel(glg.WARN)
	
	glg.Info("这条日志不会被记录")  // 低于WARN级别
	glg.Warn("这是一条warn日志")  // 会被记录
	glg.Error("这是一条error日志") // 会被记录
}

3. 自定义日志格式

func main() {
	// 设置自定义日志格式
	glg.Get().
		SetMode(glg.BOTH).              // 同时输出到控制台和文件
		SetLevel(glg.INFO).             // 设置日志级别
		AddLevelWriter(glg.INFO, glg.FileWriter("/tmp/info.log", 0666)). // INFO级别写入文件
		AddLevelWriter(glg.ERROR, glg.FileWriter("/tmp/error.log", 0666)) // ERROR级别写入文件
	
	glg.Info("自定义格式的info日志")
	glg.Error("自定义格式的error日志")
}

4. 颜色输出

func main() {
	// 启用控制台颜色输出
	glg.Get().
		SetMode(glg.STD).
		EnableColor()
	
	glg.Info("带颜色的info日志")
	glg.Warn("带颜色的warn日志")
	glg.Error("带颜色的error日志")
}

5. 多级别日志处理器

func main() {
	// 为不同级别设置不同的处理方式
	glg.Get().
		AddStdLevel(glg.DEBUG, glg.STD, true).  // DEBUG级别输出到控制台
		AddStdLevel(glg.INFO, glg.STD, true).   // INFO级别输出到控制台
		AddFileLevel(glg.ERROR, "/tmp/error.log"). // ERROR级别写入文件
		AddFileLevel(glg.FATAL, "/tmp/fatal.log")  // FATAL级别写入文件
	
	glg.Debug("调试信息")
	glg.Info("普通信息")
	glg.Error("错误信息")
	glg.Fatal("致命错误")
}

6. 结构化日志

func main() {
	// 记录结构化数据
	data := struct {
		Name string
		Age  int
	}{
		Name: "张三",
		Age:  30,
	}
	
	glg.Info("用户信息:", data)
	
	// 或者使用JSON格式
	glg.Info("用户信息JSON:", glg.JSON(data))
}

7. 自定义前缀

func main() {
	// 设置自定义前缀
	logger := glg.New().
		SetPrefix("[MYAPP]").
		SetLevel(glg.INFO)
	
	logger.Info("带自定义前缀的日志")
}

高级功能

1. 自定义日志处理器

func main() {
	// 自定义日志处理器
	customHandler := func(log string) {
		// 这里可以实现发送到远程服务器、写入数据库等操作
		fmt.Println("自定义处理:", log)
	}
	
	glg.Get().AddLevelHandler(glg.INFO, customHandler)
	glg.Info("这条日志会被自定义处理器处理")
}

2. 并发安全

glg默认是并发安全的,可以在goroutine中安全使用:

func main() {
	for i := 0; i < 10; i++ {
		go func(n int) {
			glg.Infof("这是来自goroutine %d的日志", n)
		}(i)
	}
	
	time.Sleep(time.Second) // 等待所有goroutine完成
}

3. 性能优化

glg在设计上考虑了性能,但如果你需要更高性能,可以:

func main() {
	// 禁用调用者信息(提升性能)
	glg.Get().DisableCaller()
	
	// 使用缓冲写入器
	file, _ := os.OpenFile("/tmp/buffered.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
	buffered := bufio.NewWriter(file)
	glg.Get().AddLevelWriter(glg.INFO, buffered)
	
	// 大量日志记录
	for i := 0; i < 10000; i++ {
		glg.Info("高性能日志记录:", i)
	}
	
	// 确保缓冲区内容写入文件
	buffered.Flush()
	file.Close()
}

总结

glg是一个功能丰富但又保持简洁的Go日志库,主要特点包括:

  • 多级别日志支持
  • 灵活的配置选项
  • 支持控制台和文件输出
  • 颜色输出支持
  • 结构化日志记录
  • 高性能设计
  • 并发安全

对于大多数Go项目来说,glg提供了足够的日志功能,同时又不会引入过多复杂性,是一个很好的选择。

回到顶部