Golang中如何让Logrus与Viper协同工作

Golang中如何让Logrus与Viper协同工作 我正在尝试让 logrus 从 viper 读取配置。

使用 logrus 中推荐的库如下。

GitHub GitHub

头像

heirko/go-contrib

用于日志配置的助手,带有 fangs 的属性的 Mixin - heirko/go-contrib

我尝试以分组的方式设置我的配置。 例如在 yml 格式中,将 logging 及其所有属性放在一起。

我不确定如何使其工作,因为示例看起来似乎不可能实现。

github.com

heirko/go-contrib/blob/master/logrusHelper_test/logrusHelper_test.go

package logrusHelper_Test
// there is a bug in go < 1.9 with test only package and name, bug on namespace, we need to break recognition...

import (
	"testing"

	"fmt"
	"os"

	"github.com/heirko/go-contrib/logrusHelper"
	_ "github.com/heralight/logrus_mate/hooks/file"
	"github.com/sirupsen/logrus"
	"github.com/spf13/viper"

	"time"

	. "github.com/smartystreets/goconvey/convey"
)

func initLogger() {

此文件已被截断。显示原文

我的属性文件: app: port: 80 name: testappsvcliv db: enable: “N” driver: pgx url: postgres://postgres:postpass@localhost/pqgotest max-open: 5 max-idle: 0 max-timeout: 100ms logging:

  • level: debug*

更多关于Golang中如何让Logrus与Viper协同工作的实战教程也可以访问 https://www.itying.com/category-94-b0.html

2 回复

GitHub

头像

heirko/go-contrib

日志配置助手,带尖牙属性的Mixin - heirko/go-contrib

由于该仓库没有分支创建权限,我添加了一个包含解决方案的议题追踪器。 或者,你也可以在自己的代码库中编写这个函数,而无需等待它被库吸收。

更多关于Golang中如何让Logrus与Viper协同工作的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


使用 logrusHelper 可以让 Logrus 与 Viper 协同工作。以下是具体实现方式:

首先安装依赖:

go get github.com/heirko/go-contrib/logrusHelper

创建配置文件 config.yaml

app:
  port: 80
  name: testappsvcliv

logging:
  level: debug
  formatter:
    name: text
    options:
      force-colors: true
      full-timestamp: true
  hooks:
    - name: file
      options:
        filename: app.log
        maxsize: 10485760
        maxbackups: 3
        maxage: 28

主程序实现:

package main

import (
	"fmt"
	"os"

	"github.com/heirko/go-contrib/logrusHelper"
	"github.com/sirupsen/logrus"
	"github.com/spf13/viper"
	_ "github.com/heralight/logrus_mate/hooks/file"
)

func main() {
	// 初始化 Viper
	v := viper.New()
	v.SetConfigName("config")
	v.AddConfigPath(".")
	v.SetConfigType("yaml")

	// 读取配置
	if err := v.ReadInConfig(); err != nil {
		fmt.Printf("Error reading config: %v\n", err)
		os.Exit(1)
	}

	// 创建 Logrus 实例
	log := logrus.New()

	// 使用 logrusHelper 从 Viper 配置 Logrus
	config := v.Sub("logging")
	if config == nil {
		fmt.Println("logging configuration not found")
		os.Exit(1)
	}

	err := logrusHelper.SetConfig(log, config)
	if err != nil {
		fmt.Printf("Error setting logrus config: %v\n", err)
		os.Exit(1)
	}

	// 测试日志输出
	log.Debug("Debug level message")
	log.Info("Info level message")
	log.Warn("Warn level message")
	log.Error("Error level message")

	// 验证配置
	fmt.Printf("Current log level: %v\n", log.GetLevel())
}

使用环境变量覆盖配置:

// 支持环境变量
v.AutomaticEnv()
v.SetEnvPrefix("APP")
v.BindEnv("logging.level")

// 从环境变量读取日志级别
if envLevel := v.GetString("logging.level"); envLevel != "" {
	level, err := logrus.ParseLevel(envLevel)
	if err == nil {
		log.SetLevel(level)
	}
}

程序化配置示例:

// 如果需要程序化配置
v.SetDefault("logging.level", "info")
v.SetDefault("logging.formatter.name", "json")
v.SetDefault("logging.formatter.options.timestampFormat", "2006-01-02 15:04:05")

// 重新应用配置
err = logrusHelper.SetConfig(log, v.Sub("logging"))
if err != nil {
	log.WithError(err).Fatal("Failed to reload logrus config")
}

这样配置后,Logrus 会从 Viper 读取 logging 部分的配置,包括日志级别、格式化和钩子设置。

回到顶部