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)

文档参考

GoDoc


更多关于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消息会显示")
}

最佳实践

  1. 合理使用日志级别

    • DEBUG: 开发调试信息
    • INFO: 重要的运行时信息
    • WARN: 需要注意但不影响程序运行的问题
    • ERROR: 错误但可以恢复的情况
    • FATAL: 致命错误,程序无法继续运行
  2. 生产环境建议

    • 将日志级别设置为INFO或WARN
    • 使用JSON格式便于日志分析
    • 实现日志轮转防止日志文件过大
  3. 性能考虑

    • 避免在循环中记录大量DEBUG日志
    • 对于性能敏感场景,可以考虑使用异步日志

go-log是一个灵活且功能丰富的日志库,通过合理配置可以满足大多数Go应用程序的日志需求。根据项目实际情况选择合适的日志级别和处理器组合,可以大大提高系统的可维护性和问题排查效率。

回到顶部