2017-02-14 20 views
1

Я столкнулся с проблемой при использовании фильтра Grok. Ниже мой фильтр работает как ожидалось, пока в имени класса нет $ в нем. Когда имя потока похоже на СвойстваReader $ не работает. Что еще я могу использовать, чтобы он мог разбирать имя класса со специальными символами?

filter { 
     grok { 
      match => [ "message", "%{TIMESTAMP_ISO8601:LogDate} %{LOGLEVEL:loglevel} %{WORD:threadName}:%{NUMBER:ThreadID} - %{GREEDYDATA:Line}" ] 
     } 
     json { 
      source => "Line" 
     } 
     mutate { 
      remove_field => [ "Line" ] 
     } 
} 

ответ

0

Вы используете WORD в качестве шаблона для своего низового имени, которое не содержит специальных символов. Чтобы это подтвердить, давайте взглянем на этот шаблон: WORD \b\w+\b

Используйте нестандартный шаблон. Просто описав его в файл, например так:

MYPATTERN ([A-z]+\$?) 

Затем вы можете использовать его в вашей конфигурации, как это:

grok { 
    patterns_dir => ["/path/to/pattern/dor"] 
    match => [ "message", "%{TIMESTAMP_ISO8601:LogDate} %LOGLEVEL:loglevel} %{MYPATTERN:threadName}:%{NUMBER:ThreadID} - %GREEDYDATA:Line}" ] 
    } 

Вы найдете более подробную информацию о пользовательских шаблонов в docs

+0

Спасибо, Это сработало. – BobCoder

2

Вы не ограничены следующими названиями: grok. Вы можете делать любое регулярное выражение. Например, вместо %{WORD:threadName} вы можете поставить (?<threadName>[^:]+), который говорит, что соответствует любому символу, который не является : и назначает его threadName.

0

Вы также можете попробовать с %{DATA:threadName} вместо %{WORD:threadName}, если ваш threadName не будет содержать пробелы или двоеточия.