Сценарий безболезненного поля Kibana filebeat IIS регистрирует сообщение, возвращающее ноль со значениями там - PullRequest
0 голосов
/ 14 февраля 2019

Здравствуйте, я пытаюсь выполнить некоторые манипуляции с данными в скриптовом поле в Кибане.У меня возникла проблема, когда я могу вернуть все другие значения ключей в журнале, кроме ключей message и error.message.Они возвращают 0 результатов даже с данными в полях.

Использование Kibana Версия: 6.4.2

Вот пример документа:

      {
    "_index": "filelogbeat-production-6.4.2-2019.02.09",
    "_type": "doc",
    "_id": "Dje50mgB3uHiSvgnLMBn",
    "_score": 1,
    "_source": {
      "offset": 309376,
      "prospector": {
        "type": "log"
      },
      "source": """C:\inetpub\logs\ct-data-service\error.log""",
      "message": "================================================================================",
      "fileset": {
        "module": "iis",
        "name": "access"
      },
      "error": {
        "message": "Provided Grok expressions do not match field value: [================================================================================]"
      },
      "input": {
        "type": "log"
      },
      "@timestamp": "2019-02-09T14:46:07.646Z",
      "beat": {
        "hostname": "Removed",
        "name": "Removed",
        "version": "6.4.2"
      },
      "host": {
        "name": "Removed"
      }
    }
  },

Я могу сослаться на

doc['host.name'].value; //these return values
doc['offset'].value;
doc['source'].value;

Вот сценарийвозвращение поля для исходного ключа.

[
 {
  "_id": "RVW50mgBvqEbiJJnH8Vp",
  "ipAddress": [
   "C:\\inetpub\\logs\\LogFiles\\W3SVC5\\u_extend192.log"
  ]
 },

Я пробовал создавать сценарии, если поле существует с:

if (doc.containsKey('message')) {
    return doc['message'].value;
}

или

if (doc.containsKey('error')) {
    return doc['error'].value;
}

или

if (doc.containsKey('error.message')) {
    return doc['error.message'].value;
}

возвращает

First 10 results

[]

Это по-прежнему не дает результатов.В журналах iis поле сообщения не всегда присутствует, поэтому я выполнил запрос es в инструментах разработчика:

GET /filelogbeat-production-6.4.2-2019.02.09/_search
{
  "query": {
      "exists": {
    "field": "message"
  }
  }
}

Вот как я получил образец документа.Я предполагаю, что использование .contains - это способ запуска скриптового поля только при наличии поля сообщения.

Даже при наличии данных, к которым у меня нет доступа к значению сообщения с помощью скриптовых полей, оно всегда возвращает нольтак же и поле error.message.

Я не уверен, почему это не возвращает никаких значений.

Также, вы можете попробовать перехватить блоки безболезненным языком?Кажется, я не могу заставить работать ловушки для попыток.

Также в редакторе результатов предварительного просмотра я могу добавить дополнительные поля для сообщений об ошибках error.message и @timestamp из выпадающего списка, и в вывод добавляется только временная метка.value.

Я использую doc ['source']. value в поле скриптового поля, и при предварительном просмотре я добавил поля message и error.message из выпадающего списка дополнительных полей.

Это то, что возвращает, нет ошибок или результатов сообщений, но я точно знаю, что из-за моего запроса выше, что данные существуют, и я, очевидно, вижу их на своей панели инструментов.Это также под строковым типом в выпадающем списке.

[
 {
  "_id": "RVW50mgBvqEbiJJnH8Vp",
  "@timestamp": "2019-02-05T04:24:05.000Z",
  "ipAddress": [
   "C:\\inetpub\\logs\\LogFiles\\W3SVC5\\u_extend192.log"
  ]
 },

, если я делаю следующее:

def path = doc['source'].value;
if (path != null) {
    return "value " + path;
}else{
   return "no value";
}

Я получаю:

[
 {
  "_id": "RVW50mgBvqEbiJJnH8Vp",
  "ipAddress": [
   "value C:\\inetpub\\logs\\LogFiles\\W3SVC5\\u_extend192.log"
  ]
 },

, если я делаю:

def path = doc['message'].value;
if (path != null) {
    return "value " + path;
}else{
   return "no value";
}

Я получаю:

First 10 results

[]

, если я делаю это, никакие значения не возвращаются

if (doc.containsKey('message')) {
def path = doc['message'].value;
if (path != null) {
    return "value " + path;
}else{
   return "no value";
}
}else{
return "no key";
}

, если я делаю

if (doc.containsKey('message')) {
    return "values";
}

он возвращает значения, поэтому кажется, что поле сообщения вызывает какую-то ошибку, которая не отображается в выводе или что-то, о чем я не знаю.

Я пробовал так много разных методов в предоставленной онлайн-консоли сценариев для выполнения полей со сценариямис предварительным просмотром, но не получал никаких ошибок.Затем я посмотрел, как выполнить запросasticsearch и запустить встроенные безболезненные сценарии, чтобы выяснить, есть ли какие-либо проблемы с доступом к полю.

GET /filelogbeat-production-6.4.2-2019.02.11/_search {
        "query": {
            "bool": {
                "must": [{
                    "exists": {
                        "field": "message"
                    }
                }],
                "filter": [{
                    "script": {
                        "script": {
                            "inline": "doc['message'].value"
                        }
                    }
                }]
            }
        }
    }​

запуск этого запроса в инструментах разработки

"type": "search_phase_execution_exception", "reason": "all shards failed", "phase": "query", "grouped": true, "failed_shards": [{
    "shard": 0,
    "index": "filelogbeat-production-6.4.2-2019.02.11",
    "node": "hQksfgxQROiRSoSnDW3liQ",
    "reason": {
        "type": "script_exception",
        "reason": "runtime error",
        "script_stack": ["org.elasticsearch.index.mapper.TextFieldMapper$TextFieldType.fielddataBuilder(TextFieldMapper.java:670)", "org.elasticsearch.index.fielddata.IndexFieldDataService.getForField(IndexFieldDataService.java:115)", "org.elasticsearch.index.query.QueryShardContext.lambda$lookup$0(QueryShardContext.java:280)", "org.elasticsearch.search.lookup.LeafDocLookup$1.run(LeafDocLookup.java:88)", "org.elasticsearch.search.lookup.LeafDocLookup$1.run(LeafDocLookup.java:85)", "java.security.AccessController.doPrivileged(Native Method)", "org.elasticsearch.search.lookup.LeafDocLookup.get(LeafDocLookup.java:85)", "org.elasticsearch.search.lookup.LeafDocLookup.get(LeafDocLookup.java:39)", "doc['message'].value", "    ^---- HERE"],
        "script": "doc['message'].value",
        "lang": "painless",
        "caused_by": {
            "type": "illegal_argument_exception",
            "reason": "Fielddata is disabled on text fields by default. Set fielddata=true on [message] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory. Alternatively use a keyword field instead."
        }
    }
}]
}, "status": 500
}​

для сопоставления созданного filebeat для индекса все поля сообщения имеют следующее сопоставление:

    "message": {
        "type": "text",
        "norms": false
    },

Ошибка, которую он выдает:

"caused_by": {
    "type": "illegal_argument_exception",
    "reason": "Fielddata is disabled on text fields by default. Set fielddata=true on [message] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory. Alternatively use a keyword field instead."
}

Может ли это быть причиной моей проблемы в безболезненном предварительном просмотреполе, но не показывает исключение?

Есть ли проблема с использованием текстовых полей со скриптовыми полями?

...