如何解决在 Go 中使用 Uber-Zap 记录器将指定日志发送到 Kafka 接收器
我正在尝试使用 zap logger 包创建一个包含文件、控制台和 Kafka 接收器的核心。我有一些非常具体的 INFO 级别日志,我想将它们发送到 Kafka 主题以供下游消费者处理。但是,在当前的实现中,我获得了 Kafka 主题中的所有 INFO 级别日志,即使是我不想要的日志。
有没有办法使用通用的 zap 记录器对象来防止相同级别的不需要的日志不进入任何特定的接收器?
下面是我用来创建单个记录器对象的函数。
func newZapLogger(config Configuration) (Logger,error) {
var writer zapcore.WriteSyncer
cores := []zapcore.Core{}
if config.EnableFile {
getLogLevel(config.FileLevel)
if config.LogConfig == true {
writer = zapcore.Lock(zapcore.AddSync(&lj.Logger{
Filename: config.FileLocation,MaxSize: config.LogMaxSize,Compress: config.LogCompression,MaxAge: config.LogMaxAge,}))
} else {
writer = zapcore.Lock(zapcore.AddSync(&lj.Logger{
Filename: config.FileLocation,}))
}
cores = append(cores,zapcore.NewCore(getEncoder(config.FileJSONFormat,config.IsColour),writer,atomLevel))
}
if config.EnableConsole {
getLogLevel(config.ConsoleLevel)
switch config.Stream {
case 1:
writer = zapcore.Lock(os.Stdout)
case 2:
writer = zapcore.Lock(os.Stderr)
case 3:
writer = zapcore.Lock(zapcore.AddSync(IoUtil.discard))
default:
writer = zapcore.Lock(os.Stdout)
}
cores = append(cores,zapcore.NewCore(getEncoder(config.ConsoleJSONFormat,atomLevel))
}
if config.EnableKafka == true {
highPriority := zap.LevelEnablerFunc(func(lvl zapcore.Level) bool {
return lvl >= zapcore.WarnLevel
})
if len(brokerConn) > 0 {
var (
kl LogKafka
err error
)
kl.Topic = config.KafkaTopic
config := Sarama.NewConfig()
config.Producer.requiredAcks = Sarama.WaitForAll
config.Producer.Partitioner = Sarama.NewRandomPartitioner
config.Producer.Return.Successes = true
config.Producer.Return.Errors = true
kl.Producer,err = Sarama.NewSyncProducer(brokerConn,config)
if err != nil {
return nil,fmt.Errorf("Failed to initialise kafka logger,connect to kafka Failed: %v",err)
} else {
topicErrors := zapcore.AddSync(&kl)
kafkaEncoder := zapcore.NewJSONEncoder(zap.NewDevelopmentEncoderConfig())
cores = append(cores,zapcore.NewCore(kafkaEncoder,topicErrors,highPriority))
}
} else {
return nil,no broker specified")
}
}
appendedCore := zapcore.NewTee(cores...)
logger := zap.New(appendedCore,zap.AddCaller(),zap.AddCallerSkip(1)).Sugar()
defer logger.Sync()
return logger,nil
}
我正在使用 Sarama 包来实现 kafka 生产者。 我还考虑过使用自定义日志记录级别。但是,zap 1.0v 不支持。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。