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

注入Server的zerolog无输出问题求助

zerolog注入Server后无法输出到stdout的排查与解决

尝试给Server添加zerolog日志记录器,但该日志器无法输出内容到stdout。奇怪的是,该日志器在Server外部可以正常工作,注入到Server后却完全失效,相关代码如下:

初始化日志的代码:

func InitializeLogger() zerolog.Logger {
    zerolog.ErrorStackMarshaler = pkgerrors.MarshalStack
    zerolog.SetGlobalLevel(zerolog.InfoLevel)

    output := zerolog.ConsoleWriter{Out: os.Stdout, TimeFormat: time.DateTime}
    output.FormatLevel = func(i interface{}) string {
        return strings.ToUpper(fmt.Sprintf("| %-6s|", i))
    }
    output.FormatMessage = func(i interface{}) string {
        return fmt.Sprintf("%s", i)
    }

    logger := zerolog.New(output).With().Timestamp().Logger()
    logger = logger.With().Caller().Logger()

    return logger
}

外部使用正常:

logger := util.InitializeLogger()
logger.Info().Str("service", "main").Msg("works") // works fine

注入Server后失效:

server, err := api.NewServer(..., logger)

func (server *Server) ErrLogger(service string, err error) error {
    server.logger.Error().Str("service", service).Msg("test")
    return nil
}

server.ErrLogger("main", fmt.Errorf("a")) // doesn't work .. no output at all

排查与解决方法

1. 检查Server结构体的logger字段是否正确赋值

这是最常见的问题:api.NewServer函数可能没有把传入的logger参数赋值给Server结构体的logger字段。如果没赋值,server.logger会是zerolog的默认空Logger(不会输出任何内容)。

正确的NewServer实现示例:

type Server struct {
    logger zerolog.Logger
    // 其他业务字段
}

func NewServer(..., logger zerolog.Logger) (*Server, error) {
    server := &Server{
        logger: logger, // 必须把传入的logger赋值给结构体字段
        // 初始化其他字段
    }
    // 其他初始化逻辑
    return server, nil
}

2. 排查日志级别是否被意外修改

检查Server初始化或运行过程中,有没有代码修改过logger的级别(比如设置为zerolog.Disabled)。可以在ErrLogger方法里临时打印当前级别排查:

func (server *Server) ErrLogger(service string, err error) error {
    fmt.Println("当前日志级别:", server.logger.GetLevel()) // 临时排查用,排查后可删除
    server.logger.Error().Str("service", service).Msg("test")
    return nil
}

如果输出级别是Disabled,说明logger被修改过,找到对应代码调整即可。

3. 确认输出流是否正常

检查是否有代码在Server初始化后关闭了os.Stdout,或者替换了logger的输出目标。不过这种情况概率较低,毕竟外部logger能正常工作。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 15:07:39