2014-12-06 137 views
1

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

如何测试文件名模式?

+0

你真的得到这个@source_path的工作吗?我得到了很多Grok解析错误,因为它看起来@source_path不存在。 – bvulaj 2015-05-21 19:58:21

+0

不,我不能工作 – Roman 2015-05-21 21:03:31

+0

想知道你是如何解决这个问题的? – Raoot 2016-03-03 04:18:18

回答

2

关于第一个问题,假设@source_path包含完整路径,尝试:

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

这将创建4 logstash现场为您提供:

  • ENV
  • 例如
  • 文件
  • 后缀

欲了解更多信息,请致电grok man page,您应该使用grok debugger进行测试。

要测试logstash中的字段,可以使用conditionals(例如,

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

注意,它并不总是必要的神交做到这一点。您可以有多个“匹配”参数,并且它会(默认情况下)在碰到匹配的第一个参数后停止。如果你的模式是独占的,这应该适合你。

+0

感谢您的回答,它确实适用于第一部分。 – Roman 2014-12-06 05:30:23

+1

你能详细说一下我的配置应该如何看起来一起吗?如果没有嵌套Grok,我应该把它放在if {}内吗? – Roman 2014-12-06 05:34:45

+0

在您的filter {}节中,条件可以放置在任何过滤器(grok,date等)周围,所以它应该是:if [field] ==“value”{grok {}}与您想要的任何grok选项。 – 2014-12-07 05:34:56