Golang高效、可定制且分级的简易日志记录方案

Golang高效、可定制且分级的简易日志记录方案 GitHub

预览图

ermanimer/log

Go 语言中简单、可定制、分级且高效的日志记录 - ermanimer/log


更多关于Golang高效、可定制且分级的简易日志记录方案的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于Golang高效、可定制且分级的简易日志记录方案的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


对于需要高效、可定制且分级的Go日志方案,ermanimer/log是一个优秀选择。以下示例展示其核心特性:

package main

import (
    "github.com/ermanimer/log"
)

func main() {
    // 1. 基础分级日志
    logger := log.NewLogger()
    logger.Debug("调试信息")    // 默认不显示
    logger.Info("普通信息")
    logger.Warn("警告信息")
    logger.Error("错误信息")
    
    // 2. 自定义日志级别
    config := log.Config{
        Level: log.LevelDebug,  // 显示所有级别
        TimeFormat: "2006-01-02 15:04:05",
    }
    customLogger := log.NewLoggerWithConfig(config)
    customLogger.Debug("现在会显示调试信息")
    
    // 3. 结构化日志
    logger.WithFields(log.Fields{
        "user_id": 123,
        "action": "login",
    }).Info("用户操作")
    
    // 4. 性能敏感场景使用格式化方法
    logger.Infof("处理了%d条记录", 1500)
    
    // 5. 错误上下文
    err := someOperation()
    if err != nil {
        logger.WithError(err).Error("操作失败")
    }
}

关键特性实现:

// 自定义输出器示例
type CustomWriter struct {
    io.Writer
}

func (w *CustomWriter) Write(p []byte) (n int, err error) {
    // 添加自定义处理逻辑
    formatted := fmt.Sprintf("[自定义前缀] %s", p)
    return w.Writer.Write([]byte(formatted))
}

func setupCustomLogger() {
    writer := &CustomWriter{Writer: os.Stdout}
    logger := log.NewLoggerWithConfig(log.Config{
        Level: log.LevelInfo,
        Output: writer,
    })
    logger.Info("使用自定义输出器")
}

// 性能对比:避免反射开销
func benchmarkLogging() {
    logger := log.NewLogger()
    
    // 高效方式
    start := time.Now()
    for i := 0; i < 10000; i++ {
        logger.Infof("索引: %d", i)
    }
    elapsed := time.Since(start)
    fmt.Printf("格式化日志耗时: %v\n", elapsed)
}

该库通过接口设计支持完全定制:

// 实现自定义日志级别过滤
type LevelFilter struct {
    MinLevel log.Level
}

func (f *LevelFilter) Write(p []byte) (n int, err error) {
    // 根据MinLevel过滤日志
    return len(p), nil
}

// 集成到现有日志系统
func integrateWithExisting() {
    filter := &LevelFilter{MinLevel: log.LevelWarn}
    logger := log.NewLoggerWithConfig(log.Config{
        Output: filter,
        Level:  log.LevelDebug,
    })
    
    // 只有Warn及以上级别会被输出
    logger.Debug("不会显示")
    logger.Info("不会显示")
    logger.Warn("会显示")
}

ermanimer/log在性能方面的优化包括:无反射调用、内存池复用、零分配格式化选项。对于需要自定义格式、输出目标或过滤规则的场景,可以通过实现io.Writer接口完全控制日志流。

回到顶部