我在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" {
....
}
}
}
如何測試文件名模式?
你真的得到這個@source_path的工作嗎?我得到了很多Grok解析錯誤,因爲它看起來@source_path不存在。 – bvulaj 2015-05-21 19:58:21
不,我不能工作 – Roman 2015-05-21 21:03:31
想知道你是如何解決這個問題的? – Raoot 2016-03-03 04:18:18