1

S3 バケットに AWS ElasticBeanstalk インスタンス ログがあります。

ログへのパスは次のとおりです。

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

これは次のように変換されます:

resources/environments/logs/publish/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

「.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" {
        ....
       }
     }
    }

ファイル名のパターンをテストするにはどうすればよいですか?

4

1 に答える 1

2

最初の質問で、@source_path にフル パスが含まれていると仮定して、次を試してください。

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

これにより、4 つの logstash フィールドが作成されます。

  • 環境
  • 実例
  • ファイル
  • サフィックス

詳細については、grok の man ページを参照してください。grok デバッガーでテストする必要があります。

logstash のフィールドをテストするには、条件を使用します。

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

これを grok で行う必要があるとは限らないことに注意してください。複数の「一致」引数を持つことができ、(デフォルトでは) 一致する最初の引数にヒットした後に停止します。パターンが排他的である場合、これはうまくいくはずです。

于 2014-12-06T05:22:37.970 に答える