我在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" {
....
}
}
}
如何测试文件名模式?
答案 0 :(得分:2)
对于您的第一个问题,并假设@source_path包含完整路径,请尝试:
match => [ "@source_path", "logs/publish/%{NOTSPACE:env}/%{NOTSPACE:instance}/%{NOTSPACE:file}%{NUMBER}%{NOTSPACE:suffix}" ]
这将为您创建4个logstash字段:
grok man page提供了更多信息,您应该使用grok debugger进行测试。
要测试logstash中的字段,请使用conditionals,例如
if [field] == "value"
if [field] =~ /regexp/
等
请注意,使用grok并不总是需要这样做。你可以有多个匹配&#39;参数,它将(默认情况下)在匹配第一个匹配后停止。如果你的模式是独家的,这应该适合你。