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
更多关于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)
最佳实践
-
合理设置日志级别:生产环境通常使用Info级别,开发环境可使用Debug级别
-
结构化日志优先:尽量使用WithFields而非格式化字符串,便于日志分析
-
避免高频日志:对于高频操作,考虑使用采样或提升日志级别
-
敏感信息过滤:不要在日志中记录密码、密钥等敏感信息
-
合理配置日志轮转:根据应用负载设置合适的日志文件大小和保留策略
Gone/log 通过其灵活的配置和高性能实现,能够满足从简单应用到复杂分布式系统的各种日志需求。根据你的具体场景选择合适的配置方式,可以最大化其价值。