注入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
相关产品推荐
相关产品推荐

