zap loggerパッケージを使用して、ファイル、コンソール、および Kafka シンクを備えたコアを作成しようとしています。INFO
ダウンストリーム コンシューマーによる処理のために、Kafka トピックに送信したい特定レベルのログがいくつかあります。ただし、現在の実装ではINFO
、不要なものも含めて、Kafka トピックのすべてのレベルのログを取得しています。
一般的な zap logger オブジェクトを使用して、同じレベルの不要なログが特定のシンクに行かないようにする方法はありますか?
以下は、単一のロガー オブジェクトを作成するために使用している関数です。
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, config.IsColour), writer, 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, fmt.Errorf("Failed to initialise kafka logger, 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 v1.0 ではサポートされていません。