golang简单可配置的日志记录插件库go-log的使用

go-log - Golang简单可配置的日志记录插件库

介绍

go-log是一个类似于log4j的Golang日志记录包,具有以下特性:

  • 支持动态日志级别
  • 支持自定义格式化器
    • TextFormatter
    • JSONFormatter
  • 支持多种滚动文件写入器
    • FixedSizeFileWriter
    • DailyFileWriter
    • AlwaysNewFileWriter

安装

$ go get github.com/subchen/go-log

使用示例

基本用法

package main

import (
	"os"
	"errors"
	"github.com/subchen/go-log"
)

func main() {
	log.Debugf("app = %s", os.Args[0])  // 调试级别日志
	log.Errorf("error = %v", errors.New("some error"))  // 错误级别日志

	// 动态设置日志级别
	log.Default.Level = log.WARN

	log.Debug("cannot output debug message")  // 这条不会输出,因为级别设置为WARN
	log.Errorln("can output error message", errors.New("some error"))  // 这条会输出
}

文件输出

默认日志输出到控制台,你可以设置Logger.Out来将日志写入文件:

import (
	"github.com/subchen/go-log"
	"github.com/subchen/go-log/writers"
)

log.Default.Out = &writers.FixedSizeFileWriter{
	Name:     "/tmp/test.log",
	MaxSize:  10 * 1024 * 1024, // 10MB
	MaxCount: 10,
}

内置写入器

有三种内置的写入器可供使用:

// 当文件大小超过固定大小(10MB)时创建新日志文件
// 文件格式: /tmp/test.log.0 .. test.log.10
&writers.FixedSizeFileWriter{
	Name:     "/tmp/test.log",
	MaxSize:  10 * 1024 * 1024, // 10MB
	MaxCount: 10,
}

// 每天创建新的日志文件
// 文件格式: /tmp/test.log.20160102
&writers.DailyFileWriter{
	Name: "/tmp/test.log",
	MaxCount: 10,
}

// 每次进程运行时创建新的日志文件
// 文件格式: /tmp/test.log.20160102_150405
&writers.AlwaysNewFileWriter{
	Name: "/tmp/test.log",
	MaxCount: 10,
}

// 输出到多个写入器
io.MultiWriter(
	os.Stdout,
	&writers.DailyFileWriter{
		Name: "/tmp/test.log",
		MaxCount: 10,
	}
	//...
)

格式化器

import (
	"github.com/subchen/go-log"
	"github.com/subchen/go-log/formatters"
)

// 使用文本格式化器
log.Default.Formatter = new(formatters.TextFormatter)

// 使用JSON格式化器
log.Default.Formatter = new(formatters.JSONFormatter)

创建新的Logger实例

import (
	"github.com/subchen/go-log"
)

func main() {
	logger := &log.Logger{
		Level:     log.INFO,
		Formatter: new(formatters.JSONFormatter),
		Out:       os.Stdout,
	}

	logger.Infof("i = %d", 99)
}

完整示例

下面是一个完整的示例,展示了如何使用go-log进行日志记录:

package main

import (
	"os"
	"errors"
	"io"
	"github.com/subchen/go-log"
	"github.com/subchen/go-log/formatters"
	"github.com/subchen/go-log/writers"
)

func main() {
	// 配置默认logger
	log.Default.Level = log.DEBUG
	log.Default.Formatter = new(formatters.TextFormatter)
	
	// 输出到控制台和文件
	log.Default.Out = io.MultiWriter(
		os.Stdout,
		&writers.DailyFileWriter{
			Name:     "/tmp/myapp.log",
			MaxCount: 7, // 保留7天的日志
		},
	)

	// 记录不同级别的日志
	log.Debug("This is a debug message")
	log.Info("This is an info message")
	log.Warn("This is a warning message")
	log.Error("This is an error message")
	
	// 带格式的日志
	log.Infof("Starting application: %s", os.Args[0])
	log.Errorf("Error occurred: %v", errors.New("something went wrong"))

	// 创建自定义logger
	customLogger := &log.Logger{
		Level:     log.WARN,
		Formatter: new(formatters.JSONFormatter),
		Out:       os.Stderr,
	}
	
	customLogger.Warn("This is a warning from custom logger")
	customLogger.Error("This is an error from custom logger")
}

许可证

Apache 2.0


更多关于golang简单可配置的日志记录插件库go-log的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang简单可配置的日志记录插件库go-log的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


go-log 日志库使用指南

go-log 是一个简单可配置的 Golang 日志记录库,提供了灵活的日志级别、输出格式和输出目标配置。下面我将详细介绍其使用方法。

安装

go get github.com/your-repo/go-log

基本使用

package main

import (
	"github.com/your-repo/go-log"
)

func main() {
	// 初始化默认日志记录器
	logger := go_log.NewLogger()

	// 记录不同级别日志
	logger.Debug("这是一条调试信息")
	logger.Info("这是一条普通信息")
	logger.Warn("这是一条警告信息")
	logger.Error("这是一条错误信息")
	
	// 格式化日志
	logger.Infof("用户 %s 登录成功,登录IP: %s", "张三", "192.168.1.100")
}

配置选项

go-log 提供了多种配置选项:

package main

import (
	"github.com/your-repo/go-log"
	"os"
)

func main() {
	// 创建带配置的日志记录器
	logger := go_log.NewLogger(
		go_log.WithLevel(go_log.DebugLevel),  // 设置日志级别
		go_log.WithOutput(os.Stdout),       // 设置输出目标
		go_log.WithFormatter(&go_log.JSONFormatter{}), // JSON格式
		go_log.WithTimeFormat("2006-01-02 15:04:05"), // 时间格式
		go_log.WithCaller(true),            // 显示调用者信息
	)
	
	// 使用配置好的日志记录器
	logger.Info("配置好的日志记录器")
}

日志级别

go-log 支持以下日志级别:

logger.Debug("调试信息 - 最详细的日志级别")
logger.Info("普通信息 - 常规操作日志")
logger.Warn("警告信息 - 需要注意但不影响程序运行")
logger.Error("错误信息 - 需要立即关注的错误")
logger.Fatal("致命错误 - 记录后调用os.Exit(1)")
logger.Panic("紧急错误 - 记录后调用panic()")

多输出目标

可以将日志同时输出到多个目标:

package main

import (
	"github.com/your-repo/go-log"
	"os"
)

func main() {
	file, _ := os.OpenFile("app.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
	
	logger := go_log.NewLogger(
		go_log.WithOutput(go_log.MultiWriter(os.Stdout, file)),
	)
	
	logger.Info("这条日志会同时输出到控制台和文件")
}

自定义格式

go-log 支持自定义日志格式:

package main

import (
	"github.com/your-repo/go-log"
)

// 自定义格式化器
type MyFormatter struct{}

func (f *MyFormatter) Format(entry *go_log.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
}

func main() {
	logger := go_log.NewLogger(
		go_log.WithFormatter(&MyFormatter{}),
	)
	
	logger.Info("使用自定义格式的日志")
}

上下文日志

go-log 支持添加上下文字段:

package main

import (
	"github.com/your-repo/go-log"
)

func main() {
	logger := go_log.NewLogger()
	
	// 添加上下文字段
	contextLogger := logger.WithFields(map[string]interface{}{
		"user_id": 12345,
		"ip": "192.168.1.100",
	})
	
	contextLogger.Info("用户操作日志")
	// 输出示例: time="..." level=info msg="用户操作日志" user_id=12345 ip=192.168.1.100
}

性能考虑

对于高性能场景,可以使用异步日志:

package main

import (
	"github.com/your-repo/go-log"
)

func main() {
	// 创建异步日志记录器
	asyncLogger := go_log.NewAsyncLogger(
		go_log.NewLogger(),
		1000, // 缓冲区大小
	)
	
	defer asyncLogger.Close() // 程序退出前确保刷新缓冲区
	
	// 高性能日志记录
	for i := 0; i < 10000; i++ {
		asyncLogger.Info("高性能日志记录", i)
	}
}

最佳实践

  1. 在应用程序初始化时配置全局日志记录器
  2. 根据环境变量动态设置日志级别
  3. 生产环境推荐使用JSON格式便于日志分析
  4. 关键业务路径添加足够的上下文信息
package main

import (
	"github.com/your-repo/go-log"
	"os"
)

var logger *go_log.Logger

func init() {
	// 根据环境变量设置日志级别
	level := go_log.InfoLevel
	if os.Getenv("DEBUG") == "true" {
		level = go_log.DebugLevel
	}
	
	logger = go_log.NewLogger(
		go_log.WithLevel(level),
		go_log.WithFormatter(&go_log.JSONFormatter{}),
		go_log.WithCaller(true),
	)
}

func main() {
	logger.Info("应用程序启动")
	
	// 业务逻辑...
	
	logger.WithFields(map[string]interface{}{
		"user": "admin",
		"action": "delete",
	}).Warn("敏感操作警告")
}

go-log 的设计目标是简单易用同时保持足够的灵活性,适合大多数Golang项目的日志需求。

回到顶部