如何从日志文件路径中提取变量,测试 Logstash 中模式的日志文件名?

Posted

技术标签:

【中文标题】如何从日志文件路径中提取变量,测试 Logstash 中模式的日志文件名?【英文标题】:How to extract variables from log file path, test log file name for pattern in Logstash? 【发布时间】:2015-02-04 07:23:42 【问题描述】:

我在 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

请注意,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" 
        ....
       
     
    

如何测试文件名模式?

【问题讨论】:

你真的用@source_path 得到了这个吗?我收到很多 grok 解析错误,因为 @source_path 似乎不存在。 不,我无法让它工作 想知道你是如何解决这个问题的? 【参考方案1】:

对于您的第一个问题,并假设 @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 来执行此操作。您可以有多个“匹配”参数,它会(默认情况下)在点击第一个匹配的参数后停止。如果您的模式是排他性的,这应该适合您。

【讨论】:

您能否详细说明一下我的配置应该如何组合在一起?我应该将匹配放在 if 中,而不嵌套 grok 吗? 在您的 filter 节中,条件可以放在任何过滤器(grok、date 等)周围,所以它是: if [field] == "value" grok 有你想要的任何 grok 选项。

以上是关于如何从日志文件路径中提取变量,测试 Logstash 中模式的日志文件名?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 javascript/jquery 从 url 中提取文件名?

如何从 docker 容器中收集主机系统日志

小结

提取目录路径和文件名

如何从文件路径中提取目录路径?

活用变量字符串${var%%.*}