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" {
....
}
}
}
ファイル名のパターンをテストするにはどうすればよいですか?