golang高性能可扩展全功能日志插件库gone/log的使用

golang高性能可扩展全功能日志插件库gone/log的使用

gone/log是一个Golang日志库,它是标准库"log"的完全兼容替代品,同时通过扩展API提供高级日志功能。

设计目标

  • 与标准库保持源码级别兼容,并保留大部分行为
  • 支持syslog级别的分级日志
  • 结构化键/值日志
  • 支持分层上下文日志,自动记录上下文中的k/v数据
  • 低资源占用,即使不输出也允许更多(调试)日志语句
  • 轻量级语法鼓励在INFO/DEBUG级别记录日志
  • 灵活的输出方式
  • 快速简单的默认输出方式,类似systemd新守护进程风格,只输出到标准输出

日志概述

日志通过*log.Logger对象完成,它们实现了所有日志API。

日志事件由调用log.Logger对象的日志方法(如ERROR())创建。Logger对象按层次结构排列,遍历该结构会找到一个Handler链。事件随后通过Handler链发送,直到到达格式化Handler。格式化后的事件可能通过Writer链最终到达os.File目标。

日志处理流程图

示例代码

标准库兼容用法

import "github.com/One-com/gonelog/log"

// 完全兼容标准库的用法
log.Println("Hello log")

mylog := log.New(os.Stdout,"PFX:",log.LstdFlags)
mylog.Fatal("Arggh")

高级功能用法

// 创建格式化Handler,输出到标准输出,包含时间戳、日志级别、进程ID和文件名
h := log.NewStdFormatter(os.Stdout,"",log.LstdFlags|log.Llevel|log.Lpid|log.Lshortfile)

// 创建Logger,只记录WARN及以上级别的日志
l := log.NewLogger(syslog.LOG_WARN,h)

// 记录错误日志
err := DangerousOperation()
if err != nil {
    l.ERROR("An error happened", "err", err) // 结构化日志,包含错误对象
}

// 创建带有上下文的Logger
context_logger := l.With("session", session-id)

// 记录警告日志,自动包含session上下文
context_logger.WARN("Session will expire soon")

完整示例Demo

package main

import (
	"os"
	"github.com/One-com/gonelog/log"
	"log/syslog"
)

func main() {
	// 1. 初始化日志系统
	// 创建格式化Handler
	formatter := log.NewStdFormatter(os.Stdout, "", 
		log.LstdFlags|log.Llevel|log.Lshortfile)
	
	// 创建主Logger,设置日志级别为INFO
	mainLogger := log.NewLogger(syslog.LOG_INFO, formatter)
	
	// 2. 基本日志记录
	mainLogger.INFO("Application starting up")
	
	// 3. 带上下文的日志记录
	requestLogger := mainLogger.With("request_id", "12345")
	requestLogger.INFO("Processing request")
	
	// 4. 结构化日志
	user := "john_doe"
	err := processUser(user)
	if err != nil {
		mainLogger.ERROR("Failed to process user", 
			"user", user, 
			"error", err)
	}
	
	// 5. 不同级别日志
	mainLogger.DEBUG("Debug information") // 不会输出,因为级别是INFO
	mainLogger.WARN("Warning condition")
	mainLogger.ERROR("Error condition")
	
	// 6. 标准库兼容用法
	log.Println("Standard log message")
	
	mainLogger.INFO("Application shutting down")
}

func processUser(user string) error {
	// 模拟错误
	return fmt.Errorf("invalid user format")
}

这个库提供了丰富的日志功能,同时保持与标准库的兼容性。通过结构化日志和上下文功能,可以轻松记录详细的调试信息,同时保持日志的可读性和可搜索性。


更多关于golang高性能可扩展全功能日志插件库gone/log的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang高性能可扩展全功能日志插件库gone/log的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Gone/Log - Golang高性能可扩展日志库使用指南

Gone/log 是一个高性能、可扩展的 Golang 日志库,提供了丰富的功能和灵活的配置选项。下面我将详细介绍其使用方法和最佳实践。

安装

go get github.com/gone-io/gone/log

基本使用

1. 快速开始

package main

import "github.com/gone-io/gone/log"

func main() {
    // 默认配置初始化
    log.InitDefaultLogger()
    defer log.Close() // 程序退出前关闭日志
    
    // 记录不同级别日志
    log.Debug("This is a debug message")
    log.Info("This is an info message")
    log.Warn("This is a warning message")
    log.Error("This is an error message")
    
    // 带格式化输出
    log.Infof("User %s logged in at %v", "Alice", time.Now())
}

2. 高级配置

func initLogger() {
    // 自定义配置
    config := log.Config{
        Level:      log.InfoLevel,  // 设置日志级别
        Formatter:  log.JSONFormat, // JSON格式输出
        Output:     []string{"stdout", "file"}, // 输出到控制台和文件
        FileConfig: log.FileConfig{
            Filename:   "app.log",
            MaxSize:    100, // MB
            MaxBackups: 5,
            MaxAge:     30, // days
            Compress:   true,
        },
        EnableCaller: true, // 显示调用者信息
    }
    
    log.InitWithConfig(config)
}

核心功能

1. 日志级别控制

// 设置全局日志级别
log.SetLevel(log.DebugLevel)

// 检查当前级别是否允许记录
if log.IsLevelEnabled(log.DebugLevel) {
    log.Debug("This will only be logged if debug level is enabled")
}

2. 结构化日志

// 使用Fields记录结构化数据
log.WithFields(log.Fields{
    "user_id": 12345,
    "ip": "192.168.1.1",
    "duration": 150, // ms
}).Info("User request processed")

// 输出示例:
// {"level":"info","time":"2023-01-01T12:00:00Z","msg":"User request processed","user_id":12345,"ip":"192.168.1.1","duration":150}

3. 上下文日志

// 创建带有固定字段的logger实例
logger := log.WithFields(log.Fields{
    "service": "payment",
    "version": "1.0.0",
})

// 后续使用都会带上这些字段
logger.Info("Starting payment processing")
logger.WithField("txn_id", "txn_123").Info("Transaction started")

4. 性能优化技巧

// 使用Debugf时先检查级别避免不必要的字符串格式化
if log.IsLevelEnabled(log.DebugLevel) {
    log.Debugf("Expensive to compute: %s", expensiveOperation())
}

// 对于频繁调用的日志,使用WithFields而不是格式化字符串
logger := log.WithFields(log.Fields{
    "component": "high_perf",
})
logger.Info("Performance critical log message")

扩展功能

1. 自定义输出

// 实现io.Writer接口
type CustomWriter struct{}

func (w *CustomWriter) Write(p []byte) (n int, err error) {
    // 自定义处理逻辑,如发送到远程服务
    return len(p), nil
}

// 配置使用自定义输出
config := log.Config{
    Output: []string{"custom"},
    CustomWriters: map[string]io.Writer{
        "custom": &CustomWriter{},
    },
}
log.InitWithConfig(config)

2. 自定义格式化

// 实现Formatter接口
type SimpleFormatter struct{}

func (f *SimpleFormatter) Format(entry *log.Entry) ([]byte, error) {
    return []byte(fmt.Sprintf("[%s] %s\n", entry.Level, entry.Message)), nil
}

// 使用自定义格式化器
config := log.Config{
    Formatter: &SimpleFormatter{},
}
log.InitWithConfig(config)

3. 采样日志(避免日志洪水)

// 配置采样率
config := log.Config{
    Sampling: &log.SamplingConfig{
        Initial:    100, // 每秒前100条
        Thereafter: 10,  // 之后每10条记录1条
    },
}
log.InitWithConfig(config)

最佳实践

  1. 合理设置日志级别:生产环境通常使用Info级别,开发环境可使用Debug级别

  2. 结构化日志优先:尽量使用WithFields而非格式化字符串,便于日志分析

  3. 避免高频日志:对于高频操作,考虑使用采样或提升日志级别

  4. 敏感信息过滤:不要在日志中记录密码、密钥等敏感信息

  5. 合理配置日志轮转:根据应用负载设置合适的日志文件大小和保留策略

Gone/log 通过其灵活的配置和高性能实现,能够满足从简单应用到复杂分布式系统的各种日志需求。根据你的具体场景选择合适的配置方式,可以最大化其价值。

回到顶部