2014-12-06 2 views
1

У меня есть экземпляры экземпляров AWS ElasticBeanstalk на ведре S3.Как извлечь переменные из пути файла журнала, проверить имя файла журнала для шаблона в Logstash?

Путь к Бревну является:

resources/environments/logs/publish/e-3ykfgdfgmp8/i-cf216955/_var_log_nginx_rotated_access.log1417633261.gz 

, который переводит:

ресурсы/среды/журналы/публикация/e- [случайная среда ID]/i- [случайный экземпляр id]/

Путь содержит несколько журналов:

_var_log_eb-docker_containers_eb-current-app_rotated_application.log1417586461.gz 
_var_log_eb-docker_containers_eb-current-app_rotated_application.log1417597261.gz 
_var_log_rotated_docker1417579261.gz 
_var_log_rotated_docker1417582862.gz 
_var_log_rotated_docker-events.log1417579261.gz 
_var_log_nginx_rotated_access.log1417633261.gz 

Обратите внимание, что есть какая-то случайное число (метка времени?) Вставлено AWS в имени файла, прежде чем «.gz»

Проблема в том, что мне нужно установить переменные в зависимости от имени файла журнала.

Вот моя конфигурация:

input { 
     s3 { 
       debug => "true" 
       bucket => "elasticbeanstalk-us-east-1-something" 
       region => "us-east-1" 
       region_endpoint => "us-east-1" 
       credentials => ["..."] 
       prefix => "resources/environments/logs/publish/" 
       sincedb_path => "/tmp/s3.sincedb" 
       backup_to_dir => "/tmp/logstashed/" 
       tags => ["s3","elastic_beanstalk"] 
       type => "elastic_beanstalk" 
     } 
} 

filter { 
if [type] == "elastic_beanstalk" { 
    grok { 
    match => [ "@source_path", "resources/environments/logs/publish/%{environment}/%{instance}/%{file}<unnecessary_number>.gz" ] 
    } 
} 
} 

В этом случае я хочу, чтобы извлечь среды, экземпляр и имя файла из пути. В имени файла мне нужно игнорировать это случайное число. Я делаю это правильно? Что будет полным, правильным решением для этого?


Другой вопрос: как я могу указать поля для пользовательского формата журнала для определенного файла журнала сверху?

Это может быть что-то вроде: (мета-код)

filter { 
    if [type] == "elastic_beanstalk" { 
     if [file_name] BEGINS WITH "application_custom_log" { 
     grok { 

      match => [ "message", "%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}" ] 

     } 
     } 

     if [file_name] BEGINS WITH "some_other_custom_log" { 
     .... 
     } 
    } 
    } 

Как проверить для имени файла шаблона?

+0

Вы действительно получили эту работу с @source_path? Я получаю много ошибок разбора grok, так как кажется, что @source_path не существует. – bvulaj

+0

Нет, я не мог заставить его работать – Roman

+0

Хотите узнать, как вы это решили? – Raoot

ответ

2

Для вашего первого вопроса, и при условии, что @source_path содержит полный путь, попробуйте:

match => [ "@source_path", "logs/publish/%{NOTSPACE:env}/%{NOTSPACE:instance}/%{NOTSPACE:file}%{NUMBER}%{NOTSPACE:suffix}" ] 

Это создаст 4 logstash поле для вас:

  • окр
  • экземпляр
  • file
  • суффикс

Дополнительная информация доступна на grok man page, и вы должны протестировать ее с помощью grok debugger.

Чтобы проверить поля в logstash, вы используете conditionals, например.

if [field] == "value" 
if [field] =~ /regexp/ 

т.д.

Обратите внимание, что это не всегда необходимо, чтобы сделать это с Grok. У вас может быть несколько аргументов «match», и он (по умолчанию) останавливается после достижения первого совпадающего.Если ваши шаблоны являются эксклюзивными, это должно сработать для вас.

+0

Спасибо за ответ, он действительно работает для первой части. – Roman

+1

Не могли бы вы рассказать о том, как моя конфигурация будет выглядеть вместе? Должен ли я поставить матч прямо внутри if {}, без вложенности grok? – Roman

+0

В вашем фильтре {} stanza условное обозначение может быть помещено вокруг любого фильтра (grok, date и т. Д.), Поэтому это будет: if [field] == "value" {grok {}} с любыми параметрами grok, которые вы хотели. –