2014-12-06 91 views
1

我在S3存儲桶上有AWS ElasticBeanstalk實例日誌。如何從日誌文件路徑中提取變量,在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插入(時間戳?)是,我需要設置根據日誌文件名的變量。

這裏是我的配置:

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 2015-05-21 19:58:21

+0

不,我不能工作 – Roman 2015-05-21 21:03:31

+0

想知道你是如何解決這個問題的? – Raoot 2016-03-03 04:18:18

回答

2

關於第一個問題,假設@source_path包含完整路徑,嘗試:

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

這將創建4 logstash現場爲您提供:

  • ENV
  • 例如
  • 文件
  • 後綴

欲瞭解更多信息,請致電grok man page,您應該使用grok debugger進行測試。

要測試logstash中的字段,可以使用conditionals(例如,

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

注意,它並不總是必要的神交做到這一點。您可以有多個「匹配」參數,並且它會(默認情況下)在碰到匹配的第一個參數後停止。如果你的模式是獨佔的,這應該適合你。

+0

感謝您的回答,它確實適用於第一部分。 – Roman 2014-12-06 05:30:23

+1

你能詳細說一下我的配置應該如何看起來一起嗎?如果沒有嵌套Grok,我應該把它放在if {}內嗎? – Roman 2014-12-06 05:34:45

+0

在您的filter {}節中,條件可以放置在任何過濾器(grok,date等)周圍,所以它應該是:if [field] ==「value」{grok {}}與您想要的任何grok選項。 – 2014-12-07 05:34:56