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

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

什么是distillog?

Build Status Documentation Go Report Card

distillog旨在提供一个支持日志级别的简约日志接口。它基于stdlib API并稍作增强。你可以把它看作是经过"蒸馏"的分级日志系统。

又一个Golang日志库?

“日志库就像观点,似乎每个人都有自己的一套” —— 匿名

大多数其他日志库要么做得太少(如标准库),要么做得太多(如glog)。

distillog试图在功能上介于标准库和大多数其他可用日志库之间(但更倾向于标准库的简约风格)。

distillog有什么不同?

distillog旨在提供比标准库稍丰富的接口。

为此,它限制自己:

  • 提供最小接口以便发出分级日志消息
  • 提供日志记录器实现,用于记录到最常见的后端
    • 流 - 如stderr/stdout
    • 文件 - 通过io.WriteCloser(如lumberjack)
    • syslog
  • 避免承担任何非必要的责任(如颜色)
  • 暴露日志记录器接口而非实现

使用示例

Logger接口定义如下:

type Logger interface {
    Debugf(format string, v ...interface{})
    Debugln(v ...interface{})

    Infof(format string, v ...interface{})
    Infoln(v ...interface{})

    Warningf(format string, v ...interface{})
    Warningln(v ...interface{})

    Errorf(format string, v ...interface{})
    Errorln(v ...interface{})

    Close() error
}

基本使用示例

package main

import (
    "github.com/amoghe/distillog"
)

func main() {
    // 创建标准输出日志记录器
    logger := distillog.NewStdoutLogger("myapp")
    
    // 记录不同级别的日志
    logger.Infoln("应用程序启动")
    logger.Debugln("初始化配置")
    logger.Warningln("检测到配置问题,使用默认值继续...")
    logger.Errorf("数据库连接失败: %v", err)
    
    // 格式化日志
    user := "张三"
    logger.Infof("用户 %s 已登录", user)
}

输出到不同后端

// 输出到标准错误
errLogger := distillog.NewStderrLogger("myapp")

// 输出到syslog
sysLogger := distillog.NewSyslogLogger("myapp")

// 输出到文件
file, err := os.OpenFile("app.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
if err != nil {
    panic(err)
}
fileLogger := distillog.NewStreamLogger("myapp", file)

使用lumberjack实现日志轮转

package main

import (
    "github.com/amoghe/distillog"
    "gopkg.in/natefinch/lumberjack.v2"
)

func main() {
    // 配置lumberjack日志轮转
    lumberjackHandle := &lumberjack.Logger{
        Filename:   "/var/log/myapp/app.log",
        MaxSize:    500,    // 兆字节
        MaxBackups: 3,      // 保留的旧日志文件数量
        MaxAge:     28,     // 保留天数
    }

    // 创建日志记录器
    logger := distillog.NewStreamLogger("myapp", lumberjackHandle)
    
    // 使用日志记录器
    logger.Infoln("应用程序启动")
    logger.Debugln("初始化模块...")
    
    // 程序结束时关闭日志记录器
    defer logger.Close()
}

包级日志记录器

package main

import (
    log "github.com/amoghe/distillog"
    "os"
)

func main() {
    // 设置全局输出
    log.SetOutput(os.Stdout)
    
    // 使用包级日志记录器
    log.Infoln("应用程序启动")
    log.Debugln("调试信息")
    log.Warningln("警告信息")
    log.Errorln("错误信息")
}

特点总结

  1. 轻量级: 只提供核心日志功能,没有多余特性
  2. 分级日志: 支持Debug、Info、Warning、Error四个级别
  3. 多种后端: 支持标准输出、标准错误、文件和syslog
  4. 接口设计: 通过接口而非具体实现,便于切换日志后端
  5. 与lumberjack集成: 可轻松实现日志轮转功能

这个库非常适合需要简单分级日志功能但又不想要复杂特性的Golang项目。


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

1 回复

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


Distillog - Go语言轻量级分级日志记录库

Distillog是一个简单、轻量级的Go语言日志记录库,支持分级日志功能。它设计简洁,易于集成到各种Go项目中。

主要特性

  • 支持多种日志级别:Trace, Debug, Info, Warning, Error, Critical
  • 可定制的输出格式
  • 轻量级,无额外依赖
  • 线程安全
  • 可扩展的输出目标

安装

go get github.com/amoghe/distillog

基本使用示例

package main

import (
	"github.com/amoghe/distillog"
	"os"
)

func main() {
	// 创建一个默认的日志记录器(输出到标准错误)
	logger := distillog.NewStdoutLogger("myapp")

	// 不同级别的日志记录
	logger.Tracef("这是一条Trace日志: %d", 1)
	logger.Debugf("这是一条Debug日志: %s", "debug info")
	logger.Infof("这是一条Info日志")
	logger.Warningf("这是一条Warning日志")
	logger.Errorf("这是一条Error日志")
	logger.Criticalf("这是一条Critical日志")

	// 也可以直接使用Print系列方法
	logger.Println("直接打印一行日志")
	logger.Printf("格式化打印: %s", "value")

	// 创建输出到文件的日志记录器
	file, _ := os.Create("app.log")
	defer file.Close()
	fileLogger := distillog.NewFileLogger("myapp", file)
	
	fileLogger.Infof("这条日志会写入文件")
}

自定义日志级别

package main

import (
	"github.com/amoghe/distillog"
	"os"
)

func main() {
	// 创建一个自定义格式的日志记录器
	logger := distillog.NewStreamLogger(
		"myapp",
		os.Stderr,
		distillog.LogLevelDebug, // 只记录Debug及以上级别的日志
		distillog.NewStdFormatter("[%s] %s: %s\n"), // 自定义格式
	)

	logger.Tracef("这条不会显示") // Trace级别低于Debug
	logger.Debugf("这条会显示")  // Debug级别符合
}

自定义日志格式

package main

import (
	"github.com/amoghe/distillog"
	"os"
)

func main() {
	// 自定义格式化函数
	customFormatter := func(level, name, msg string) string {
		return level + "|" + name + "|" + msg + "\n"
	}

	logger := distillog.NewStreamLogger(
		"myapp",
		os.Stdout,
		distillog.LogLevelInfo,
		distillog.NewCustomFormatter(customFormatter),
	)

	logger.Infof("自定义格式的日志")
}

日志级别常量

Distillog定义了以下日志级别常量:

const (
	LogLevelTrace    = "TRACE"
	LogLevelDebug    = "DEBUG"
	LogLevelInfo     = "INFO"
	LogLevelWarning  = "WARNING"
	LogLevelError    = "ERROR"
	LogLevelCritical = "CRITICAL"
)

性能考虑

Distillog设计时考虑了性能因素:

  1. 日志级别检查在格式化字符串前进行,避免不必要的字符串处理
  2. 使用接口设计,便于替换实现
  3. 简单的同步机制,保证线程安全

与其他日志库的比较

相比logrus或zap等更复杂的日志库,Distillog的优势在于:

  • 更小的代码体积
  • 更简单的API
  • 无外部依赖
  • 足够满足大多数基本日志需求

总结

Distillog是一个非常适合中小型Go项目的日志记录解决方案。它提供了必要的日志分级功能,同时保持了极简的设计和实现。如果你的项目需要更高级的功能如结构化日志、日志旋转等,可能需要考虑更复杂的日志库。但对于大多数基础需求,Distillog是一个优秀的选择。

回到顶部