golang实现Log4j风格日志记录的插件库go-log的使用
Golang实现Log4j风格日志记录的插件库go-log的使用
介绍
go-log是一个Golang日志库,兼容log
和log4go
,在大多数情况下可以直接使用而无需修改代码。
安装
使用以下命令安装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的对比
-
相似点:
- 支持多级别日志(Debug, Info, Warn, Error等)
- 支持自定义输出格式
- 支持多输出目标(控制台、文件等)
- 支持Logger继承体系
-
不同点:
- Go-log没有Log4j的Appender概念
- 配置方式更简单直接
- 没有XML/JSON配置文件支持
- 性能考虑更符合Go语言习惯
其他替代方案
如果你需要更接近Log4j功能的库,也可以考虑:
logrus
: 功能丰富,支持hookszap
: 高性能结构化日志zerolog
: 零分配JSON日志
希望这个go-log的使用指南能帮助你实现类似Log4j的日志功能。根据项目需求,你可以选择最适合的日志库。