logstash Разбить путь и принять определенное значение по его позиции [2] и вставить его в поле - PullRequest
0 голосов
/ 21 июня 2019

Мне нужно извлечь из пути определенное значение по его позиции ...

пример: скажем, я разделил этот следующий путь на массив, используя '\' как split char E: \ OUM82 \ APP \ Logs\ UploadManager_20062019.log Я должен получить что-то вроде этого:

[0]=E:
[1]=OUM82
[2]=APP (this value I want to take into a field  )
[3]=logs
[4]=UploadManager_20062019.log

, поэтому я всегда хочу взять что-нибудь в [2], как это реализовать?что-то с ruby?

Редактировать:

Я попробовал этот подход: (как предложил @baudsp), но я все еще получаю "_grokparsefailure"

grok {
              match => { path => "%{GREEDYDATA:pathDriveSign}\\%{GREEDYDATA:RootFolder}\\%{GREEDYDATA:customerFolder}" }
           }

вот стандартный вывод:

{
      "tags" => [
    [0] "beats_input_codec_plain_applied",
    [1] "_grokparsefailure"
],
     "agent" => {
            "type" => "filebeat",
    "ephemeral_id" => "bd6ace26-79cd-4297-bfb5-5add9f4b4217",
              "id" => "83fb6261-5872-4d95-853a-44f2cc41d436",
         "version" => "7.0.0",
        "hostname" => "OctUpload"
},
   "message" => "2019-06-13 17:40:34,591 INFO QueriesParserEngine.Run - GSP queries parser engine end. Total run time duration: 00:02:32.1831164 ",
"@timestamp" => 2019-06-22T16:25:26.204Z,
     "cloud" => {
    "provider" => "az",
     "machine" => {
        "type" => "Standard_DS13_v2"
    },
      "region" => "westeurope",
    "instance" => {
        "name" => "OctUpload",
          "id" => "768097b1-bfb9-4939-b99c-5337aede39ca"
    }
},
 "extractor" => "SQLSERVER",
     "input" => {
    "type" => "log"
},
       "ecs" => {
    "version" => "1.0.0"
},
  "@version" => "1",
    "fields" => {
    "logtype" => "log4net"
},
      "host" => {
              "os" => {
           "build" => "14393.2608",
         "version" => "10.0",
            "name" => "Windows Server 2016 Datacenter",
        "platform" => "windows",
          "kernel" => "10.0.14393.2608 (rs1_release.181024-1742)",
          "family" => "windows"
    },
              "id" => "d79c20df-4184-41a8-b95d-83669c8e3fbe",
            "name" => "OctUpload",
    "architecture" => "x86_64",
        "hostname" => "OctUpload"
},
       "log" => {
      "file" => {
        "path" => "E:\\OUM82\\Micron\\TI_DS_FILES\\SQLSERVER_LOGS\\QueriesParser-SQLS-BOMSSPROD66-2_13062019_173801 - Copy.log"
    },
    "offset" => 927068
}

}

Ответы [ 2 ]

1 голос
/ 21 июня 2019

NB : Я не уверен, что это лучший фильтр для использования здесь, но это тот, который я использовал больше всего, и он должен работать.

Если вас интересует тольков APP части вашего пути вы сможете найти его с помощью фильтра grok .

Предположим, что ваш путь находится в поле с именем path:

grok {
   match => {path => "^%{DATA}\\%{DATA}\\%{DATA:value}\\"}
}

Фильтр поместит значение APP в поле value.

Для получения дополнительной информации о фильтре Grok:

0 голосов
/ 22 июня 2019

еще одно лучшее решение от Badger от команды ELK:

лучшее решение от Badger от команды ELK

Вы не можете сделать это с помощью mutate + split (которыйэто то, что я обычно рекомендую) из-за этой проблемы , которая затрагивает регулярные выражения, строки в одинарных кавычках и строки в двойных кавычках.

Возможно использование grok, если вы включите config.support_escapes в logstash.yml ... Хотите верьте, хотите нет

grok { 
   match => { "path" =>
     "^(?<pathDriveSign>\w{1}):\\\\(?<RootFolder>[^\\\\]+)\\\\(?<customerFolder>[^\\\\]+)\\\\."
   } 
}

получит вас

"RootFolder" => "OUM82",  
"pathDriveSign" => "E", 
"customerFolder" => "APP",

Не просите меня объяснить, почему 4 обратных слеша необходимы для представления одного обратного слеша.


Существует также хитрый способ сделать это в рубине.У вас не может быть обратной косой черты в конце строки, поэтому у нас есть строка, которая содержит обратную косую черту и извлекает обратную косую черту из нее.

ruby {
    code => '
        backslash = "\\Z"[0]
        event.set("components", event.get("path").split(backslash))
    '
}

приводит к

"components" => [
 [0] "E:",
 [1] "OUM82",
 [2] "APP",
 [3] "Logs",
 [4] "UploadManager_20062019.log" 
]
...