1

我在 S3 存储桶上有 AWS ElasticBeanstalk 实例日志。

日志路径是:

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 在“.gz”之前的文件名中插入了一些随机数(时间戳?)

问题是我需要根据日志文件名设置变量。

这是我的配置:

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 手册页上找到,您应该使用grok 调试器进行测试。

要测试 logstash 中的字段,请使用条件,例如

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

等等

请注意,并不总是需要使用 grok 来执行此操作。您可以有多个“匹配”参数,它会(默认情况下)在点击第一个匹配的参数后停止。如果您的模式是独家的,这应该适合您。

于 2014-12-06T05:22:37.970 回答