golang面向对象的分级日志记录插件库stdlog的使用
Golang面向对象的分级日志记录插件库stdlog的使用
stdlog是一个简单快速的Go语言日志库,主要输出到标准输出(stdout),适合通过shell或cron启动的程序使用。它基于RFC 5424标准实现了分级日志记录功能。
stdlog基本使用
package main
import (
"github.com/alexcesaro/log/stdlog"
)
func main() {
// 从命令行标志获取logger实例
logger := stdlog.GetFromFlags()
// 记录不同级别的日志
logger.Info("Connecting to the server...")
logger.Errorf("Connection failed: %q", "server is down")
// 条件日志记录,避免不必要的计算
if logger.LogDebug() {
logger.Debug("Debug information: %s", expensiveCalculation())
}
}
执行上述代码会输出类似这样的日志:
2014-04-02 18:09:15.862 INFO Connecting to the server...
2014-04-02 18:10:14.347 ERROR Connection failed: "server is down"
命令行参数
stdlog支持以下命令行参数控制日志行为:
-log=info
设置日志级别,高于或等于此级别的日志会被记录
-stderr=false
日志输出到标准错误(stderr)而非标准输出(stdout)
-flushlog=none
设置刷新级别,低于此级别的日志会缓存在内存中,直到有等于或高于此级别的日志出现
日志级别
stdlog支持RFC 5424定义的8个日志级别:
- debug
- info
- notice
- warning
- error
- critical
- alert
- emergency 以及特殊级别"none"
使用场景示例
-
默认情况:除debug外所有日志输出到stdout,适合shell启动的程序
-
crontab场景:配合
-debug -flushlog=error
参数,只在出错时发送所有日志邮件 -
日志文件:通过重定向输出到文件
my_program > /var/log/my_program/my_program-$(date +%Y-%m-%d-%H%M%S).log
其他相关包
buflog - 缓冲日志
package main
import (
"os"
"github.com/alexcesaro/log"
"github.com/alexcesaro/log/buflog"
)
func main() {
// 创建缓冲日志,info级别开始记录,error级别触发刷新
logger := buflog.New(os.Stdout, log.Info, log.Error)
logger.Info("This will be buffered") // 不立即输出
logger.Error("This triggers flush") // 输出缓冲区和当前日志
}
golog - 自定义日志
package main
import (
"os"
"github.com/alexcesaro/log/golog"
"github.com/alexcesaro/log"
)
func main() {
// 创建自定义日志,info级别开始记录
logger := golog.New(os.Stdout, log.Info)
logger.Info("Standard info message")
logger.Error("Error occurred: %v", err)
}
性能优化技巧
对于昂贵的日志参数计算,可以使用条件判断避免不必要执行:
// 不推荐 - 即使debug关闭也会执行getMemoryUsage()
logger.Debug("Memory usage: %s", getMemoryUsage())
// 推荐 - 只在debug开启时执行
if logger.LogDebug() {
logger.Debug("Memory usage: %s", getMemoryUsage())
}
stdlog是线程安全的,适合在多线程环境中使用。
更多关于golang面向对象的分级日志记录插件库stdlog的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
更多关于golang面向对象的分级日志记录插件库stdlog的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
stdlog - Go语言分级日志记录插件库
stdlog 是一个轻量级的Go语言日志库,提供了分级日志记录功能,支持插件化扩展。下面我将详细介绍如何使用stdlog库。
安装
go get github.com/aybabtme/stdlog
基本用法
1. 简单日志记录
package main
import (
"github.com/aybabtme/stdlog"
)
func main() {
log := stdlog.LogTo(stdlog.Out, "example")
log.Info("这是一条信息日志")
log.Debug("这是一条调试日志")
log.Warn("这是一条警告日志")
log.Err("这是一条错误日志")
}
2. 日志级别控制
stdlog支持以下日志级别:
- Debug
- Info
- Warn
- Err
func main() {
// 设置日志级别为Warn,只记录Warn及以上级别的日志
log := stdlog.LogTo(stdlog.Out, "example").SetLevel(stdlog.Warn)
log.Debug("这条调试日志不会被记录")
log.Info("这条信息日志不会被记录")
log.Warn("这条警告日志会被记录")
log.Err("这条错误日志会被记录")
}
3. 结构化日志
func main() {
log := stdlog.LogTo(stdlog.Out, "example")
// 带字段的日志
log.InfoKV("用户登录", stdlog.KV{
"user_id": 12345,
"ip": "192.168.1.1",
})
// 更简洁的写法
log.Info("用户登录", "user_id", 12345, "ip", "192.168.1.1")
}
高级用法
1. 自定义输出
func main() {
// 输出到文件
file, err := os.Create("app.log")
if err != nil {
panic(err)
}
defer file.Close()
log := stdlog.LogTo(file, "file-logger")
log.Info("这条日志会写入文件")
// 输出到标准错误
errLog := stdlog.LogTo(os.Stderr, "error-logger")
errLog.Err("这条错误日志会输出到stderr")
}
2. 自定义格式
func main() {
log := stdlog.LogTo(stdlog.Out, "custom-format").SetFormat(func(lvl stdlog.Level, msg string, kv stdlog.KV) string {
return fmt.Sprintf("[%s] %s: %s %v", time.Now().Format(time.RFC3339), lvl, msg, kv)
})
log.Info("自定义格式日志", "key", "value")
}
3. 插件扩展
stdlog支持通过插件扩展功能,例如添加日志发送到远程服务器:
type RemoteLogPlugin struct {
client *http.Client
url string
}
func (p *RemoteLogPlugin) Log(lvl stdlog.Level, msg string, kv stdlog.KV) {
// 实现远程日志发送逻辑
// ...
}
func main() {
log := stdlog.LogTo(stdlog.Out, "with-plugin")
// 添加插件
plugin := &RemoteLogPlugin{
client: http.DefaultClient,
url: "https://example.com/log",
}
log.AddPlugin(plugin)
log.Info("这条日志会被本地记录并发送到远程服务器")
}
性能优化
对于高性能场景,可以使用缓冲写入:
func main() {
// 使用缓冲写入器
bufWriter := bufio.NewWriter(os.Stdout)
defer bufWriter.Flush()
log := stdlog.LogTo(bufWriter, "buffered")
for i := 0; i < 10000; i++ {
log.Info("高性能日志记录", "iteration", i)
}
}
最佳实践
-
合理使用日志级别:
- Debug: 调试信息
- Info: 重要业务信息
- Warn: 需要注意但不影响程序运行的情况
- Err: 错误情况
-
避免过度日志记录:只记录必要的信息,避免日志文件过大
-
结构化日志:尽量使用键值对形式记录日志,便于后续分析
-
区分日志输出:可以将不同级别的日志输出到不同的目标
-
生产环境配置:
func NewProductionLogger() stdlog.Logger { return stdlog.LogTo(stdlog.Out, "app"). SetLevel(stdlog.Info). // 生产环境通常不记录Debug日志 SetFormat(stdlog.JSONFormat) // 使用JSON格式便于日志收集系统处理 }
stdlog是一个简单但功能完善的日志库,适合大多数Go应用程序的日志需求。它的插件系统使得可以轻松扩展功能,满足各种定制化需求。