You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用zerolog将不同级别日志分别输出到stdout和stderr

Zerolog按日志级别分流至Stdout和Stderr的实现

你可以通过zerolog的LevelFilter和MultiLevelWriter组件实现按级别分流日志,具体实现如下:

完整代码示例

package main

import (
	"os"

	"github.com/rs/zerolog"
	"github.com/rs/zerolog/log"
)

func main() {
	// 设置全局日志级别为Debug,确保所有目标级别都能被处理
	zerolog.SetGlobalLevel(zerolog.DebugLevel)

	// 配置Stdout输出:仅处理Debug、Info、Warn级别
	stdoutWriter := zerolog.ConsoleWriter{Out: os.Stdout, TimeFormat: "15:04:05"}
	stdoutFilter := zerolog.LevelFilter{
		Writer:   stdoutWriter,
		MinLevel: zerolog.DebugLevel,
		MaxLevel: zerolog.WarnLevel,
	}

	// 配置Stderr输出:仅处理Error、Fatal、Panic级别
	stderrWriter := zerolog.ConsoleWriter{Out: os.Stderr, TimeFormat: "15:04:05"}
	stderrFilter := zerolog.LevelFilter{
		Writer:   stderrWriter,
		MinLevel: zerolog.ErrorLevel,
		MaxLevel: zerolog.PanicLevel,
	}

	// 合并两个带过滤规则的Writer
	log.Logger = log.Output(zerolog.MultiLevelWriter(stdoutFilter, stderrFilter))

	// 测试不同级别日志输出
	log.Debug().Msg("Debug级日志(输出到Stdout)")
	log.Info().Msg("Info级日志(输出到Stdout)")
	log.Warn().Msg("Warn级日志(输出到Stdout)")
	log.Error().Msg("Error级日志(输出到Stderr)")
	log.Fatal().Msg("Fatal级日志(输出到Stderr)")
	// log.Panic().Msg("Panic级日志(输出到Stderr)")
}

关键说明

  • LevelFilter:用于限制当前Writer仅处理指定级别范围内的日志,通过MinLevel和MaxLevel定义级别区间
  • MultiLevelWriter:将多个Writer组合,日志会被分发到所有匹配其级别过滤规则的Writer
  • 全局日志级别:必须设置为目标级别中的最低级(这里是DebugLevel),否则低于全局级别的日志会被提前过滤,无法进入后续的分流逻辑

内容的提问来源于stack exchange,提问作者baruchiro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 17:33:30