Golang高效、可定制且分级的简易日志记录方案
更多关于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接口完全控制日志流。

