I'm trying to parse a log file into elasticsearch through logstash.
I want to send the following log as single event(i.e. as a single document) into elasticsearch.
######################################################
ETL Wrapper Initializing - 09/27/2018 06:33:57
######################################################
------------------------------------------------------
Wrapper Information - 09/27/2018 06:33:57
------------------------------------------------------
------------------------------------------------------
Reading Component Log Port Files - 09/27/2018 06:34:53
------------------------------------------------------
-- >     -- > Found 3 files and only merge non-zero byte files
------------------------------------------------------
Renaming Reject Files - 09/27/2018 06:34:56
------------------------------------------------------
######################################################
Sending Notifications - 09/27/2018 06:34:56
######################################################
------------------------------------------------------
Setting Exit Status - 09/27/2018 06:34:56
------------------------------------------------------
######################################################
ETL Wrapper Finalizing - 09/27/2018 06:34:56
######################################################
------------------------------------------------------
 
Here is my logstash configuration: 
input {
file {
path => "D:/logs/file.log"
start_position => "beginning"
}
}
filter{
grok {
match => {"message" => "ETL Wrapper Initializing - %{DATESTAMP:JobStartTime}"}
match => {"message" => "ETL Wrapper Finalizing - %{DATESTAMP:JobEndTime}"}
}
if "_grokparsefailure" in [tags]{
drop{}
}
if [message] =~ /^$/ {
        drop { }
}
mutate{
    remove_field => ["@version","host","message" ]
    }
}
output {
elasticsearch {
    hosts => "http://localhost:9200/"
    index => "success_index"
    }
stdout { codec => rubydebug }
}
 
Output of above configuration: 
{
    "JobStartTime" => "09/27/2018 09:33:41",
      "@timestamp" => 2018-12-05T10:55:44.698Z,
            "path" => "D:/logs/file.log"
}
{
    "JobEndTime" => "09/27/2018 09:34:16",
    "@timestamp" => 2018-12-05T10:55:44.784Z,
          "path" => "D:/logs/file.log"
}
 
My expected output: 
{
    "JobStartTime" => "09/27/2018 09:33:41",
      "@timestamp" => 2018-12-05T10:55:44.698Z,
            "path" => "D:/logs/file.log"
    "JobEndTime" => "09/27/2018 09:34:16"
}
 
How can I merge "JobStartTime" and "JobEndTime" into single document?
Any help is appreciable.. 
Thanks in advance.!
-Vinod
             
            
               
               
               
            
            
           
          
            
              
                Michel99_7  
                (Rebmeister)
               
              
                  
                    December 6, 2018,  9:44am
                   
                   
              2 
               
             
            
              Hello vinodanumarla, 
Just have a look to the Aggregate Filter plugin which allows to do such things.
             
            
               
               
               
            
            
           
          
            
            
              Hello Michel99_7 
Thanks for the response.
I have tried with Aggregate Filter. Below is my filter,
aggregate { 
task_id => "%{path}" 
code => " 
map['path'] = event.get('path') 
map['JobStartTime'] ||=  
map['JobStartTime'] << {'JobStartTime' => event.get('JobStartTime')} 
map['JobEndTime'] ||=  
map['JobEndTime'] << {'JobEndTime' => event.get('JobEndTime')} 
event.cancel() 
" 
push_previous_map_as_event => true 
timeout => 3 
}
Below is the output:
{ 
"JobEndTime" => [ 
[0] { 
"JobEndTime" => nil 
}, 
[1] { 
"JobEndTime" => "09/27/2018 09:34:16" 
} 
], 
"@timestamp " => 2018-12-06T09:32:33.412Z, 
"JobStartTime" => [ 
[0] { 
"JobStartTime" => "09/27/2018 09:33:41" 
}, 
[1] { 
"JobStartTime" => nil 
} 
], 
"path" => "D:/logs/20180927_093341_PDCDWG1040_lylty_acct_extract.log 
.SUCCESS" 
}
Able to combine two docs as above. But, can we do it without creating lists like above i.e without separate mappings. 
Is it possible to get the output as below?
{ 
"JobStartTime" => "09/27/2018 09:33:41", 
"@timestamp " => 2018-12-05T10:55:44.698Z, 
"path" => "D:/logs/file.log" 
"JobEndTime" => "09/27/2018 09:34:16" 
}
Thanks!
             
            
               
               
               
            
            
           
          
            
              
                DyraSan  
                (San)
               
              
                  
                    December 6, 2018, 11:43am
                   
                   
              4 
               
             
            
              I'm trying to parse a log file into elasticsearch through logstash.
I want to send the following log as single event(i.e. as a single document) into elasticsearch.
Here is my log file looks like:
###################################################### 
ETL Wrapper Initializing - 09/27/2018 06:33:57 
###################################################### 
Wrapper Information - 09/27/2018 06:33:57 
 
Reading Component Log Port Files - 09/27/2018 06:34:53 
-- >     -- > Found 3 files and only merge non-zero byte files 
Renaming Reject Files - 09/27/2018 06:34:56 
###################################################### 
Sending Notifications - 09/27/2018 06:34:56 
###################################################### 
Setting Exit Status - 09/27/2018 06:34:56 
###################################################### 
ETL Wrapper Finalizing - 09/27/2018 06:34:56 
###################################################### 
Here is my logstash configuration: 
input { 
file { 
path => "D:/logs/file.log" 
start_position => "beginning" 
} 
} 
filter{ 
grok { 
match => {"message" => "ETL Wrapper Initializing - %{DATESTAMP:JobStartTime}"} 
match => {"message" => "ETL Wrapper Finalizing - %{DATESTAMP:JobEndTime}"} 
} 
if "_grokparsefailure" in [tags]{ 
drop{} 
} 
if [message] =~ /^$/ { 
drop { } 
} 
mutate{ 
remove_field => ["@version ","host","message" ] 
} 
} 
output { 
elasticsearch { 
hosts => "http://localhost:9200/ " 
index => "success_index" 
} 
stdout { codec => rubydebug } 
} 
Output of above configuration: 
{ 
"JobStartTime" => "09/27/2018 09:33:41", 
"@timestamp " => 2018-12-05T10:55:44.698Z, 
"path" => "D:/logs/file.log" 
} 
{ 
"JobEndTime" => "09/27/2018 09:34:16", 
"@timestamp " => 2018-12-05T10:55:44.784Z, 
"path" => "D:/logs/file.log" 
} 
My expected output: 
{ 
"JobStartTime" => "09/27/2018 09:33:41", 
"@timestamp " => 2018-12-05T10:55:44.698Z, 
"path" => "D:/logs/file.log" 
"JobEndTime" => "09/27/2018 09:34:16" 
} 
How can I merge "JobStartTime" and "JobEndTime" into single document?
Any help is appreciable.. Thanks in advance!
Thanks, 
kissanime 
             
            
               
               
               
            
            
           
          
            
              
                Michel99_7  
                (Rebmeister)
               
              
                  
                    December 6, 2018, 12:42pm
                   
                   
              5 
               
             
            
              Hi Vino,
You can also use a multiline command in the input section:
input { 
file { 
path => "C:/test/*.log" 
#sincedb_path  => "/dev/null" 
start_position => "beginning" 
discover_interval => 5 
close_older => 60 
mode => "tail" 
file_sort_by => "path" 
codec => multiline { 
pattern => "^ETL Wrapper Initializing" 
negate => true 
what => previous 
} 
} 
}
filter { 
grok { match => {"message" => "^ETL Wrapper Initializing - %{DATESTAMP:JobStartTime}"} } 
grok { match => {"message" => "ETL Wrapper Finalizing - %{DATESTAMP:JobEndTime}"} } 
mutate { remove_field => ["message"] } 
}
output { 
stdout {codec => rubydebug} 
}
             
            
               
               
               
            
            
           
          
            
              
                system  
                (system)
                  Closed 
               
              
                  
                    January 3, 2019, 12:52pm
                   
                   
              6 
               
             
            
              This topic was automatically closed 28 days after the last reply. New replies are no longer allowed.