FluentD не удается записать журнал в Elasticsearch

#spring #elasticsearch #openshift #fluentd

#spring #elasticsearch #openshift #fluentd

Вопрос:

Использование:

  • fluentd 1.11.2
  • fluent-plugin-elasticsearch 4.1.3
  • elasticsearch 7.5.1
  • springboot 2.3.3

Работает в Openshift (Kubernetes v1.17.1 20ba474).

И Fluentd, и Elasticsearch выполняются в разных модулях.

Файл конфигурации Fluentd:

 <source>
  @type forward
  port 24224
  bind 0.0.0.0
</source>
<filter *.**>
      @type parser
      key_name log
      reserve_data true
      <parse>
        @type none
      </parse>
</filter>
<match *.**>
  @type copy
<store>
    @type elasticsearch
    host elasticdb
    port 9200
    logstash_format true
    logstash_prefix applogs
    logstash_dateformat %Y%m%d
    include_tag_key true
    type_name app_log
    tag_key @log_name
    flush_interval 1s
    user elastic
    password changeme
  </store>
  <store>
    @type stdout
  </store>
</match>
  

Из локальной службы springboot я отправляю в fluentd некоторые фиктивные данные:

 // Local port 24224 is being forwarded to remote 24224 via oc port-forward command
private static FluentLogger LOG = FluentLogger.getLogger("app", "127.0.0.1", 24224);

Map<String, Object> data = new HashMap<String, Object>();
data.put("from", "userA");
data.put("to", "userB");

LOG.log("app", data);
  

который отправляет этот фрагмент данных JSON:

 {"from":"userA","to":"userB"}
  

По-видимому, он работает только один раз из десяти. Или, кажется, работает два или три раза, а затем прерывается, пока я не изменю индекс. На самом деле, не ясен шаблон поведения.

Когда это не работает (в большинстве случаев), это журналы в модуле fluentd:

 2020-09-18 17:33:08.000000000  0000 app.appaa: {"from":"userA","to":"userB"}
2020-09-18 17:33:37  0000 [warn]: #0 dump an error event: error_class=ArgumentError error="log does not exist" location=nil tag="fluent.warn" time=2020-09-18 17:33:37.328180192  0000 record={"error"=>"#<ArgumentError: log does not exist>", "location"=>nil, "tag"=>"app.appaa", "time"=>1600450388, "record"=>{"from"=>"userA", "to"=>"userB"}, "message"=>"dump an error event: error_class=ArgumentError error="log does not exist" location=nil tag="app.appaa" time=1600450388 record={"from"=>"userAa", "to"=>"userBb"}"}
2020-09-18 17:33:37.328180192  0000 fluent.warn: {"error":"#<ArgumentError: log does not exist>","location":null,"tag":"app.appaa","time":1600450388,"record":{"from":"userA","to":"userB"},"message":"dump an error event: error_class=ArgumentError error="log does not exist" location=nil tag="app.appaa" time=1600450388 record={"from"=>"userA", "to"=>"userB"}"}
warning: 299 Elasticsearch-7.5.1-3ae9ac9a93c95bd0cdc054951cf95d88e1e18d96 "[types removal] Specifying types in bulk requests is deprecated."
  

Хотя модуль Elasticsearch ничего не показывает (я думаю, это вопрос уровня ведения журнала), если я перейду к Elastic, я увижу это:

 {
    "_index": "applogs-20200918",
    "_type": "_doc",
    "_id": "F0M2onQBB89nIri4Cb1Z",
    "_score": 1.0,
    "_source": {
        "error": "#<ArgumentError: log does not exist>",
        "location": null,
        "tag": "app.app",
        "time": 1600449251,
        "record": {
            "from": "userA",
            "to": "userB"
        },
        "message": "dump an error event: error_class=ArgumentError error="log does not exist" location=nil tag="app.app" time=1600449251 record={"from"=>"userA", "to"=>"userB"}",
        "@timestamp": "2020-09-18T17:14:39.775332214 00:00",
        "@log_name": "fluent.warn"
    }
}
  

Похоже, ошибка возникает из

«Ошибка эластичного аргумента: журнал не существует»

Кто-нибудь сталкивался с этой ошибкой раньше?

Комментарии:

1. Вы проверяли это с fluent-cat помощью command?

2. Спасибо за ваш комментарий. Нет, у меня нет. Считаете ли вы, что это будет иметь какое-либо значение? Среди всех попыток, которые я делаю, я атакую fluentd как из локальной службы, так и из той же службы, запущенной в отдельном модуле OCP. Поскольку я использую Windows10, я не очень уверен в установке fluent agent. Но если вы считаете, что это будет иметь значение, я попробую. Еще раз спасибо.

3. Добро пожаловать! Это изолирует пипллайн fluentd и elasticsearch. Вы можете протестировать его с того же компьютера, на котором запущен fluentd. fluent-cat уже должно быть там. Вам не нужно устанавливать его отдельно на другой компьютер. Это помогло бы проверить, имеет ли клиентская служба какое-либо отношение к этому или нет; и конвейер работает.

4. Правильно. key_name log . Вы можете попробовать echo '{"log":"hello"}' | fluent-cat debug.log ?

5. Потрясающе! Да, вы должны обратиться к документации для настройки. И я бы всегда использовал fluent-cat first для тестирования вещей изолированно. Рад, что это помогло. 🙂

Ответ №1:

Конфигурация анализатора в фильтре, т.е.

 <filter *.**>
  @type parser
  key_name log    # << Look for key `log` in event
  # ...
</filter>
  

ищет ключ log , которого не существует в этом событии:

 {"from":"userA","to":"userB"}
  

Вам нужно использовать что-то вроде этого:

 {"log":"... your log here..."}
  

Возможно, вам потребуется выполнить экранирование " там, если вы используете цитаты.

Соответствующая документация: https://docs .fluentd.org/filter/parser#key_name