golang简单高效的Go日志记录插件库log15的使用

Golang简单高效的Go日志记录插件库log15的使用

obligatory xkcd

log15是一个为Go语言设计的简单高效、既适合人类阅读又适合机器处理的日志记录库。它模仿了Go标准库中的ionet/http包的风格,是标准库log包的替代方案。

特性

  • 简单易理解的API
  • 通过鼓励使用键值对来促进结构化日志记录
  • 子日志记录器可以继承并添加自己的私有上下文
  • 对昂贵操作的惰性求值
  • 简单的Handler接口,允许用极小的API构建灵活的自定义日志配置
  • 支持彩色终端输出
  • 内置支持记录到文件、流、syslog和网络
  • 支持将记录分发到多个处理器、缓冲记录输出、处理器写入失败时的故障转移等功能

版本控制

log15的主分支API应始终被视为不稳定。如果您需要依赖稳定的API,必须将该库包含在您的项目中。

导入

import log "github.com/inconshreveable/log15"

示例

基本使用示例

package main

import (
	"os"
	log "github.com/inconshreveable/log15"
)

func main() {
	// 所有日志记录器都可以有键/值上下文
	srvlog := log.New("module", "app/server")

	// 所有日志消息都可以有键/值上下文
	srvlog.Warn("abnormal conn rate", "rate", 0.5, "low", 0.1, "high", 0.8)

	// 带有继承上下文的子日志记录器
	connlog := srvlog.New("raddr", "10.0.0.1")
	connlog.Info("connection open")

	// 惰性求值
	connlog.Debug("ping remote", "latency", log.Lazy{func() interface{} {
		return 42 // 模拟延迟值
	}})

	// 灵活的配置
	srvlog.SetHandler(log.MultiHandler(
		log.StreamHandler(os.Stderr, log.LogfmtFormat()),
		log.LvlFilterHandler(
			log.LvlError,
			log.Must.FileHandler("errors.json", log.JsonFormat()))))
}

输出示例

执行上述代码会产生类似以下的输出:

WARN[06-17|21:58:10] abnormal conn rate                       module=app/server rate=0.500 low=0.100 high=0.800
INFO[06-17|21:58:10] connection open                          module=app/server raddr=10.0.0.1

类型安全的上下文使用

如果您担心可变参数风格的易错性,可以使用log.Ctx来获得类型安全:

srvlog := log.New(log.Ctx{"module": "app/server"})
srvlog.Warn("abnormal conn rate", log.Ctx{"rate": curRate, "low": lowRate, "high": highRate})

破坏性API变更

以下提交破坏了API稳定性,这些信息可以帮助您了解升级到新版本log15的影响:

  • 添加了Get()方法到Logger接口以检索当前处理器
  • Record字段Call更改为stack.Call,切换到了github.com/go-stack/stack
  • 恢复了syslog.Priority参数到SyslogXxx处理器构造函数

许可证

Apache


更多关于golang简单高效的Go日志记录插件库log15的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang简单高效的Go日志记录插件库log15的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


log15 - 简单高效的Go日志记录库

log15是一个简单高效的Go语言日志记录库,它提供了结构化日志记录和灵活的日志级别控制。下面我将详细介绍log15的使用方法。

安装

go get github.com/inconshreveable/log15

基本使用

package main

import (
	"github.com/inconshreveable/log15"
)

func main() {
	// 创建一个logger实例
	log := log15.New()
	
	// 基本日志记录
	log.Info("This is an info message")
	log.Debug("Debug message")
	log.Warn("Warning message")
	log.Error("Error message")
	
	// 带上下文的日志记录
	log.Info("User logged in", "user_id", 123, "ip", "192.168.1.1")
}

日志级别

log15支持以下日志级别:

  • Crit (最高级别)
  • Error
  • Warn
  • Info
  • Debug (最低级别)

设置日志级别

func main() {
	log := log15.New()
	
	// 设置日志级别为Info,这样Debug日志将不会显示
	log.SetHandler(log15.LvlFilterHandler(log15.LvlInfo, log15.StdoutHandler))
	
	log.Debug("This won't be displayed")
	log.Info("This will be displayed")
}

自定义输出格式

func main() {
	// 使用TerminalFormat输出彩色日志
	handler := log15.StreamHandler(os.Stdout, log15.TerminalFormat())
	log := log15.New()
	log.SetHandler(handler)
	
	log.Info("Colored log message")
	
	// 使用JsonFormat输出JSON格式日志
	jsonHandler := log15.StreamHandler(os.Stdout, log15.JsonFormat())
	log.SetHandler(jsonHandler)
	
	log.Info("JSON formatted log", "key", "value")
}

文件日志记录

func main() {
	// 创建文件日志处理器
	fileHandler, err := log15.FileHandler("app.log", log15.JsonFormat())
	if err != nil {
		panic(err)
	}
	
	log := log15.New()
	log.SetHandler(fileHandler)
	
	log.Info("This will be written to app.log")
}

多处理器组合

func main() {
	// 同时输出到控制台和文件
	consoleHandler := log15.StreamHandler(os.Stdout, log15.TerminalFormat())
	fileHandler, _ := log15.FileHandler("app.log", log15.JsonFormat())
	
	// 使用MultiHandler组合多个处理器
	multiHandler := log15.MultiHandler(consoleHandler, fileHandler)
	
	log := log15.New()
	log.SetHandler(multiHandler)
	
	log.Info("This will go to both console and file")
}

上下文日志记录器

func main() {
	log := log15.New()
	
	// 创建带有固定上下文的子日志记录器
	ctxLog := log.New("app", "myapp", "version", "1.0")
	
	// 所有使用ctxLog记录的日志都会自动包含app和version字段
	ctxLog.Info("Application started")
	// 输出类似: app=myapp version=1.0 msg="Application started"
	
	// 可以继续添加上下文
	reqLog := ctxLog.New("request_id", "abc123")
	reqLog.Info("Processing request")
	// 输出类似: app=myapp version=1.0 request_id=abc123 msg="Processing request"
}

自定义日志处理器

func main() {
	// 自定义处理器示例 - 只记录Error及以上级别的日志
	customHandler := log15.FuncHandler(func(r *log15.Record) error {
		if r.Lvl <= log15.LvlError {
			fmt.Printf("CUSTOM HANDLER: %s %s\n", r.Lvl, r.Msg)
		}
		return nil
	})
	
	log := log15.New()
	log.SetHandler(customHandler)
	
	log.Info("This won't be logged by custom handler")
	log.Error("This will be logged by custom handler")
}

最佳实践

  1. 在应用程序启动时配置全局日志处理器
  2. 为不同的包或模块创建带有标识符的子日志记录器
  3. 在生产环境中使用JSON格式以便于日志分析
  4. 合理设置日志级别以减少不必要的日志输出

log15是一个轻量级但功能强大的日志库,特别适合需要结构化日志记录的Go应用程序。它的API设计简洁,性能高效,是许多Go项目的首选日志解决方案。

回到顶部