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提供了更现代和功能丰富的日志记录能力,特别适合需要日志分级、结构化日志和分布式追踪的应用程序。

回到顶部