Как мне получить команду fluentd /asticsearch для синтаксического анализа имени ключа log как json из модуля kubernetes? - PullRequest
0 голосов
/ 17 января 2020

У меня проблемы с попыткой получить логи вasticsearch от fluentd в кластере k8s.

У меня есть несколько веб-приложений, которые выводят свои логи как json. Используя простую настройку локально с контейнерами docker, я могу получить elasti c для правильного чтения и анализа журналов. Вот пример локального json, показанного в кибане:

{
  "_index": "logstash-2020.01.17",
  "_type": "fluentd",
  "_id": "S620sm8B2LEvFR841ylg",
  "_version": 1,
  "_score": null,
  "_source": {
    "log": {
      "@timestamp": "2020-01-17T08:53:03.066290",
      "caller": "StaticFileHelper.py::get",
      "data": {
        "python.thread": "Thread-1[{record.thread}]",
        "python.lineno": 45,
        "python.filename": "StaticFileHelper.py",
        "python.logger_name": "root",
        "python.module": "StaticFileHelper",
        "python.funcName": "get",
        "python.pid": 11239
      },
      "message": "application/javascript",
      "level": "INFO"
    },
    "@timestamp": "2020-01-17T08:53:03.000000000+00:00"
  },
  "fields": {
    "@timestamp": [
      "2020-01-17T08:53:03.000Z"
    ],
    "log.@timestamp": [
      "2020-01-17T08:53:03.066Z"
    ]
  },
  "sort": [
    1579251183000
  ]
}

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

log.@timestamp: date
log.caller: string
log.caller.keyword: string
log.data.python.filename: string
log.data.python.filename.keyword: string
log.data.python.funcName :string

В кластере поле «log» не анализируется правильно:

{
  "_index": "logstash-2020.01.17",
  "_type": "fluentd",
  "_id": "atUDs28BFgXM_nqQvYUY",
  "_version": 1,
  "_score": null,
  "_source": {
    "log": "{'@timestamp': '2020-01-17T10:19:21.775339', 'caller': 'RequestLoggingManager.py::print_request_id', 'data': {'python.thread': 'MainThread[{record.thread}]', 'python.lineno': 28, 'python.filename': 'RequestLoggingManager.py', 'python.logger_name': 'root', 'python.module': 'RequestLoggingManager', 'python.funcName': 'print_request_id', 'request_id': '1579256361-1494-XYyVj', 'python.pid': 8}, 'message': 'request: \"1579256361-1497-JUeYF\" is about to enter \"get_settings\"', 'level': 'INFO'}\n",
    "stream": "stderr",
    "docker": {
      "container_id": "fc5b0d5b0aa4008961b18dfe93c4e04b2cfbde0f7ff072dc702c55823baba3a4"
    },
    "kubernetes": {
      "container_name": "cms",
      "namespace_name": "default",
      "pod_name": "cms-68c4b49657-b88hs",
      "container_image": "HIDDEN",
      "container_image_id": "HIDDEN",
      "pod_id": "ffc6a681-390b-11ea-bcac-42010a8000be",
      "labels": {
        "app": "cms",
        "pod-template-hash": "68c4b49657",
        "version": "1.0.0"
      },
      "host": "HIDDEN",
      "master_url": "https://10.0.0.1:443/api",
      "namespace_id": "1ede7315-14fa-11ea-95c1-42010a80010f"
    },
    "@timestamp": "2020-01-17T10:19:21.776876369+00:00",
    "tag": "kubernetes.var.log.containers.cms-68c4b49657-b88hs_default_cms-fc5b0d5b0aa4008961b18dfe93c4e04b2cfbde0f7ff072dc702c55823baba3a4.log"
  },
  "fields": {
    "@timestamp": [
      "2020-01-17T10:19:21.776Z"
    ]
  },
  "highlight": {
    "kubernetes.labels.app": [
      "@kibana-highlighted-field@cms@/kibana-highlighted-field@"
    ]
  },
  "sort": [
    1579256361776
  ]
}

Отображение отображается как:

log: string
log.keyword: string

Ни одно из пользовательских json сопоставлений не распознается.

Есть ли способ настроить это поле "log" и если да, то где мне нужно внести изменения? Я совершенно новичок в беглости и эластичности c, поэтому любая помощь будет признательна!

Я использую fluent / fluentd-kubernetes-daemonset на kubernetes.

1 Ответ

2 голосов
/ 20 января 2020

Чтобы обойти это, я вытащил и запустил локальный образ fluent / fluentd-kubernetes-daemonset: v1.4.2-debian -asticsearch-1.1 в docker. Нужно было убедиться, что я указал FLUENT_ELASTICSEARCH_USER и FLUENT_ELASTICSEARCH_PASSWORD в качестве переменных env при начальном запуске в качестве точки входа. sh пытается заменить информацию в файле fluent.conf контейнеров. Если вы не указываете пароль, он стирает информацию в файле.

Тогда это был случай, когда exe c вставили в работающий контейнер и добавили следующую информацию в fluent.conf:

filter **>
  @type record_transformer
  <record>
    log_json ${record["log"]}
  </record>
</filter>


<filter **>
  @type parser
  @log_level debug
  key_name log_json
  reserve_data true
  remove_key_name_field true
  emit_invalid_record_to_error false
  <parse>
    @type json
  </parse>
</filter>

После этого я вышел и остановил контейнер, поместил контейнер в совершенно новое изображение в моем собственном репо на Docker Hub и сослался на новое изображение в файле yaml DaeomnSet, который мы использовали для развертывания до k8s.

Возможно, это не самый изящный или самый эффективный метод, но в отсутствие каких-либо документов о том, как настроить fluentd.conf, на данный момент это удалось.

...