golang支持多处理器和日志分级的日志库插件go-log的使用
golang支持多处理器和日志分级的日志库插件go-log的使用
go-log简介
go-log是一个支持日志分级和多处理器的Golang日志库插件。
使用方法
基本使用示例
import "github.com/siddontang/go-log/log"
// 使用不同级别记录日志
log.Info("hello world") // 信息级别日志
log.Error("hello world") // 错误级别日志
// 创建一个带有指定处理器的logger
h := NewStreamHandler(os.Stdout) // 创建输出到标准输出的处理器
l := log.NewDefault(h) // 创建默认logger
l.Info("hello world") // 使用自定义logger记录日志
完整示例demo
下面是一个更完整的示例,展示如何使用go-log进行日志分级和多处理器配置:
package main
import (
"os"
"github.com/siddontang/go-log/log"
)
func main() {
// 创建一个输出到标准输出的处理器
stdoutHandler := log.NewStreamHandler(os.Stdout)
// 创建一个输出到文件的处理器
file, err := os.OpenFile("app.log", os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0666)
if err != nil {
log.Fatal(err)
}
fileHandler := log.NewStreamHandler(file)
// 创建一个logger,设置日志级别为Info,并添加多个处理器
logger := log.NewDefault(stdoutHandler)
logger.SetLevel(log.LevelInfo) // 设置日志级别
logger.AddHandler(fileHandler) // 添加文件处理器
// 记录不同级别的日志
logger.Debug("这是一条Debug日志") // 不会输出,因为级别高于Debug
logger.Info("这是一条Info日志") // 会输出
logger.Warn("这是一条Warning日志") // 会输出
logger.Error("这是一条Error日志") // 会输出
// 关闭文件处理器
file.Close()
}
日志级别说明
go-log支持以下日志级别(从低到高):
LevelDebug
LevelInfo
LevelWarn
LevelError
LevelFatal
设置日志级别后,只有等于或高于该级别的日志才会被记录。
多处理器配置
go-log支持同时使用多个处理器,例如可以同时输出到控制台和文件:
// 创建控制台处理器
consoleHandler := log.NewStreamHandler(os.Stdout)
// 创建文件处理器
fileHandler := log.NewStreamHandler(logFile)
// 创建logger并添加多个处理器
logger := log.NewDefault(consoleHandler)
logger.AddHandler(fileHandler)
文档参考
更多关于golang支持多处理器和日志分级的日志库插件go-log的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于golang支持多处理器和日志分级的日志库插件go-log的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
Go语言多处理器与日志分级库go-log使用指南
go-log简介
go-log是一个功能强大的Go语言日志库,支持多处理器(Handler)和日志分级(Level)功能。它提供了灵活的日志记录方式,可以同时将日志输出到多个目标(如控制台、文件、网络等),并且支持不同级别的日志过滤。
基本特性
- 支持多种日志级别:DEBUG, INFO, WARN, ERROR, FATAL等
- 支持多处理器同时输出
- 可自定义日志格式
- 线程安全
- 轻量级设计
安装
go get github.com/ipfs/go-log
基础使用示例
package main
import (
"os"
logging "github.com/ipfs/go-log"
)
func main() {
// 初始化日志系统
logging.SetupLogging(logging.Config{
Format: logging.JSONOutput,
Stderr: true,
Level: logging.LevelDebug,
File: "app.log",
})
// 获取日志记录器
log := logging.Logger("main")
// 记录不同级别的日志
log.Debug("这是一条调试信息")
log.Info("这是一条普通信息")
log.Warn("这是一条警告信息")
log.Error("这是一条错误信息")
// log.Fatal("致命错误,将退出程序") // 会调用os.Exit(1)
}
多处理器配置示例
package main
import (
"os"
logging "github.com/ipfs/go-log"
)
func main() {
// 创建多个日志处理器
consoleHandler := logging.NewHandler(os.Stderr, logging.TextOutput)
fileHandler, err := logging.NewFileHandler("application.log", logging.JSONOutput)
if err != nil {
panic(err)
}
// 配置日志系统
logging.SetupLogging(logging.Config{
Handlers: []logging.Handler{consoleHandler, fileHandler},
Level: logging.LevelInfo,
})
log := logging.Logger("multi-handler")
log.Info("这条消息会同时输出到控制台和文件")
log.Debug("这条调试消息不会被记录,因为日志级别设置为INFO")
}
自定义日志格式
package main
import (
"os"
logging "github.com/ipfs/go-log"
)
func main() {
// 自定义日志格式函数
customFormatter := func(msg *logging.Message) string {
return fmt.Sprintf("[%s] %s - %s: %s\n",
msg.Time.Format("2006-01-02 15:04:05"),
msg.Level.String(),
msg.System,
msg.Text)
}
// 创建自定义格式的处理器
handler := logging.NewHandler(os.Stdout, logging.Formatter(customFormatter))
logging.SetupLogging(logging.Config{
Handlers: []logging.Handler{handler},
Level: logging.LevelDebug,
})
log := logging.Logger("custom-format")
log.Info("这是一条自定义格式的日志消息")
}
动态修改日志级别
package main
import (
"os"
"time"
logging "github.com/ipfs/go-log"
)
func main() {
logging.SetupLogging(logging.Config{
Format: logging.TextOutput,
Stderr: true,
Level: logging.LevelInfo,
})
log := logging.Logger("dynamic-level")
log.Info("初始日志级别为INFO,只能看到INFO及以上级别的日志")
log.Debug("这条DEBUG消息不会显示")
// 5秒后修改日志级别
time.AfterFunc(5*time.Second, func() {
logging.SetAllLoggers(logging.LevelDebug)
log.Info("已将日志级别修改为DEBUG")
log.Debug("现在可以看到DEBUG消息了")
})
time.Sleep(10 * time.Second)
}
为不同模块设置不同日志级别
package main
import (
"os"
logging "github.com/ipfs/go-log"
)
func main() {
logging.SetupLogging(logging.Config{
Format: logging.TextOutput,
Stderr: true,
Level: logging.LevelInfo, // 默认级别
})
// 设置特定模块的日志级别
logging.SetLogLevel("module1", "debug")
logging.SetLogLevel("module2", "error")
log1 := logging.Logger("module1")
log2 := logging.Logger("module2")
log1.Debug("module1的DEBUG消息会显示")
log2.Debug("module2的DEBUG消息不会显示")
log2.Error("module2的ERROR消息会显示")
}
最佳实践
-
合理使用日志级别:
- DEBUG: 开发调试信息
- INFO: 重要的运行时信息
- WARN: 需要注意但不影响程序运行的问题
- ERROR: 错误但可以恢复的情况
- FATAL: 致命错误,程序无法继续运行
-
生产环境建议:
- 将日志级别设置为INFO或WARN
- 使用JSON格式便于日志分析
- 实现日志轮转防止日志文件过大
-
性能考虑:
- 避免在循环中记录大量DEBUG日志
- 对于性能敏感场景,可以考虑使用异步日志
go-log是一个灵活且功能丰富的日志库,通过合理配置可以满足大多数Go应用程序的日志需求。根据项目实际情况选择合适的日志级别和处理器组合,可以大大提高系统的可维护性和问题排查效率。