golang轻量级分级日志记录插件库distillog的使用
Golang轻量级分级日志记录插件库distillog的使用
什么是distillog?
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("错误信息")
}
特点总结
- 轻量级: 只提供核心日志功能,没有多余特性
- 分级日志: 支持Debug、Info、Warning、Error四个级别
- 多种后端: 支持标准输出、标准错误、文件和syslog
- 接口设计: 通过接口而非具体实现,便于切换日志后端
- 与lumberjack集成: 可轻松实现日志轮转功能
这个库非常适合需要简单分级日志功能但又不想要复杂特性的Golang项目。
更多关于golang轻量级分级日志记录插件库distillog的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于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设计时考虑了性能因素:
- 日志级别检查在格式化字符串前进行,避免不必要的字符串处理
- 使用接口设计,便于替换实现
- 简单的同步机制,保证线程安全
与其他日志库的比较
相比logrus或zap等更复杂的日志库,Distillog的优势在于:
- 更小的代码体积
- 更简单的API
- 无外部依赖
- 足够满足大多数基本日志需求
总结
Distillog是一个非常适合中小型Go项目的日志记录解决方案。它提供了必要的日志分级功能,同时保持了极简的设计和实现。如果你的项目需要更高级的功能如结构化日志、日志旋转等,可能需要考虑更复杂的日志库。但对于大多数基础需求,Distillog是一个优秀的选择。