2

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 ではサポートされていません。

4

0 に答える 0