logstash Grok фильтр для пользовательских журналов

У меня два связанных вопроса. Во-первых, как лучше всего разбираться в журналах с "беспорядочными" интервалами и т. Д., А во-вторых, о чем я спрошу отдельно, как поступать с журналами, имеющими произвольные пары атрибут-значение. (См .: фильтр grok logstash для журналов с произвольным атрибутом - пары значений)

Итак, для первого вопроса у меня есть строка журнала, которая выглядит так:

14:46:16.603 [http-nio-8080-exec-4] INFO  METERING - msg=93e6dd5e-c009-46b3-b9eb-f753ee3b889a CREATE_JOB job=a820018e-7ad7-481a-97b0-bd705c3280ad data=71b1652e-16c8-4b33-9a57-f5fcb3d5de92

Используя http://grokdebug.herokuapp.com/, я смог в конечном итоге придумать следующий шаблон Grok это работает для этой строки:

%{TIME:timestamp} %{NOTSPACE:http} %{WORD:loglevel}%{SPACE}%{WORD:logtype} - msg=%{NOTSPACE:msg}%{SPACE}%{WORD:action}%{SPACE}job=%{NOTSPACE:job}%{SPACE}data=%{NOTSPACE:data}

Со следующим конфигурационным файлом:

input {
        file {
                path => "/home/robyn/testlogs/trimmed_logs.txt"
                start_position => beginning
                sincedb_path => "/dev/null" # for testing; allows reparsing
        }
}
filter {
        grok {
                match => {"message" => "%{TIME:timestamp} %{NOTSPACE:http} %{WORD:loglevel}%{SPACE}%{WORD:logtype} - msg=%{NOTSPACE:msg}%{SPACE}%{WORD:action}%{SPACE}job=%{NOTSPACE:job}%{SPACE}data=%{NOTSPACE:data}" }
        }
}
output {
        file {
                path => "/home/robyn/filteredlogs/trimmed_logs.out.txt"
        }
}

Получаю следующий результат:

{"message":"14:46:16.603 [http-nio-8080-exec-4] INFO  METERING - msg=93e6dd5e-c009-46b3-b9eb-f753ee3b889a CREATE_JOB job=a820018e-7ad7-481a-97b0-bd705c3280ad data=71b1652e-16c8-4b33-9a57-f5fcb3d5de92","@version":"1","@timestamp":"2015-08-07 T17:55:16.529Z","host":"hlt-dev","path":"/home/robyn/testlogs/trimmed_logs.txt","timestamp":"14:46:16.603","http":"[http-nio-8080-exec-4]","loglevel":"INFO","logtype":"METERING","msg":"93e6dd5e-c009-46b3-b9eb-f753ee3b889a","action":"CREATE_JOB","job":"a820018e-7ad7-481a-97b0-bd705c3280ad","data":"71b1652e-16c8-4b33-9a57-f5fcb3d5de92"}

Это в значительной степени то, что я хочу, но я чувствую, что это действительно беспорядочный шаблон, особенно с учетом необходимости использовать так много% {SPACE} и% {NOSPACE}. Это говорит мне о том, что я делаю это не лучшим образом. Должен ли я создавать более конкретный шаблон для шестнадцатеричных идентификаторов? Я думаю, что мне нужен% {SPACE} между loglevel и logtype из-за лишнего пробела между INFO и METERING в журнале, но это тоже кажется неуклюжим.

Также как мне получить временную метку журнала, чтобы заменить @timestamp, который, кажется, является временем, когда logstash принял журнал, который нам не нужен / не нужен.

Очевидно, я только начинаю работать с ELK и grok, поэтому я также приветствую указатели на полезные ресурсы.


person PurpleVermont    schedule 07.08.2015    source источник


Ответы (2)


Есть уже существующий шаблон, который вы можете использовать вместо NOTSPACE, это UUID. Также, когда есть один пробел, нет необходимости использовать шаблон SPACE, вы можете его не указывать. Я также использую шаблон USERNAME (возможно, неправильно названный) просто ради захвата поля http.

Так будет и у вас есть только один SPACE шаблон для захвата нескольких пробелов.

Пример строки журнала:

14:46:16.603 [http-nio-8080-exec-4] INFO  METERING - msg=93e6dd5e-c009-46b3-b9eb-f753ee3b889a CREATE_JOB job=a820018e-7ad7-481a-97b0-bd705c3280ad data=71b1652e-16c8-4b33-9a57-f5fcb3d5de92

Паттерн Грока:

%{TIME:timestamp} \[%{USERNAME:http}\] %{WORD:loglevel}%{SPACE}%{WORD:logtype} - msg=%{UUID:msg} %{WORD:action} job=%{UUID:job} data=%{UUID:data}

Грок выплюнет:

{
  "timestamp": [
    [
      "14:46:16.603"
    ]
  ],
  "HOUR": [
    [
      "14"
    ]
  ],
  "MINUTE": [
    [
      "46"
    ]
  ],
  "SECOND": [
    [
      "16.603"
    ]
  ],
  "http": [
    [
      "http-nio-8080-exec-4"
    ]
  ],
  "loglevel": [
    [
      "INFO"
    ]
  ],
  "SPACE": [
    [
      "  "
    ]
  ],
  "logtype": [
    [
      "METERING"
    ]
  ],
  "msg": [
    [
      "93e6dd5e-c009-46b3-b9eb-f753ee3b889a"
    ]
  ],
  "action": [
    [
      "CREATE_JOB"
    ]
  ],
  "job": [
    [
      "a820018e-7ad7-481a-97b0-bd705c3280ad"
    ]
  ],
  "data": [
    [
      "71b1652e-16c8-4b33-9a57-f5fcb3d5de92"
    ]
  ]
}
person Val    schedule 21.08.2015
comment
Можете ли вы помочь мне написать фильтр Grok для этого шаблона: [2016-10-28T12: 13: 20,388] [INFO] [oepPluginsService] [hTYKFFt] загруженный модуль [ingest-common] Я пробовал вот так для того же: {[% {TIME: TIMESTAMP}]% {SPACE}% [% {WORD: loglevel}]% {SPACE}% [% {WORD: data}% {SPACE}% {WORD: data}% {data: message}% [{ WORD: message}]} Вы можете мне помочь с этим гроком? - person Soundarya Thiagarajan; 02.11.2016
comment
@SoundaryaThiagarajan Вы должны создать новый вопрос с этим. - person Val; 02.11.2016