【问题标题】:Extracting a substring after a match position using grok in logstash在logstash中使用grok在匹配位置后提取子字符串
【发布时间】:2017-05-03 07:39:31
【问题描述】:

目标:我有一个日志文件,我想从中提取以下给定日志文件中字符串 Amount::: 之后的金额详细信息。

到目前为止我所做的:因为它是一个自定义解析,我已经使用 RegEx 创建了一个自定义模式,并且我正在尝试使用 logstash 来实现它。

这是我的日志文件 -

28-04-2017 14:45:50 INFO  abcinfo (ABC_TxnLog_ServiceImpl.java295) - Amount::: 3000.00  
28-04-2017 12:45:50 INFO  abcinfo (ABC_TxnLog_ServiceImpl.java295) - Amount::: 31000.00  
28-04-2017 14:15:50 INFO  abcinfo (ABC_TxnLog_ServiceImpl.java295) - Amount::: 10000.00  
28-04-2017 11:45:50 INFO  abcinfo (ABC_TxnLog_ServiceImpl.java295) - Amount::: 9000.00  
28-04-2017 08:15:50 INFO  abcinfo (ABC_TxnLog_ServiceImpl.java295) - Amount::: 7000.00

我使用 Regex 来查找字符串 Amount:::
注意:我想提取字符串 Amount:::

之后的子字符串

这是我在 Grok 中使用的自定义模式:
(但效果不好)

CUSTOM_AMOUNT (?<= - Amount::: ).*    
CUSTOM_AMOUNT (?<=Amount::: )%{BASE16FLOAT}

这是我的logstacsh.conf-

input { 
    file {
       path => "D:\elk\data\amnt_parse.txt"
       type => "customgrok"
       start_position => "beginning"
       sincedb_path => "/dev/null"
         } 
      }  
 filter{ 
       if[type]== "customgrok" {

            if "_grokparsefailure" in [tags] { 
                              grok { 
                                   patterns_dir => "D:\elk\logstash-5.2.1\vendor\bundle\jruby\1.9\gems\logstash-patterns-core-4.0.2\patterns\custom" 

                                    match => { "message" => "%{CUSTOM_AMOUNT:amount" } 
                                    add_field => { "subType" => "Amount"           } 

    } 

    }
    }  
 mutate {
      gsub => ['message', "\t", " "] 
        }  } }

 output {
     stdout {
         codec => "rubydebug"
            }
     elasticsearch {
         index => "amnt_parsing_change"
          hosts =>"localhost"

            }
            }   

我们的意图是使用 Kibana 和 Elasticsearch 基于提取的子字符串进行可视化并执行聚合操作。
但它将日志文件存储到变量"message" 中。正如你在这里看到的,match =&gt; { "message" =&gt; "%{CUSTOM_AMOUNT:amount" }

当我尝试在 Kibana 中查看时,这是该行在 "message" 中的存储方式 -

"message": "28-04-2017 11:45:50 INFO  abcinfo (ABC_TxnLog_ServiceImpl.java295) - Amount::: 9000.00\r",  
"message": "28-04-2017 12:45:50 INFO  abcinfo (ABC_TxnLog_ServiceImpl.java295) - Amount::: 31000.00\r",    
"message": "28-04-2017 11:45:50 INFO  abcinfo (ABC_TxnLog_ServiceImpl.java295) - Amount::: 9000.00\r",  

Logstash 文件正在加载数据(日志文件),索引也正在创建,但 Custom Pattern 没有给出预期的结果。 提取我上面提到的子字符串的可能性是什么?或者我们有其他选择吗?

【问题讨论】:

    标签: regex logstash elastic-stack logstash-grok


    【解决方案1】:

    这是你必须做的:

    filter {
         grok {
                    match => {
                            "message" => "%{DATESTAMP:Date} %{WORD:LogSeverity}\s+%{WORD:LogInfo} \(%{NOTSPACE:JavaClass}\) \- Amount::: %{NUMBER:Amount}"
                            }
            }
                    mutate
                            {
                                    gsub =>
                                    [
                                            "Data"," ","-"
                                    ]
                                    #If you dont want those fields
                                    remove_field => ["Date","LogSeverity","LogInfo","JavaClass"]
    
                            }
            }
    

    我建议你阅读文档:

    Grok Documentation Grok Patterns

    您可以使用以下调试器:

    GrokDebbuger

    【讨论】:

    • 非常感谢您的努力。现在,如果我的日志文件是多行的怎么办?比如,28-04-2017 14:45:50 INFO upiinfo (UPI_CustAccReg_ServiceImpl.java278) - accntDetailscom.fss.connect.domain.upi.UpiCustAccReg@5007c95d 28-04-2017 14:45:50 INFO upiinfo (UPI_TxnLog_ServiceImpl.java295) - Amount::: 3000.00 28-04-2017 14:45:50 INFO upiinfo (UPI_TxnLog_ServiceImpl.java308) - Formatted Amount::: 000000300000 28-04-2017 14:45:50 INFO 那么解决方案是什么?
    • '28-04-2017 14:45:50 信息 upiinfo (UPI_CustAccReg_ServiceImpl.java278) - accntDetailscom.fss.connect.domain.upi.UpiCustAccReg@5007c95‌​d 28-04-2017 14:45 :50 信息 upiinfo (UPI_TxnLog_ServiceImpl.java295) - 金额::: 3000.00 28-04-2017 14:45:50 信息 upiinfo (UPI_TxnLog_ServiceImpl.java308) - 格式化金额::: 000000300000 28-04-2017 14:45:50 ' 你的日志是这样格式化的?你能以完全正确的格式复制和过去吗?包括新行。
    • 给你..来自日志文件的示例日志..28-04-2017 14:45:50 INFO abcinfo (ABC_TxnLog_ServiceImpl.java335) - Split_amount:::: 28-04-2017 14:45:50 INFO abcinfo (ABC_TxnLog_ServiceImpl.java295) - Amount::: 3000.00 28-04-2017 14:45:50 INFO abcinfo (ABC_TxnLog_ServiceImpl.java308) - Formatted Amount::: 000000300000 28-04-2017 14:45:50 INFO abcinfo (ABC_TxnLog_ServiceImpl.java327) - Transaction Status :::: abcinfo (ABC_TxnLog_ServiceImpl.java335) - Split_amount:::: 28-04-2017 14:45:50 INFO ABCinfo (ABC_TxnLog_ServiceImpl.java295) - Amount::: 3000.00
    • 好的!但我想要的是一个完全格式的样本,因为像这样我不知道每个日志行的开始位置和结束位置。每个时间戳对应一个新行?
    • 是的! @rabbit 每个时间戳对应于新行。 28-04-2017 14:45:50 INFO ABCinfo (g_) - Amount::: 3000.00 28-04-2017 14:45:50 INFO ABCinfo (_) - Formatted Amount::: 000000300000 28-04-2017 14:45:50 INFO ABCinfo (ABCog_) - TXNLOG status :::: Y 28-04-2017 14:45:50 INFO ABCinfo (ABC_Log) - TXNID TxnLog Update :::: 28-04-2017 14:45:50 INFO ABCinfo (Aog_) - Transaction Status :::: 28-04-2017 14:45:50 INFO ABCinfo (ALog_) - Split_amount:::: 28-04-2017 14:45:50 INFO ABCinfo (ABC_) - Amount::: 3000.00 28-04-2017 14:45:50 INFO ABCinfo (ABC_) - Formatted Amount::: 000000300000
    猜你喜欢
    • 1970-01-01
    • 2019-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多