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"

使用场景示例

  1. 默认情况:除debug外所有日志输出到stdout,适合shell启动的程序

  2. crontab场景:配合-debug -flushlog=error参数,只在出错时发送所有日志邮件

  3. 日志文件:通过重定向输出到文件

    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

1 回复

更多关于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)
	}
}

最佳实践

  1. 合理使用日志级别

    • Debug: 调试信息
    • Info: 重要业务信息
    • Warn: 需要注意但不影响程序运行的情况
    • Err: 错误情况
  2. 避免过度日志记录:只记录必要的信息,避免日志文件过大

  3. 结构化日志:尽量使用键值对形式记录日志,便于后续分析

  4. 区分日志输出:可以将不同级别的日志输出到不同的目标

  5. 生产环境配置

    func NewProductionLogger() stdlog.Logger {
        return stdlog.LogTo(stdlog.Out, "app").
            SetLevel(stdlog.Info).  // 生产环境通常不记录Debug日志
            SetFormat(stdlog.JSONFormat)  // 使用JSON格式便于日志收集系统处理
    }
    

stdlog是一个简单但功能完善的日志库,适合大多数Go应用程序的日志需求。它的插件系统使得可以轻松扩展功能,满足各种定制化需求。

回到顶部