golang轻量级日志记录插件库yell的使用

Golang轻量级日志记录插件库yell的使用

yell是一个极简主义的日志记录库,具有以下特性:

  • 四种严重级别(info、warn、error、fatal)
  • 简单的API
  • 支持io.Writersync.Locker
  • 包特定的日志记录器
  • 可自定义(严重级别名称、时间格式、本地时间或UTC时间)
  • 轻松、精确的请求位置(file.go:line)记录
  • 语义化版本控制

示例代码

mypkg.go

package mypkg

import (
	"os"
	"github.com/jfcg/yell"
)

// log to stdout with warn or higher severity (for example).
var Logger = yell.New(": mypkg:", os.Stdout, yell.Swarn)

// Info tries to log message list with info severity
func Info(msg ...interface{}) error {
	return Logger.Log(yell.Sinfo, msg...)
}

// Warn tries to log message list with warn severity
func Warn(msg ...interface{}) error {
	return Logger.Log(yell.Swarn, msg...)
}

// Error tries to log message list with error severity
func Error(msg ...interface{}) (err error) {
	err = Logger.Log(yell.Serror, msg...)
	// extra stuff for error severity
	return
}

// Fatal tries to log message list with fatal severity and panics
func Fatal(msg ...interface{}) (err error) {
	err = Logger.Log(yell.Sfatal, msg...)
	pm := Logger.Name() + yell.Sname[yell.Sfatal]
	if err != nil {
		pm += err.Error()
	}
	// probably panic or os.Exit(1) in a fatal situation
	panic(pm)
}

myApp.go

package main

import (
	"fmt"
	"mypkg"
	"github.com/jfcg/yell"
)

func log() {
	defer func() {
		fmt.Println("recovering:", recover())
	}()

	// uses mypkg.Logger. yell records calling line in file.go:line format
	mypkg.Info("some info:", 1, "more")

	// uses yell.Default Logger, minimum severity is warning by default
	yell.Warn("some warning:", "few details")

	// record log() caller instead of this line
	mypkg.Error(yell.Caller(1), "bad error", 3.5, "data")

	// Fatal() logs & panicks
	yell.Fatal("fatal mistake", 2, "hard to recover")
}

func main() {
	// minimum severity for mypkg.Logger is warning, so ignored
	mypkg.Info("some info:", 3, "more")

	// set min severity level to info
	mypkg.Logger.SetLevel(yell.Sinfo)
	log()

	// yell library uses local time by default, to get coordinated universal time
	yell.UTC = true
	log()

	// change time format
	yell.TimeFormat = yell.TimeFormat[:19]
	log()

	// customized severity names (increasing severity)
	yell.Sname = [...]string{"信息:", "警告:", "错误:", "致命的:"}
	yell.UTC = false
	log()

	// disable logging for yell.Default
	yell.Default.SetLevel(yell.Snolog)
	log()
}

输出示例

2021-03-28 21:48:53.591948: mypkg:info: myApp.go:15: some info: 1 more
2021-03-28 21:48:53.592051: myApp:warn: myApp.go:18: some warning: few details
2021-03-28 21:48:53.592063: mypkg:error: myApp.go:33: bad error 3.5 data
2021-03-28 21:48:53.592082: myApp:fatal: myApp.go:24: fatal mistake 2 hard to recover
recovering: myApp:fatal:
2021-03-28 18:48:53.592100: mypkg:info: myApp.go:15: some info: 1 more
2021-03-28 18:48:53.592110: myApp:warn: myApp.go:18: some warning: few details
2021-03-28 18:48:53.592118: mypkg:error: myApp.go:37: bad error 3.5 data
2021-03-28 18:48:53.592126: myApp:fatal: myApp.go:24: fatal mistake 2 hard to recover
recovering: myApp:fatal:
2021-03-28 18:48:53: mypkg:info: myApp.go:15: some info: 1 more
2021-03-28 18:48:53: myApp:warn: myApp.go:18: some warning: few details
2021-03-28 18:48:53: mypkg:error: myApp.go:41: bad error 3.5 data
2021-03-28 18:48:53: myApp:fatal: myApp.go:24: fatal mistake 2 hard to recover
recovering: myApp:fatal:
2021-03-28 21:48:53: mypkg:信息: myApp.go:15: some info: 1 more
2021-03-28 21:48:53: myApp:警告: myApp.go:18: some warning: few details
2021-03-28 21:48:53: mypkg:错误: myApp.go:46: bad error 3.5 data
2021-03-28 21:48:53: myApp:致命的: myApp.go:24: fatal mistake 2 hard to recover
recovering: myApp:致命的:
2021-03-28 21:48:53: mypkg:信息: myApp.go:15: some info: 1 more
2021-03-28 21:48:53: mypkg:错误: myApp.go:50: bad error 3.5 data
recovering: myApp:致命的:

更多关于golang轻量级日志记录插件库yell的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang轻量级日志记录插件库yell的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Golang轻量级日志记录插件库yell使用指南

yell是一个轻量级的Go语言日志记录库,设计简洁但功能实用。下面我将详细介绍yell的使用方法。

安装yell

首先使用go get安装yell:

go get github.com/you/yell

基础用法

package main

import "github.com/you/yell"

func main() {
    // 创建一个默认的日志记录器
    logger := yell.New()
    
    // 记录不同级别的日志
    logger.Debug("这是一条调试信息")
    logger.Info("这是一条普通信息")
    logger.Warn("这是一条警告信息")
    logger.Error("这是一条错误信息")
    
    // 格式化输出
    logger.Infof("当前用户: %s, 年龄: %d", "张三", 25)
    
    // 带字段的日志
    logger.WithFields(yell.Fields{
        "user": "李四",
        "ip":   "192.168.1.1",
    }).Error("用户登录失败")
}

配置选项

yell提供了一些配置选项来自定义日志行为:

logger := yell.New(
    yell.WithLevel(yell.DebugLevel),  // 设置日志级别
    yell.WithFormatter(&yell.TextFormatter{}), // 设置格式化器
    yell.WithOutput(os.Stdout),      // 设置输出目标
    yell.WithCaller(true),           // 是否显示调用者信息
)

日志级别

yell支持以下日志级别:

const (
    DebugLevel Level = iota
    InfoLevel
    WarnLevel
    ErrorLevel
    FatalLevel
    PanicLevel
)

可以通过SetLevel方法动态调整日志级别:

logger.SetLevel(yell.WarnLevel) // 只记录Warn及以上级别的日志

自定义格式化

yell允许自定义日志格式:

type MyFormatter struct{}

func (f *MyFormatter) Format(entry *yell.Entry) ([]byte, error) {
    return []byte(fmt.Sprintf("[%s] %s: %s\n", 
        entry.Time.Format("2006-01-02 15:04:05"),
        entry.Level.String(),
        entry.Message)), nil
}

logger.SetFormatter(&MyFormatter{})

输出到文件

file, err := os.OpenFile("app.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
if err != nil {
    logger.Fatal("无法打开日志文件")
}

logger.SetOutput(file)

多输出目标

yell支持同时输出到多个目标:

logger.SetOutput(io.MultiWriter(
    os.Stdout,
    file,
))

性能优化建议

  1. 在生产环境中,建议将日志级别设置为Warn或Error
  2. 对于高频日志,可以使用IsLevelEnabled先检查级别
  3. 避免在日志中执行复杂计算
if logger.IsLevelEnabled(yell.DebugLevel) {
    logger.Debug("耗时操作结果:", expensiveOperation())
}

与标准库log对比

相比标准库log,yell提供了:

  • 分级日志
  • 结构化日志
  • 更灵活的配置
  • 更好的性能
  • 更丰富的输出格式

完整示例

package main

import (
    "os"
    "github.com/you/yell"
)

func main() {
    // 创建日志记录器
    logger := yell.New(
        yell.WithLevel(yell.DebugLevel),
        yell.WithFormatter(&yell.JSONFormatter{}),
        yell.WithOutput(os.Stdout),
        yell.WithCaller(true),
    )
    
    // 记录不同级别日志
    logger.Debug("系统初始化开始")
    
    // 带字段的日志
    logger.WithFields(yell.Fields{
        "service": "user",
        "action":  "login",
    }).Info("用户登录请求")
    
    // 错误处理示例
    if err := someOperation(); err != nil {
        logger.WithError(err).Error("操作失败")
    }
    
    logger.Info("系统初始化完成")
}

func someOperation() error {
    return nil
}

yell是一个非常适合中小型项目的轻量级日志解决方案,它简单易用但功能完备,能够满足大多数应用场景的日志需求。

回到顶部