golang实现Log4j风格日志记录的插件库go-log的使用

Golang实现Log4j风格日志记录的插件库go-log的使用

介绍

go-log是一个Golang日志库,兼容loglog4go,在大多数情况下可以直接使用而无需修改代码。

安装

使用以下命令安装go-log:

go get github.com/ian-kent/go-log/log

基本使用

简单日志记录

import(
  "github.com/ian-kent/go-log/log"
)

// 直接传递日志消息和参数
log.Debug("Example log message: %s", "example arg")

// 传递返回日志消息和参数的函数
log.Debug(func(){[]interface{}{"Example log message: %s", "example arg"}})
log.Debug(func(i ...interface{}){[]interface{}{"Example log message: %s", "example arg"}})

获取日志记录器实例

// 获取默认日志记录器
logger := log.Logger()
logger.Debug("Yey!")

// 获取命名日志记录器
logger := log.Logger("foo.bar")

日志级别

默认日志级别是DEBUG。

获取和设置日志级别

// 获取当前日志级别
level := logger.Level()

// 从LogLevel设置
logger.SetLevel(levels.TRACE)

// 从字符串设置
logger.SetLevel(log.Stol("TRACE"))

日志附加器(Appenders)

默认日志附加器是appenders.Console(),它将原始消息记录到STDOUT。

获取和设置附加器

// 获取当前附加器
appender := logger.Appender()

// 设置附加器
logger.SetAppender(appenders.Console())

滚动文件附加器

// 追加到(或创建)文件
logger.SetAppender(appenders.RollingFile("filename.log", true))

// 截断(或创建)文件
logger.SetAppender(appenders.RollingFile("filename.log", false))

// 控制备份文件数量
r := appenders.RollingFile("filename.log", true)
r.MaxBackupIndex = 2 // filename.log, filename.log.1, filename.log.2

// 控制最大文件大小(字节)
r := appenders.RollingFile("filename.log", true)
r.MaxFileSize = 1024 // 1KB, 默认为100MB

Fluentd附加器

logger.SetAppender(appenders.Fluentd(fluent.Config{}))

布局(Layouts)

每个附加器都有自己的布局,允许在写入附加器时转换日志数据。

获取和设置布局

// 获取当前布局
appender := logger.Appender()
layout := appender.Layout()

// 设置布局
appender.SetLayout(layout.Basic())

模式布局

// 使用类似log4j的模式格式
appender.SetLayout(layout.Pattern("%d [%p] %c - %m%n"))

模式代码说明:

代码 描述
%c 日志语句所在的包
%C 目前也是日志语句所在的包
%d 当前日期/时间,使用time.Now().String()
%F 日志语句所在的文件名
%l 日志语句的位置,如package/somefile.go:12
%L 日志语句所在的行号
%m 使用fmt.Sprintf格式化的日志消息及其参数
%n 换行符
%p 优先级 - 日志级别
%r 自创建记录器以来的毫秒数

日志记录器继承

日志记录器使用.命名空间,遵循与Log4j类似的规则。

logger := log.Logger("foo.bar")
logger.SetLevel(levels.TRACE)
logger.SetAppender(appenders.Console())

完整示例

package main

import (
	"github.com/ian-kent/go-log/log"
	"github.com/ian-kent/go-log/log/levels"
	"github.com/ian-kent/go-log/log/appenders"
	"github.com/ian-kent/go-log/log/layout"
)

func main() {
	// 获取根日志记录器
	rootLogger := log.Logger()
	
	// 设置日志级别为DEBUG
	rootLogger.SetLevel(levels.DEBUG)
	
	// 设置控制台附加器,使用自定义模式布局
	consoleAppender := appenders.Console()
	consoleAppender.SetLayout(layout.Pattern("%d [%p] %c - %m%n"))
	rootLogger.SetAppender(consoleAppender)
	
	// 记录不同级别的日志
	rootLogger.Debug("This is a debug message")
	rootLogger.Info("This is an info message")
	rootLogger.Warn("This is a warning message")
	rootLogger.Error("This is an error message")
	
	// 创建命名日志记录器
	serviceLogger := log.Logger("myapp.service")
	
	// 设置滚动文件附加器
	fileAppender := appenders.RollingFile("service.log", true)
	fileAppender.MaxBackupIndex = 3
	fileAppender.MaxFileSize = 1024 * 1024 // 1MB
	serviceLogger.SetAppender(fileAppender)
	
	// 使用命名日志记录器
	serviceLogger.Info("Service started")
	serviceLogger.Debug("Processing request #%d", 123)
	
	// 创建子日志记录器
	dbLogger := log.Logger("myapp.service.database")
	dbLogger.SetLevel(levels.TRACE)
	dbLogger.Trace("Database connection established")
}

注意事项

go-log与默认的Go 'log’包不一致,log.Fatal调用不会触发os.Exit(1)。这已在当前版本的go-log中修复,可能会破坏向后兼容性。

可以通过设置ExitOnFatal为false来禁用此修复:

log.Logger().ExitOnFatal = false

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

1 回复

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


Go-Log: Golang实现Log4j风格的日志库

Log4j是Java生态中非常流行的日志框架,在Golang中虽然没有完全相同的实现,但我们可以使用一些类似风格的库。下面介绍如何使用go-log库实现类似Log4j风格的日志记录。

安装go-log

go get github.com/ipfs/go-log

基本使用示例

package main

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

func main() {
	// 初始化日志系统
	log.SetupLogging(log.Config{
		Format: log.ColorizedOutput,
		Stderr: true,
		Level:  log.LevelDebug,
	})

	// 获取logger实例
	logger := log.Logger("myapp")

	// 不同级别日志记录
	logger.Debug("This is a debug message")
	logger.Info("This is an info message")
	logger.Warn("This is a warning message")
	logger.Error("This is an error message")
	// logger.Fatal("This is a fatal message") // 会调用os.Exit(1)
	// logger.Panic("This is a panic message") // 会panic
}

类似Log4j的特性实现

1. 日志级别控制

// 设置全局日志级别
log.SetAllLoggers(log.LevelWarn)

// 设置特定logger的级别
log.SetLogLevel("myapp", "info")

// 可用级别: debug, info, warn, error, fatal, panic

2. 日志格式自定义

import (
	"os"
	"time"
)

func customLogger() {
	logger := log.Logger("custom")

	// 自定义输出格式
	logger.Formatter = func(level string, name string, time time.Time, err error, msg string) string {
		return fmt.Sprintf("[%s] %s %s: %s\n", 
			level, 
			time.Format("2006-01-02 15:04:05"), 
			name, 
			msg)
	}

	logger.Info("Custom formatted log message")
}

3. 日志输出到文件

func fileLogger() {
	file, err := os.OpenFile("app.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
	if err != nil {
		log.Fatal("Failed to open log file")
	}

	logger := log.Logger("filelogger")
	logger.Out = file // 重定向输出到文件

	logger.Info("This will be written to the file")
}

4. 多Logger和Logger继承

func multiLogger() {
	// 父logger
	parent := log.Logger("parent")
	parent.Info("Parent logger message")

	// 子logger继承父logger的配置
	child := log.Logger("parent.child")
	child.Info("Child logger message")
}

高级特性

1. 结构化日志

func structuredLogging() {
	logger := log.Logger("structured")

	// 类似Log4j的MDC(Mapped Diagnostic Context)
	logger = logger.WithFields(map[string]interface{}{
		"request_id": "12345",
		"user":       "john_doe",
	})

	logger.Info("Processing request")
	// 输出: [INFO] Processing request request_id=12345 user=john_doe
}

2. 异步日志记录

func asyncLogging() {
	logger := log.Logger("async")
	ch := make(chan string, 100) // 缓冲通道

	// 启动日志处理goroutine
	go func() {
		for msg := range ch {
			logger.Out.Write([]byte(msg))
		}
	}()

	// 设置自定义输出到通道
	logger.Out = &channelWriter{ch: ch}

	logger.Info("This log is written asynchronously")
}

type channelWriter struct {
	ch chan string
}

func (w *channelWriter) Write(p []byte) (n int, err error) {
	w.ch <- string(p)
	return len(p), nil
}

与Log4j的对比

  1. 相似点:

    • 支持多级别日志(Debug, Info, Warn, Error等)
    • 支持自定义输出格式
    • 支持多输出目标(控制台、文件等)
    • 支持Logger继承体系
  2. 不同点:

    • Go-log没有Log4j的Appender概念
    • 配置方式更简单直接
    • 没有XML/JSON配置文件支持
    • 性能考虑更符合Go语言习惯

其他替代方案

如果你需要更接近Log4j功能的库,也可以考虑:

  • logrus: 功能丰富,支持hooks
  • zap: 高性能结构化日志
  • zerolog: 零分配JSON日志

希望这个go-log的使用指南能帮助你实现类似Log4j的日志功能。根据项目需求,你可以选择最适合的日志库。

回到顶部