golang简单高效的Go日志记录插件库log15的使用
Golang简单高效的Go日志记录插件库log15的使用
log15是一个为Go语言设计的简单高效、既适合人类阅读又适合机器处理的日志记录库。它模仿了Go标准库中的io
和net/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")
}
最佳实践
- 在应用程序启动时配置全局日志处理器
- 为不同的包或模块创建带有标识符的子日志记录器
- 在生产环境中使用JSON格式以便于日志分析
- 合理设置日志级别以减少不必要的日志输出
log15是一个轻量级但功能强大的日志库,特别适合需要结构化日志记录的Go应用程序。它的API设计简洁,性能高效,是许多Go项目的首选日志解决方案。