golang扩展标准日志功能的增强日志工具插件库logutils的使用

golang扩展标准日志功能的增强日志工具插件库logutils的使用

logutils 是一个 Go 语言包,它增强了标准库中的 “log” 包,使日志记录更加现代化,同时避免了因引入新的日志包而导致 Go 生态系统碎片化的问题。

最简单的实现方式

假设你的应用已经在使用默认的 log 包。要切换到 logutils,你的代码应该如下所示:

package main

import (
	"log"
	"os"

	"github.com/hashicorp/logutils"
)

func main() {
	// 创建日志级别过滤器
	filter := &logutils.LevelFilter{
		Levels:   []logutils.LogLevel{"DEBUG", "WARN", "ERROR"}, // 定义支持的日志级别
		MinLevel: logutils.LogLevel("WARN"),                     // 设置最低日志级别为WARN
		Writer:   os.Stderr,                                    // 输出到标准错误
	}
	log.SetOutput(filter) // 设置日志输出为过滤器

	log.Print("[DEBUG] Debugging")              // 这条不会打印,因为级别低于WARN
	log.Print("[WARN] Warning")                 // 这条会打印
	log.Print("[ERROR] Erring")                 // 这条也会打印
	log.Print("Message I haven't updated")      // 这条也会打印,因为没有级别前缀
}

这段代码会像 Go 的标准日志记录器一样输出到标准错误。任何你还没有转换为带级别的日志消息将像以前一样继续打印。

更完整的示例

下面是一个更完整的示例,展示了如何设置不同日志级别和使用颜色输出:

package main

import (
	"log"
	"os"

	"github.com/hashicorp/logutils"
)

func main() {
	// 初始化日志过滤器
	filter := &logutils.LevelFilter{
		Levels:   []logutils.LogLevel{"TRACE", "DEBUG", "INFO", "WARN", "ERROR"},
		MinLevel: logutils.LogLevel("INFO"), // 只记录INFO及以上级别的日志
		Writer:   os.Stderr,
	}

	// 设置日志输出
	log.SetOutput(filter)

	// 记录不同级别的日志
	log.Print("[TRACE] Trace message")    // 不会打印
	log.Print("[DEBUG] Debug message")    // 不会打印
	log.Print("[INFO] Information")       // 会打印
	log.Print("[WARN] Warning message")   // 会打印
	log.Print("[ERROR] Error occurred")   // 会打印
	log.Print("Plain message")            // 会打印

	// 使用标准log包的其他功能
	log.SetFlags(log.Ldate | log.Ltime | log.Lshortfile)
	log.Println("[INFO] Formatted log with timestamp and file info")
}

高级用法

logutils 还支持自定义日志格式和颜色输出:

package main

import (
	"log"
	"os"

	"github.com/hashicorp/logutils"
)

func main() {
	// 创建带颜色的日志过滤器
	filter := &logutils.LevelFilter{
		Levels:   []logutils.LogLevel{"DEBUG", "INFO", "WARN", "ERROR"},
		MinLevel: logutils.LogLevel("DEBUG"),
		Writer:   os.Stderr,
	}

	// 设置日志前缀和标志
	log.SetPrefix("[MyApp] ")
	log.SetFlags(log.Ldate | log.Ltime)

	// 设置输出
	log.SetOutput(filter)

	// 输出不同级别的日志
	log.Println("[DEBUG] Starting application...")
	log.Println("[INFO] Server started on port 8080")
	log.Println("[WARN] Low disk space detected")
	log.Println("[ERROR] Failed to connect to database")
}

logutils 的主要优点是它与标准 log 包完全兼容,可以逐步迁移现有代码,而不需要一次性重写所有日志记录语句。


更多关于golang扩展标准日志功能的增强日志工具插件库logutils的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang扩展标准日志功能的增强日志工具插件库logutils的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


logutils - Go语言增强日志工具库

logutils 是一个用于扩展 Go 标准库 log 功能的轻量级工具库,提供了日志级别、颜色输出等增强功能。

主要特性

  1. 支持多日志级别 (DEBUG, INFO, WARN, ERROR, FATAL)
  2. 支持彩色终端输出
  3. 兼容标准库 log 接口
  4. 线程安全
  5. 可自定义输出格式

安装

go get github.com/hashicorp/logutils

基本使用示例

package main

import (
	"log"
	"os"

	"github.com/hashicorp/logutils"
)

func main() {
	// 创建过滤器
	filter := &logutils.LevelFilter{
		Levels:   []logutils.LogLevel{"DEBUG", "INFO", "WARN", "ERROR"},
		MinLevel: "INFO", // 设置最低日志级别
		Writer:   os.Stderr,
	}

	// 设置标准logger输出
	log.SetOutput(filter)

	// 输出不同级别的日志
	log.Printf("[DEBUG] 调试信息") // 不会输出,因为级别低于INFO
	log.Printf("[INFO] 普通信息")  // 会输出
	log.Printf("[WARN] 警告信息")  // 会输出
	log.Printf("[ERROR] 错误信息") // 会输出
}

带颜色的日志输出

package main

import (
	"log"
	"os"

	"github.com/hashicorp/logutils"
)

func main() {
	// 创建带颜色的过滤器
	filter := &logutils.LevelFilter{
		Levels: []logutils.LogLevel{"DEBUG", "INFO", "WARN", "ERROR"},
		MinLevel: "DEBUG",
		Writer: os.Stderr,
		// 设置颜色
		Colors: map[logutils.LogLevel]logutils.Color{
			"DEBUG": logutils.ColorGreen,
			"INFO":  logutils.ColorBlue,
			"WARN":  logutils.ColorYellow,
			"ERROR": logutils.ColorRed,
		},
	}

	log.SetOutput(filter)

	log.Printf("[DEBUG] 调试信息 - 绿色")
	log.Printf("[INFO] 普通信息 - 蓝色")
	log.Printf("[WARN] 警告信息 - 黄色")
	log.Printf("[ERROR] 错误信息 - 红色")
}

自定义日志格式

package main

import (
	"bytes"
	"fmt"
	"log"
	"os"
	"time"

	"github.com/hashicorp/logutils"
)

// 自定义格式器
type customFormatter struct{}

func (f *customFormatter) Format(level logutils.LogLevel, msg string) []byte {
	var buf bytes.Buffer
	buf.WriteString(time.Now().Format("2006-01-02 15:04:05"))
	buf.WriteString(" [")
	buf.WriteString(string(level))
	buf.WriteString("] ")
	buf.WriteString(msg)
	buf.WriteString("\n")
	return buf.Bytes()
}

func main() {
	formatter := &customFormatter{}
	
	filter := &logutils.LevelFilter{
		Levels:   []logutils.LogLevel{"DEBUG", "INFO", "WARN", "ERROR"},
		MinLevel: "INFO",
		Writer:   os.Stderr,
		Formatter: formatter,
	}

	log.SetOutput(filter)

	log.Printf("[INFO] 自定义格式的日志")
	// 输出示例: 2023-10-01 12:34:56 [INFO] 自定义格式的日志
}

高级用法 - 多日志输出

package main

import (
	"io"
	"log"
	"os"

	"github.com/hashicorp/logutils"
)

func main() {
	// 创建日志文件
	file, err := os.OpenFile("app.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
	if err != nil {
		log.Fatal(err)
	}
	defer file.Close()

	// 创建多输出writer
	multiWriter := io.MultiWriter(os.Stderr, file)

	filter := &logutils.LevelFilter{
		Levels:   []logutils.LogLevel{"DEBUG", "INFO", "WARN", "ERROR"},
		MinLevel: "INFO",
		Writer:   multiWriter,
	}

	log.SetOutput(filter)

	// 日志会同时输出到控制台和文件
	log.Printf("[INFO] 这条日志会出现在控制台和文件中")
	log.Printf("[ERROR] 错误日志也会同时记录")
}

性能考虑

logutils 是一个轻量级包装器,性能开销很小。在生产环境中,建议:

  1. 将 MinLevel 设置为合理的级别,避免不必要日志输出
  2. 对于高频日志,可以使用标准库的 log.Logger 直接输出
  3. 考虑使用 sync.Pool 重用缓冲区(logutils 内部已经做了优化)

与其他日志库比较

相比于 zap、logrus 等全功能日志库,logutils 的优势在于:

  1. 更轻量,无外部依赖
  2. 完全兼容标准库 log 接口
  3. 更简单的配置和使用

适合需要简单扩展标准库日志功能的场景。

总结

logutils 提供了 Go 标准日志库的轻量级扩展,特别适合那些希望保持标准库接口同时需要基本日志级别功能的项目。它的简洁性和兼容性使其成为许多中小型项目的理想选择。

回到顶部