How to feed CSV to logstash with Dynamic Index mapping - logstash

Trying to feed logstash a csv for elastic indexing facing mapping error. The conf code is
using autodetect_column_names so I don't have to feed in the columns
name. Also I havent created any index or mapping for the data from dev console and expecting the logstash to create index and dynamic mapping at run time.
input {
file {
path => "/Users/amansingh/SELECT_______orca_OpID_as_op_id________t.csv"
start_position => "beginning"
sincedb_path => "/dev/null"
}
}
filter {
csv {
separator => ","
autodetect_column_names => true
convert => {
"is_cancelled_2" => "boolean"
"is_cancelled_14" => "boolean"
"is_cancelled_7" => "boolean"
"is_cancelled_30" => "boolean"
"is_cancelled" => "boolean"
"is_dispute" => "boolean"
"is_return" => "boolean"
"is_large_parcel" => "boolean"
"is_managed" => "boolean"
}
}
}
output {
elasticsearch {
hosts => "http://localhost:9200"
index => "bit_prices"
document_type => "doc"
}
stdout {}
}
error:
[2018-07-27T10:05:25,172][WARN ][logstash.outputs.elasticsearch] Could not index event to Elasticsearch. {:status=>400, :action=>["index", {:_id=>nil, :_index=>"bit_prices", :_type=>"doc", :_routing=>nil}, #<LogStash::Event:0x5568f8e6>], :response=>{"index"=>{"_index"=>"bit_prices", "_type"=>"doc", "_id"=>"C1wO3GQByymnO3qY9KTy", "status"=>400, "error"=>{"type"=>"illegal_argument_exception", "reason"=>"mapper [0] of different type, current_type [text], merged_type [ObjectMapper]"}}}}
The csv file looks like
op_id,is_cancelled_2,is_cancelled_14,is_cancelled_7,is_cancelled_30,revenue_adjustment_2,revenue_adjustment_7,revenue_adjustment_14,revenue_adjustment_30,cost_adjustment_2,cost_adjustment_7,cost_adjustment_14,cost_adjustment_30,order_date,is_cancelled,update_date,is_dispute,orcompletionstatus,is_return,is_large_parcel,is_managed
1627151503,0,0,0,0,0.0000,0.0000,0.0000,0.0000,0.0000,17.5100,17.5100,17.5100,2018-02-10 13:19:19.000,0,2018-02-14 02:00:41.003,0,3,0,0,0
1627151503,0,0,0,0,0.0000,0.0000,0.0000,0.0000,0.0000,17.5100,17.5100,17.5100,2018-02-10 13:19:19.000,0,2018-02-14 02:00:41.003,0,3,0,0,0

Related

Logstash: Custom delimiter for multi-line XML logs

I have XML logs where logs are closed with "=======", e.g.
<log>
<level>DEBUG</level>
<message>This is debug level</message>
</log>
=======
<log>
<level>ERROR</level>
<message>This is error level</message>
</log>
=======
Every log can span across multiple lines.
How to parse those logs using logstash?
This can be done using multiline codec. The delimiter "=======" can be used in pattern like this
input {
file {
type => "xml"
path => "/path/to/logs/*.log"
codec => multiline {
pattern => "^======="
negate => "true"
what => "previous"
}
}
}
filter {
mutate {
gsub => [ "message", "=======", ""]
}
xml {
force_array => false
source => "message"
target => "log"
}
mutate {
remove_field => [ "message" ]
}
}
output {
elasticsearch {
codec => json
hosts => ["http://localhost:9200"]
index => "logs-%{+YYYY.MM.dd}"
}
}
Here the combination of pattern and negate => true means: if a line does not start with "=======" it belongs to the previous event (thus what => "previous"). When a line with the delimiter is hit, we start a new event. In the filter the delimiter is simply removed with gsub and XML is parsed with xml plugin.

How to cumul filters with logstash?

I'm currently discovering elastic search, kibana and logstash with docker. (Version 7.1.1) The three containers are running well.
I have some data files containing some lines like this one:
foo=bar type=alpha T=20180306174204527
My logstash.conf contains:
input {
file {
path => "/tmp/data/*.txt"
start_position => "beginning"
}
}
filter {
kv {
field_split => "\t"
value_split => "="
}
}
output {
elasticsearch { hosts => ["elasticsearch:9200"] }
stdout {
codec => rubydebug
}
}
I handle this data:
{
"host" => "07f3051a3bec",
"foo" => "bar",
"message" => "foo=bar\ttype=alpha\tT=20180306174204527",
"T" => "20180306174204527",
"#timestamp" => 2019-06-17T13:47:14.589Z,
"path" => "/tmp/data/ucL12018_03_06.txt",
"type" => "alpha"
"#version" => "1",
}
First step of job is done.
Now I want to add a filter to transform the value of the key T as a timestamp.
{
...
"T" => "2018-03-06T17:42:04.527Z",
"#timestamp" => 2019-06-17T13:47:14.589Z,
...
}
I do not know how to do it. I tried to add a second filter just after the kv filter, but nothing change when I add new files.
Add this filter after the kv filter:
date {
match => [ "T", "yyyyMMddHHmmssSSS" ]
target => "T"
}
The date filter will try to parse the field T using the provided pattern to create a date, which will be written to the T field (by default it overwrite the #timestamp field).

Data missed in Logstash?

Data missed a lot in logstash version 5.0,
is it a serous bug ,when a config the config file so many times ,it useless,data lost happen again and agin, how to use logstash to collect log event property ?
any reply will thankness
Logstash is all about reading logs from specific location and based on you interested information you can create index in elastic search or other output also possible.
Example of logstash conf
input {
file {
# PLEASE SET APPROPRIATE PATH WHERE LOG FILE AVAILABLE
#type => "java"
type => "json-log"
path => "d:/vox/logs/logs/vox.json"
start_position => "beginning"
codec => json
}
}
filter {
if [type] == "json-log" {
grok {
match => { "message" => "UserName:%{JAVALOGMESSAGE:UserName} -DL_JobID:%{JAVALOGMESSAGE:DL_JobID} -DL_EntityID:%{JAVALOGMESSAGE:DL_EntityID} -BatchesPerJob:%{JAVALOGMESSAGE:BatchesPerJob} -RecordsInInputFile:%{JAVALOGMESSAGE:RecordsInInputFile} -TimeTakenToProcess:%{JAVALOGMESSAGE:TimeTakenToProcess} -DocsUpdatedInSOLR:%{JAVALOGMESSAGE:DocsUpdatedInSOLR} -Failed:%{JAVALOGMESSAGE:Failed} -RecordsSavedInDSE:%{JAVALOGMESSAGE:RecordsSavedInDSE} -FileLoadStartTime:%{JAVALOGMESSAGE:FileLoadStartTime} -FileLoadEndTime:%{JAVALOGMESSAGE:FileLoadEndTime}" }
add_field => ["STATS_TYPE", "FILE_LOADED"]
}
}
}
filter {
mutate {
# here converting data type
convert => { "FileLoadStartTime" => "integer" }
convert => { "RecordsInInputFile" => "integer" }
}
}
output {
elasticsearch {
# PLEASE CONFIGURE ES IP AND PORT WHERE LOG DOCs HAS TO PUSH
document_type => "json-log"
hosts => ["localhost:9200"]
# action => "index"
# host => "localhost"
index => "locallogstashdx_new"
# workers => 1
}
stdout { codec => rubydebug }
#stdout { debug => true }
}
To know more you can go throw many available websites like
https://www.elastic.co/guide/en/logstash/current/first-event.html

logstash configuration grok parse timestamp

I am trying to parse
[7/1/05 13:41:00:516 PDT]
This is the configuration grok I have written for the same :
\[%{DD/MM/YY HH:MM:SS:S Z}\]
With the date filter :
input {
file {
path => "logstash-5.0.0/bin/sta.log"
start_position => "beginning"
}
}
filter {
grok {
match =>" \[%{DATA:timestamp}\] "
}
date {
match => ["timestamp","DD/MM/YY HH:MM:SS:S ZZZ"]
}
}
output {
stdout{codec => "json"}
}
above is the configuration I have used.
And consider this as my sta.log file content:
[7/1/05 13:41:00:516 PDT]
Getting this error :
[2017-01-31T12:37:47,444][ERROR][logstash.agent ] fetched an invalid config {:config=>"input {\nfile {\npath => \"logstash-5.0.0/bin/sta.log\"\nstart_position => \"beginning\"\n}\n}\nfilter {\ngrok {\nmatch =>\"\\[%{DATA:timestamp}\\]\"\n}\ndate {\nmatch => [\"timestamp\"=>\"DD/MM/YY HH:MM:SS:S ZZZ\"]\n}\n}\noutput {\nstdout{codec => \"json\"}\n}\n\n", :reason=>"Expected one of #, {, ,, ] at line 12, column 22 (byte 184) after filter {\ngrok {\nmatch =>\"\\[%{DATA:timestamp}\\]\"\n}\ndate {\nmatch => [\"timestamp\""}
Can anyone help here?
You forgot to specify the input for your grokfilter. A correct configuration would look like this:
input {
file {
path => "logstash-5.0.0/bin/sta.log"
start_position => "beginning"
}
}
filter {
grok {
match => {"message" => "\[%{DATA:timestamp} PDT\]"}
}
date {
match => ["timestamp","dd/MM/yy HH:mm:ss:SSS"]
}
}
output {
stdout{codec => "json"}
}
For further reference check out the grok documentation here.

Logstash - grok renaming field name

Here is an exmple of event message:
{
"timestamp":"2016-03-29T22:35:44.770750-0400",
"flow_id":45385792,
"in_iface":"eth1",
"event_type":"alert",
"src_ip":"3.3.3.8",
"src_port":21,
"dest_ip":"2.2.2.2",
"dest_port":52934,
"proto":"TCP",
"alert":{
"action":"allowed",
"gid":1,
"signature_id":4027,
"rev":0,
"signature":"FTP Successful Login",
"category":"",
"severity":3
},
"payload":"MjU3ICIvaG9tZS9uZXd1c2VyIg0K",
"payload_printable":"257 newuser",
"stream":0,
"packet":"AFBWo0NoAFBWoxZWCABFAABJKDpAAEAGCGcDAwMIAgICAgAVzsbd4MhqOBOjfoAYAOMYcwAAAQEIChHN4EQHnwugMjU3ICIvaG9tZS9uZXd1c2VyIg0K"
}
input
beats
port => 5044
codec => json
type => "SuricataIDPS"
My Logstash config file is the following:
output
elasticsearch
hosts => ["localhost:9200"]
sniffing => true
manage_template => false
index => "%{[#metadata][beat]}-%{+YYYY.MM.dd}"
#document_type => "%{[#metadata][type]}"
I'd like to be able to rename the field alert.signature,
How can I do so?... Seems that it does not recognize that field...
Thanks for your help!
Efrat
You have to define mutate filter within filter stanza:
filter {
mutate {
rename => [ "[alert][signature]", "[alert][signature_renamed]" ]
}
}

Resources