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)
}
}
最佳实践
- 在应用程序初始化时配置全局日志记录器
- 根据环境变量动态设置日志级别
- 生产环境推荐使用JSON格式便于日志分析
- 关键业务路径添加足够的上下文信息
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项目的日志需求。