Ana içeriğe geç

3.4.5. Log Producer Fluent Provider#

Fluentd, açık kaynaklı bir log veri toplama aracıdır. Farklı kaynaklardan gelen logları merkezi bir noktada toplayarak, filtreleme, tamponlama ve yönlendirme işlemlerini gerçekleştirir

Log Producer Fluent Provider ise logları fluentd sistemine direkt olarak göndermek için kullanılacak sağlayıcı altyapısıdır.

Bağımlılıklar#

Gradle Dependencies

api (
    [group: 'tr.com.havelsan.framework.logger', name: 'hvl-logger-producer-fluent-provider'],
)

Kullanımı için Application Yml'a eklenmesi gerekenler#

hvl:
  logger:
    producer:
      enabled: ${LOGGER_PRODUCER_ENABLED:false}
      provider:
        fluent:
          host: localhost
          port: 9880
          timeout: 3000
          file-max-size: 1048576 #1 mb
          sender-class: tr.com.havelsan.javarch.log.producer.fluent.provider.sender.HvlLogProducerFluentHttpSender
hvl.logger.producer.enabled: Log üretici modülünün aktif/pasif durumunu kontrol eden ana anahtar.

hvl.logger.producer.provider.fluent.host: Fluentd sunucusunun çalıştığı host adresini belirten konfigürasyon.

hvl.logger.producer.provider.fluent.port: Fluentd sunucusuna bağlantı için kullanılacak port numarasını belirten ayar.

hvl.logger.producer.provider.fluent.timeout: Fluentd sunucusuna bağlantı için maksimum bekleme süresini milisaniye cinsinden belirten konfigürasyon.

hvl.logger.producer.provider.fluent.file-max-size: Fluent provider'ın oluşturduğu her bir dosya boyutunun olabileceği byte cinsinden max değeri belirten konfigürasyon.

hvl.logger.producer.provider.fluent.sender-class: Fluentd'ye log gönderimi için kullanılacak sender sınıfının tam adını belirten konfigürasyon.


hvl-infra üzerinden Config Server kullanıldığı durumlarda bootstrap.yml dosyasındaki spring.cloud.config.profile pathine hvl-logger değerinin eklenmesi gerekmektedir. Böylece yukarıdaki özelliklerin ve daha fazlasının olduğu application-hvl-logger.yml dosyası projeye dahil olacaktır.

Uyarı

hvl.logger.producer.enabled değeri geliştirme ortamları için varsayılan olarak false olarak ayarlanmıştır.

Kullanımı#

Fluent provider bean'leri, bağımlılık eklendikten sonra otomatik olarak devreye girmektedir.

Log basılmak istenen sınıfa HvlLogProducerFluentProvider sınıfı aşağıdaki gibi inject edilerek kullanılabilir.

@Service
public class HvlLoggerProducerServiceImpl implements HvlLoggerProducerService {

    private final HvlLogProducerFluentProvider logProducerFluentProvider;

    public HvlLoggerProducerServiceImpl(HvlLogProducerFluentProvider logProducerFluentProvider) {
        this.logProducerFluentProvider = logProducerFluentProvider;
    }

    /**
     * {@inheritDoc}
     */
    @Override
    public void produceWithFluentProvider(Long id) {
        final HvlEventLogModel eventLogModel = getHvlEventLogModel();

        eventLogModel.setMessage("Message with produceWithFluentProvider as async.");
        eventLogModel.setAttributeMap(Map.of("id", id));
        final boolean produced = logProducerFluentProvider.produce(eventLogModel);
        if (!produced) {
            sampleRepository.save(new HvlLoggerProducerSampleEntity("failed" + id));
        } else {
            sampleRepository.save(new HvlLoggerProducerSampleEntity("synced" + id));
        }
    }

    private HvlEventLogModel getHvlEventLogModel() {
        final HvlEventLogModel eventLogModel = new HvlEventLogModel();
        eventLogModel.setIndexName("logger-sample");
        eventLogModel.setEventType("customEventType");
        eventLogModel.setMessage("My message");
        eventLogModel.setUsername("acuhadaroglu");
        eventLogModel.setAttributeMap(Map.of("param1", "value1"));
        return eventLogModel;
    }
}

Kodun tamamına ve örnek uygulamaya hvl-javalt-samples projesindeki module/logger pathi takip edilerek ulaşılabilir.

Örnekte görüldüğü üzere log başarılı bir şekilde fluentd'ye gönderildiğinde true dönmektedir.

Uyarı

Eğer olay kaydı fluentd'ye gönderilirken başarısız olursa, transaction kesilmez veya rollback olmaz. Arka planda, gönderilemeyen olay kayıtları dosyaya yazılır ve bağlantı kurulduktan sonraki ilk olay kaydı gönderiminde dosyada bekletilen kayıtlar gönderilir. Bu yöntem, olay kayıtlarının gönderiminde veri kaybı olmadığını garanti eder. Veri kaybının oluşacağı tek durum, dosyada gönderilmek için bekleyen kayıtlar varken container silinirse oluşmaktadır.