golang支持日志追踪和分级的标准库扩展插件logex的使用
Golang支持日志追踪和分级的标准库扩展插件logex的使用
简介
Logex是一个Golang日志库,支持追踪和日志分级功能,是对标准log库的封装。
安装
使用以下命令安装logex:
go get github.com/chzyer/logex
基本使用
import "github.com/chzyer/logex" // 包名为logex
func main() {
logex.Info("Hello!")
}
日志分级
Logex支持多种日志级别:
import "github.com/chzyer/logex"
func main() {
logex.Println("") // 普通打印
logex.Debug("debug staff.") // 仅当设置了"DEBUG"环境变量时显示(无论值是什么)
logex.Info("info") // 信息级别
logex.Warn("") // 警告级别
logex.Fatal("") // 致命错误,会触发os.Exit(1)
logex.Error(err) // 打印错误
logex.Struct(obj) // 按照"%T(%+v)"格式打印对象
logex.Pretty(obj) // 以JSON风格打印对象,更易读且隐藏非公开属性
}
扩展性
可以将Logger嵌入到自定义结构体中:
type MyStruct struct {
BiteMe bool
logex.Logger // 只需嵌入这个
}
func main() {
ms := new(MyStruct)
ms.Info("woo!") // 现在可以直接使用日志方法
}
运行时追踪
所有日志都会附加它们的调用栈信息,格式为{packageName}.{FuncName}:{FileName}:{FileLine}
示例代码:
package main
import "github.com/chzyer/logex"
func test() {
logex.Pretty("hello")
}
func main() {
test()
}
输出结果:
2014/10/10 15:17:14 [main.test:testlog.go:6][PRETTY] "hello"
错误追踪
你可以追踪错误调用链:
package main
import (
"github.com/chzyer/logex"
"os"
)
func openfile() (*os.File, error) {
f, err := os.Open("xxx")
if err != nil {
err = logex.Trace(err) // 追踪错误
}
return f, err
}
func test() error {
f, err := openfile()
if err != nil {
return logex.Trace(err) // 追踪错误
}
f.Close()
return nil
}
func main() {
err := test()
if err != nil {
logex.Error(err) // 打印带追踪的错误
return
}
logex.Info("test success")
}
输出结果:
2014/10/10 15:22:29 [main.main:testlog.go:28][ERROR] [main.openfile:11;main.test:19] open xxx: no such file or directory
这个输出显示了错误的完整调用链,包括文件名和行号,方便定位问题。
更多关于golang支持日志追踪和分级的标准库扩展插件logex的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于golang支持日志追踪和分级的标准库扩展插件logex的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
Golang日志追踪与分级:logex库使用指南
在Golang标准库中,log
包功能相对基础,缺乏日志分级、结构化日志和追踪等现代日志系统所需的功能。logex
是一个流行的第三方日志库扩展,提供了这些增强功能。
logex库概述
logex
(https://github.com/choleraehyq/logex)是一个轻量级的Golang日志扩展库,主要特点包括:
- 日志分级(DEBUG, INFO, WARN, ERROR, FATAL)
- 结构化日志输出
- 上下文追踪支持
- 兼容标准库log接口
安装logex
go get github.com/choleraehyq/logex
基础使用示例
package main
import (
"context"
"github.com/choleraehyq/logex"
)
func main() {
// 初始化日志配置
logex.SetLevel(logex.DEBUG) // 设置日志级别
logex.SetFlags(logex.LstdFlags | logex.Lshortfile) // 设置日志格式
// 基础日志输出
logex.Debug("This is a debug message")
logex.Info("This is an info message")
logex.Warn("This is a warning message")
logex.Error("This is an error message")
// 结构化日志
logex.WithFields(logex.Fields{
"key1": "value1",
"key2": 123,
}).Info("Structured log message")
}
日志分级控制
logex支持以下日志级别:
- DEBUG
- INFO
- WARN
- ERROR
- FATAL
func main() {
// 设置日志级别为INFO,DEBUG级别的日志将不会输出
logex.SetLevel(logex.INFO)
logex.Debug("This won't be printed") // 不会输出
logex.Info("This will be printed") // 会输出
}
上下文追踪
logex支持在分布式系统中追踪请求链路:
func handler(ctx context.Context) {
// 从上下文中获取追踪ID并记录日志
logex.WithContext(ctx).Info("Handling request")
// 调用其他函数并传递上下文
processData(ctx)
}
func processData(ctx context.Context) {
// 记录带上下文的日志
logex.WithContext(ctx).Info("Processing data")
}
自定义日志输出
func main() {
// 自定义输出格式
logex.SetFormatter(&logex.TextFormatter{
DisableTimestamp: false,
FullTimestamp: true,
TimestampFormat: "2006-01-02 15:04:05",
})
// 自定义输出位置
file, _ := os.OpenFile("app.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
logex.SetOutput(file)
logex.Info("This will be written to app.log")
}
高级功能:日志钩子
func main() {
// 添加日志钩子,可以在日志记录前后执行自定义逻辑
logex.AddHook(&MyHook{})
logex.Info("This will trigger the hook")
}
type MyHook struct{}
func (h *MyHook) Levels() []logex.Level {
return []logex.Level{logex.INFO, logex.ERROR}
}
func (h *MyHook) Fire(e *logex.Entry) error {
// 在这里可以添加自定义逻辑,如发送告警等
fmt.Println("Hook triggered for level:", e.Level)
return nil
}
性能考虑
对于高性能场景,可以使用异步日志记录:
func main() {
// 启用异步日志
logex.SetAsync(true)
// 大量日志记录不会阻塞主程序
for i := 0; i < 10000; i++ {
logex.Info("Log message", i)
}
}
与标准库log对比
特性 | 标准库log | logex |
---|---|---|
日志分级 | ❌ | ✅ |
结构化日志 | ❌ | ✅ |
上下文追踪 | ❌ | ✅ |
自定义输出格式 | ❌ | ✅ |
日志钩子 | ❌ | ✅ |
异步日志 | ❌ | ✅ |
logex提供了更现代和功能丰富的日志记录能力,特别适合需要日志分级、结构化日志和分布式追踪的应用程序。