golang可配置多写入器日志记录插件库logo的使用

Golang可配置多写入器日志记录插件库logo的使用

简介

Logo是一个简单的Golang日志库,可以轻松配置多个io.Writers,并具有简单的激活和颜色开关功能。

banner

原理说明

Logger对象可以包含多个Receivers。每个Receiver包含:

  • 一个io.Writer对象(如os.Fileos.Stderr
  • 一个Level表示记录的最低日志级别
  • 一个布尔值Active表示是否启用该接收器
  • 一个布尔值Color表示是否启用彩色输出
  • 每个Receiver还有自己的日志格式

安装

首先安装包:

go get -u github.com/mbndr/logo

然后导入:

import "github.com/mbndr/logo"

初始化

简单方式

可以创建一个简单的logger,参数包括io.Writer、日志级别和颜色开关:

// 创建一个简单的cli logger,启用颜色并记录所有级别
log := logo.NewSimpleLogger(os.Stderr, logo.DEBUG, "prefix ", true)

高级方式

可以创建多个Receivers并添加到新的Logger中:

// 终端接收器,记录所有级别
cliRec := logo.NewReceiver(os.Stderr, "prefix ")
cliRec.Color = true
cliRec.Level = logo.DEBUG

// 辅助函数获取os.File
logFile, _ := logo.Open("./example/logo.log")

// 日志文件接收器
// 默认记录INFO级别,不启用颜色
// 日志格式更简单(如: ERRO: Message)
fileRec := logo.NewReceiver(logFile, "prefix ")
fileRec.Format = "%s: %s"

// 创建logger
log := logo.NewLogger(cliRec, fileRec)

使用

创建logo.Logger对象后,可以使用以下方法记录日志:

// 类似log.Println()的方法
log.Debug("First debug", " and another string to log")
log.Info("Information")
log.Warn("Warning", " message")
log.Error("Error message")
log.Fatal("Fatal error", " because of something")

// 类似log.Printf()的方法
log.Debugf("Debug value %d", 16)
log.Infof("Listening on port %d", 8080)
log.Warnf("Invalid user %s", user.Name)
log.Errorf("Couldn't load config file: %s", path)
log.Fatalf("Fatal error: %s", err.Error())

// 禁用logger
log.Active = false

测试

该项目包含一些单元测试,运行测试:

go test -v

完整示例

package main

import (
	"github.com/mbndr/logo"
	"os"
)

func main() {
	// 创建终端接收器
	cliRec := logo.NewReceiver(os.Stderr, "APP ")
	cliRec.Color = true
	cliRec.Level = logo.DEBUG

	// 创建文件接收器
	fileRec := logo.NewReceiver(os.Stdout, "FILE ")
	fileRec.Format = "%s: %s"

	// 创建logger
	log := logo.NewLogger(cliRec, fileRec)

	// 记录日志
	log.Debug("This is a debug message")
	log.Info("Application started")
	log.Warn("This is a warning")
	log.Error("An error occurred")
	log.Infof("User %s logged in", "john")
}

这个示例展示了如何同时将日志输出到终端(带颜色)和文件(简单格式)。


更多关于golang可配置多写入器日志记录插件库logo的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang可配置多写入器日志记录插件库logo的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


Golang 可配置多写入器日志记录插件库 Logo 使用指南

Logo 是一个轻量级的 Go 日志库,支持多写入器配置,可以将日志同时输出到控制台、文件、网络等多种目标。下面我将详细介绍如何使用 Logo 库。

安装 Logo

首先使用 go get 安装 Logo 库:

go get github.com/ebrianne/logo

基本使用

简单示例

package main

import (
	"github.com/ebrianne/logo"
)

func main() {
	// 创建一个默认的日志记录器(输出到控制台)
	logger := logo.New()

	// 记录不同级别的日志
	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")
}

配置多个写入器

package main

import (
	"github.com/ebrianne/logo"
	"os"
)

func main() {
	// 创建配置
	config := logo.Configuration{
		MinLevel: logo.Debug,
		Writers: []logo.WriterConfig{
			{
				Writer:    os.Stdout, // 控制台输出
				Formatter: logo.NewJSONFormatter(),
				Levels:    []logo.Level{logo.Debug, logo.Info, logo.Warn, logo.Error},
			},
			{
				Writer:    logo.NewFileWriter("app.log"), // 文件输出
				Formatter: logo.NewTextFormatter(),
				Levels:    []logo.Level{logo.Warn, logo.Error},
			},
		},
	}

	// 使用配置创建日志记录器
	logger := logo.NewWithConfig(config)

	// 记录日志
	logger.Debug("Debug message")
	logger.Info("Info message")
	logger.Warn("Warning message")
	logger.Error("Error message")
}

高级配置

自定义格式化

package main

import (
	"github.com/ebrianne/logo"
	"os"
)

func main() {
	// 自定义格式化函数
	customFormatter := func(level logo.Level, message string) string {
		return fmt.Sprintf("[%s] %s - %s\n", time.Now().Format("2006-01-02 15:04:05"), level.String(), message)
	}

	config := logo.Configuration{
		MinLevel: logo.Info,
		Writers: []logo.WriterConfig{
			{
				Writer: os.Stdout,
				Formatter: logo.FormatterFunc(customFormatter),
				Levels:    []logo.Level{logo.Info, logo.Warn, logo.Error},
			},
		},
	}

	logger := logo.NewWithConfig(config)
	logger.Info("Custom formatted message")
}

添加字段

package main

import (
	"github.com/ebrianne/logo"
)

func main() {
	logger := logo.New()
	
	// 添加字段到日志
	logger.WithFields(logo.Fields{
		"user_id": 123,
		"action":  "login",
	}).Info("User logged in")
}

动态修改日志级别

package main

import (
	"github.com/ebrianne/logo"
)

func main() {
	logger := logo.New()
	
	// 默认只记录Info及以上级别
	logger.Info("This will be logged")
	logger.Debug("This won't be logged")
	
	// 动态修改为Debug级别
	logger.SetMinLevel(logo.Debug)
	logger.Debug("Now this will be logged")
}

最佳实践

  1. 生产环境配置:在生产环境中,建议将Debug日志写入文件而不输出到控制台

  2. 错误处理:对于关键错误,可以配置额外的写入器发送到监控系统

  3. 性能考虑:对于高频日志,考虑使用异步写入器

package main

import (
	"github.com/ebrianne/logo"
	"os"
)

func main() {
	config := logo.Configuration{
		MinLevel: logo.Info,
		Writers: []logo.WriterConfig{
			{
				Writer:    logo.NewAsyncWriter(os.Stdout), // 异步控制台输出
				Formatter: logo.NewJSONFormatter(),
				Levels:    []logo.Level{logo.Info, logo.Warn},
			},
			{
				Writer:    logo.NewFileWriter("errors.log"),
				Formatter: logo.NewTextFormatter(),
				Levels:    []logo.Level{logo.Error},
			},
		},
	}

	logger := logo.NewWithConfig(config)
	
	// 高频日志不会阻塞主程序
	for i := 0; i < 1000; i++ {
		logger.Info("Processing item", logo.Fields{"item": i})
	}
}

Logo 提供了灵活而强大的日志记录功能,通过合理配置可以满足各种日志需求,同时保持代码简洁和高效。

回到顶部