Logstash 基于条件文本计算日志存储中的日期差

Logstash 基于条件文本计算日志存储中的日期差,logstash,kibana,logstash-grok,Logstash,Kibana,Logstash Grok,我有一个条件: 我有一系列日志,从startTransaction开始,到endtransaction结束。现在,在这两个事件之间还有其他日志 我的要求是捕获上述事件的日志时间并计算差异 当我读到logstash不支持循环时,将有多个开始和结束事件块,我需要计算时间差 请帮助我们找到一些方法 条件 记录starttransaction事件日志的时间 记录endtransaction事件日志的时间 找到时间差并存储在变量中 添加starttransaction和endtransaction之间出现

我有一个条件: 我有一系列日志,从startTransaction开始,到endtransaction结束。现在,在这两个事件之间还有其他日志

我的要求是捕获上述事件的日志时间并计算差异

当我读到logstash不支持循环时,将有多个开始和结束事件块,我需要计算时间差

请帮助我们找到一些方法

条件

  • 记录starttransaction事件日志的时间
  • 记录endtransaction事件日志的时间
  • 找到时间差并存储在变量中
  • 添加starttransaction和endtransaction之间出现的所有分析时间值
  • 从#3中减去该值
  • 日志

    我创建了下面的日志存储配置。我能做到1-3

    输入{
    文件{
    路径=>[“D:/seetslog/SeeTest-2017-05-18-12-51-22.log”]
    开始位置=>“开始”
    类型=>“st_ios”
    }
    }
    滤器{
    如果[消息]中的“分析”){
    格罗克{
    {消息=>{消息=>{{消息=>{{{消息>{{{消息>{{{消息>>{{{消息>>{{{消息>>{{{{{消息>{{{{消息>>{{{{消息>{{{{{{消息>>{{{{{{时间戳时间戳}}}}{{{{{网页网页网页网页网页>>{{{{{{{{{{{门门市:文字:文字:文字:text1}}}}{{{单词:文字:文字:文字:文字:文本2}}}}}}}}{{{{{{{{单词:文字:文字:文字:文字:文字:文字:文字:2}}}}}}}}}}---{{{{{{{{{{{{{单词:文字:文字:文字:文字:文字:文字:文字:事件}}}}}}}}}
    ]}
    添加标签=>[“st_ios”]
    }
    }
    其他的
    {       
    格罗克{
    match=>{message=>[“%{TIMESTAMP\u ISO8601:TIMESTAMP}\,%{INT:bytes}%{SPACE}\[(?%{WORD:text1}-%{WORD:text2}-%{WORD:Event}-%{NOTSPACE:deviceid}])%{SPACE}\({NOTSPACE:controller}\)%{SPACE}%{SPACE}%{WORD:logger}%{SPACE}{SPACE SPACE}%{greedData:logmessage(?)
    ]}
    添加标签=>[“st_ios”]
    }
    }          
    变异{
    转换=>{“字节”=>“整数”}
    convert=>{“analyzetime”=>“integer”}
    }
    日期{
    匹配=>[“时间戳”、“dd-MMM-yyyy-HH:mm:ss”、“yyy-mm-dd-HH:mm:ss”]
    目标=>“时间戳”
    语言环境=>“en”
    }
    if(在[消息]中的“启动交易”){
    mutate{add_tag=>[“eventstart”]}
    } 
    else if[消息]中的“endTransaction”){
    mutate{add_tag=>[“eventend”]}
    }
    过去的{
    开始\标记=>“事件开始”
    结束\标记=>“事件结束”
    唯一\u id\u字段=>“任务\u id”
    超时=>600
    新的\u事件\u在\u匹配上=>false
    添加标签=>[“in2”]
    }               
    }
    输出{
    stdout{codec=>rubydebug}
    elasticsearch{hosts=>[“localhost:9200”]索引=>“logstash-st-ios-1”}
    }
    
    我能够满足所有要求。想和大家分享一下结果

    #1-#4通过日志存储实现。下面是conf文件

    input {
         file { 
            path => ["temp.log"]
            start_position => "beginning"       
          }
    }
    filter {
    
         if ("analyze" in [message]) {
            grok {
             match => { message => ["%{TIMESTAMP_ISO8601:timestamp}\,%{INT:bytes}%{SPACE}\[(?<eventmessage>%{WORD:text1}\-%{WORD:text2}\-%{WORD:Event}\-%{NOTSPACE:deviceid}\])%{SPACE}\(%{NOTSPACE:controller}\)%{SPACE}%{WORD:logger}%{SPACE}(?<analyzetext>%{WORD:text1}%{SPACE}%{WORD:text2}%{SPACE}%{NOTSPACE:text3})%{SPACE}%{INT:analyzetime}"]}                 
        }
        }
        else
        {       
                grok {
                 match => { message => ["%{TIMESTAMP_ISO8601:timestamp}\,%{INT:bytes}%{SPACE}\[(?<eventmessage>%{WORD:text1}\-%{WORD:text2}\-%{WORD:Event}\-%{NOTSPACE:deviceid}\])%{SPACE}\(%{NOTSPACE:controller}\)%{SPACE}%{WORD:logger}%{SPACE}%{NOTSPACE:ClientID}\:%{SPACE}%{WORD:controllertext}\:%{SPACE}%{WORD:Val1}%{SPACE}%{WORD:Val2}%{SPACE}\'%{NOTSPACE:usertransaction}\'\,%{SPACE}%{WORD:statustext}\:%{SPACE}%{WORD:statusvalue}"]}            
                }
        }               
    
    
        mutate {
    
                    convert => { "bytes" => "integer"}
                    convert => { "analyzetime" => "integer"}                            
                    }
                    date {
                          match => [ "timestamp", "dd-MMM-yyyy HH:mm:ss", "YYYY-MM-dd HH:mm:ss" ]
                          target => "timestamp"
                          locale => "en"
                }
    
    
        if ("startTransaction" in [message]) {
            mutate { add_tag => ["eventstart"] }
                    } 
            else if ("endTransaction" in [message]) {
                      mutate { add_tag => ["eventend"] }
                    }
    
            elapsed {
                  start_tag => "eventstart"
                  end_tag => "eventend"
                  unique_id_field => "deviceid"
                  timeout => 120
                  new_event_on_match => false             
                }
    
    if ("startTransaction" in [message]) {
                aggregate {
                            task_id => "%{deviceid}"
                            code => "map['sum_analyze_time'] = 0"
                            map_action => "create"                      
                        }               
                   }
    
            if ("analyze" in [message]) {
                    aggregate {
                                task_id => "%{deviceid}"
                                code => "map['sum_analyze_time'] += event.get('analyzetime')"
                                map_action => "update"                      
                            }
                        }
    
    
            if ("endTransaction" in [message]) {            
                aggregate {
                            task_id => "%{deviceid}"
                            code => "event.set('sum_analyze_time', map['sum_analyze_time'])"
                            map_action => "update"
                            end_of_task => true
                            timeout => 120
                        }
                    }           
    
    }
    
    output {
    
    stdout {codec => rubydebug}
      elasticsearch { hosts => ["localhost:9200"] index => "logstash-st-ios-1"}
    }
    
    输入{
    文件{
    路径=>[“临时日志”]
    开始位置=>“开始”
    }
    }
    滤器{
    如果[消息]中的“分析”){
    格罗克{
    {消息=>{消息=>{{消息=>{{{{消息>{{{消息>{{{消息>>{{{消息>>{{{消息>>{{{{{消息>{{{{{消息>>{{{{消息>{{{{{{{{时间戳}}}{{{{{时间戳}}}}}}{{{{{{{{门门门门门市:文字:文字:文字:text1}}}}{{{{{文字:文字:文字:文本2}}}}}}{{{{{{{{{单词:文字:文字:文字:文字:文本2}}}}}}}}}---{{{门门门门门门门门门门门门门门门门门门门门-{{{{{{{{{可能可能可能可能可能可能}}}}}--{{{{{{{{
    }
    }
    其他的
    {       
    格罗克{
    {消息=>{消息=>{{{消息=>{{{{消息=>{{{{{{消息>>{{{{消息>{{{{消息>>{{{{{{消息>{{{{消息>>{{{{{{{{{{{{{时间戳}}}{{{{{{{门门门门控:字节:字节:}}}{{{{{{空间}{{{{{{{{{{门门控:文字:文字:文字:文字:文字:文字:文字:文字:文字:text1}}}}}}{{{{{{{门门门门门门门门门门门门门铁铁铁铁}}}}}}}{{{{{{{{{{{{{{{{{门门门门门门门门门门门门门门门门门控:文字:文字:文字:文字:文字:文字:文字:文字%{SPACE}\'%{NOTSPACE:usertransaction}\'\,%{SPACE}%{WORD:statustext}\:%{SPACE}%{WORD:statusvalue}]}
    }
    }               
    变异{
    转换=>{“字节”=>“整数”}
    convert=>{“analyzetime”=>“integer”}
    }
    日期{
    匹配=>[“时间戳”、“dd-MMM-yyyy-HH:mm:ss”、“yyy-mm-dd-HH:mm:ss”]
    目标=>“时间戳”
    语言环境=>“en”
    }
    if(在[消息]中的“启动交易”){
    mutate{add_tag=>[“eventstart”]}
    } 
    else if[消息]中的“endTransaction”){
    mutate{add_tag=>[“eventend”]}
    }
    过去的{
    开始\标记=>“事件开始”
    结束\标记=>“事件结束”
    唯一\u id\u字段=>“设备id”
    超时=>120
    新的\u事件\u在\u匹配上=>false
    }
    if(在[消息]中的“启动交易”){
    聚合{
    任务id=>“%{deviceid}”
    代码=>“映射['sum\u analyze\u time']=0”
    映射_操作=>“创建”
    }               
    }
    如果[消息]中的“分析”){
    聚合{
    任务id=>“%{deviceid}”
    代码=>“映射['sum\u analyze\u time']+=event.get('analyzetime')”
    映射\操作=>“更新”
    }
    }
    如果[message]中的“endTransaction”{
    聚合{
    任务id=>“%{deviceid}”
    代码=>“event.set('sum_analyze_time',map['sum_analyze_time'])”
    映射\操作=>“更新”
    结束任务的任务=>true
    超时=>120
    }
    
        input {
         file { 
            path => ["D:/SeeTestLog/SeeTest-2017-05-18-12-51-22.log"]
            start_position => "beginning"
            type => "st_ios"        
          }
    }
    filter {
    
    
          if ("analyze" in [message]) {
            grok {
             match => { message => [            "%{TIMESTAMP_ISO8601:timestamp}\,%{INT:bytes}%{SPACE}\[(?<eventmessage>%{WORD:text1}\-%{WORD:text2}\-%{WORD:Event}\-%{NOTSPACE:deviceid}\])%{SPACE}\(%{NOTSPACE:controller}\)%{SPACE}%{WORD:logger}%{SPACE}(?<analyzetext>%{WORD:text1}%{SPACE}%{WORD:text2}%{SPACE}%{NOTSPACE:text3})%{SPACE}%{INT:analyzetime} (?<task_id>.*)"                   
                          ]}
                add_tag => [ "st_ios" ]        
        }
        }
        else
        {       
                grok {
                 match => { message => ["%{TIMESTAMP_ISO8601:timestamp}\,%{INT:bytes}%{SPACE}\[(?<eventmessage>%{WORD:text1}\-%{WORD:text2}\-%{WORD:Event}\-%{NOTSPACE:deviceid}\])%{SPACE}\(%{NOTSPACE:controller}\)%{SPACE}%{WORD:logger}%{SPACE}%{GREEDYDATA:logmessage} (?<task_id>.*)"                   
                          ]}
                add_tag => [ "st_ios" ]
                }
        }          
        mutate {
    
                    convert => { "bytes" => "integer"}
                    convert => { "analyzetime" => "integer"}
                    }
                    date {
                          match => [ "timestamp", "dd-MMM-yyyy HH:mm:ss", "YYYY-MM-dd HH:mm:ss" ]
                          target => "timestamp"
                          locale => "en"
                }
    
        if ("startTransaction" in [message]) {
            mutate { add_tag => ["eventstart"] }
                    } 
            else if ("endTransaction" in [message]) {
                      mutate { add_tag => ["eventend"] }
                    }
    
        elapsed {
                  start_tag => "eventstart"
                  end_tag => "eventend"
                  unique_id_field => "task_id"
                  timeout => 600
                  new_event_on_match => false
                  add_tag => ["in2"]
                }               
    }
    
    output {
    
    stdout {codec => rubydebug}
      elasticsearch { hosts => ["localhost:9200"] index => "logstash-st-ios-1"}
    }
    
    input {
         file { 
            path => ["temp.log"]
            start_position => "beginning"       
          }
    }
    filter {
    
         if ("analyze" in [message]) {
            grok {
             match => { message => ["%{TIMESTAMP_ISO8601:timestamp}\,%{INT:bytes}%{SPACE}\[(?<eventmessage>%{WORD:text1}\-%{WORD:text2}\-%{WORD:Event}\-%{NOTSPACE:deviceid}\])%{SPACE}\(%{NOTSPACE:controller}\)%{SPACE}%{WORD:logger}%{SPACE}(?<analyzetext>%{WORD:text1}%{SPACE}%{WORD:text2}%{SPACE}%{NOTSPACE:text3})%{SPACE}%{INT:analyzetime}"]}                 
        }
        }
        else
        {       
                grok {
                 match => { message => ["%{TIMESTAMP_ISO8601:timestamp}\,%{INT:bytes}%{SPACE}\[(?<eventmessage>%{WORD:text1}\-%{WORD:text2}\-%{WORD:Event}\-%{NOTSPACE:deviceid}\])%{SPACE}\(%{NOTSPACE:controller}\)%{SPACE}%{WORD:logger}%{SPACE}%{NOTSPACE:ClientID}\:%{SPACE}%{WORD:controllertext}\:%{SPACE}%{WORD:Val1}%{SPACE}%{WORD:Val2}%{SPACE}\'%{NOTSPACE:usertransaction}\'\,%{SPACE}%{WORD:statustext}\:%{SPACE}%{WORD:statusvalue}"]}            
                }
        }               
    
    
        mutate {
    
                    convert => { "bytes" => "integer"}
                    convert => { "analyzetime" => "integer"}                            
                    }
                    date {
                          match => [ "timestamp", "dd-MMM-yyyy HH:mm:ss", "YYYY-MM-dd HH:mm:ss" ]
                          target => "timestamp"
                          locale => "en"
                }
    
    
        if ("startTransaction" in [message]) {
            mutate { add_tag => ["eventstart"] }
                    } 
            else if ("endTransaction" in [message]) {
                      mutate { add_tag => ["eventend"] }
                    }
    
            elapsed {
                  start_tag => "eventstart"
                  end_tag => "eventend"
                  unique_id_field => "deviceid"
                  timeout => 120
                  new_event_on_match => false             
                }
    
    if ("startTransaction" in [message]) {
                aggregate {
                            task_id => "%{deviceid}"
                            code => "map['sum_analyze_time'] = 0"
                            map_action => "create"                      
                        }               
                   }
    
            if ("analyze" in [message]) {
                    aggregate {
                                task_id => "%{deviceid}"
                                code => "map['sum_analyze_time'] += event.get('analyzetime')"
                                map_action => "update"                      
                            }
                        }
    
    
            if ("endTransaction" in [message]) {            
                aggregate {
                            task_id => "%{deviceid}"
                            code => "event.set('sum_analyze_time', map['sum_analyze_time'])"
                            map_action => "update"
                            end_of_task => true
                            timeout => 120
                        }
                    }           
    
    }
    
    output {
    
    stdout {codec => rubydebug}
      elasticsearch { hosts => ["localhost:9200"] index => "logstash-st-ios-1"}
    }