Logstash, one json object to multiple ones - json

please my logstash input is the following :
{"views":[{"name":"a"},{"name":" b"},{"name":" c"}]}
I just want to insert it into Elasticsearch as 3 documents, not one, but logstash outputs it as one document, please any idea to solve this ?

try on this example:
input {
stdin {
}
}
filter {
json {
source => "message"
}
split {
field => "views"
}
}
output {
stdout {
codec => rubydebug
}
}

Related

Filtering JSON/non-JSON entries in Logstash

I have a question about filtering entries in Logstash. I have two different logs coming into Logstash. One log is just a std format with a timestamp and message, but the other comes in as JSON.
I use an if statement to test for a certain host and if that host is present, then I use the JSON filter to apply to the message... the problem is that when it encounters the non-JSON stdout message it can't parse it and throws exceptions.
Does anyone know how to test to see if an entry is JSON coming in apply the filter and if not, just ignore it?
thanks
if [agent][hostname] == "some host"
# if an entry is not in json format how to ignore?
{
json {
source => "message"
target => "gpfs"
}
}
You can try with a grok filter as a first step.
grok {
match => {
"message" => [
"{%{GREEDYDATA:json_message}}",
"%{GREEDYDATA:std_out}"
]
}
}
if [json_message]
{
mutate {
replace => { "json_message" => "{%{json_message}}"}
}
json {
source => "json_message"
target => "gpfs"
}
}
Probably there is a more cleaner solution then this, but it will do the job.

Logstash metrics event rate example

I'm trying to figure out what a proper example configuration for the logstash metrics plugin should look like. (Using logstash 1.4.2)
The original from the documentation isn't even passing the configtest :( ... so that's what I come up with so far:
input {
generator
type => "generated"
count => 10
}
}
filter {
metrics {
meter => [ "events" ]
add_tag => "metric"
}
}
output {
stdout {
codec => line {
format => "rate: %{events.rate_1m}"
}
}
}
My expected output is sth. like:
rate: 23721.983566819246
But what I actually get is (10 times of course):
rate: %{events.rate_1m}
Any hints are welcome.
Thanks
Found the solution myself.
Note to self ... the regular events and the metrics events have to be treaded differently.
The output configuration has to be kept within a proper condition like this:
output {
if "metric" in [tags] {
stdout {
codec => line {
format => "rate: %{events.rate_1m}"
}
}
}
}

Logstash is not pushing json format files

I am new in Elasticsearch,Kibana et Logstash. I am trying to load a json file like this one:
{"timestamp":"2014-05-19T00:00:00.430Z","memoryUsage":42.0,"totalMemory":85.74,"usedMemory":78.77,"cpuUsage":26.99,"monitoringType":"jvmHealth"}
{"timestamp":"2014-05-19T00:09:10.431Z","memoryUsage":43.0,"totalMemory":85.74,"usedMemory":78.77,"cpuUsage":26.99,"monitoringType":"jvmHealth"}
{"timestamp":"2014-05-19T00:09:10.441Z","transactionTime":1,"nbAddedObjects":0,"nbRemovedObjects":0,"monitoringType":"transactions"}
{"timestamp":"2014-05-19T00:09:10.513Z","transactionTime":6,"nbAddedObjects":4,"nbRemovedObjects":0,"monitoringType":"transactions"}
No index is created and I just get this message :
Using milestone 2 input plugin 'file'. This plugin should be stable,
but if you see strange behavior, please let us know! For more
information on plugin milestones, see
http://logstash.net/docs/1.4.1/plugin-milestones {:level=>:warn}
What can be the problem? I can use directly bulk but I must go with logstash.
Do you have any suggested code that can help?
EDIT (to move the config from a comment into the question):
input {
file {
path => "/home/ndoye/Elasticsearch/great_log.json"
type => json
codec => json
}
}
filter {
date {
match => ["timestamp","yyyy-MM-dd HH:mm:ss.SSS"]
}
}
output {
stdout{
#codec => rubydebug
}
elasticsearch {
embedded => true
}
}

Using JSON with LogStash

I'm going out of my mind here. I have an app that writes logs to a file. Each log entry is a JSON object. An example of my .json file looks like the following:
{"Property 1":"value A","Property 2":"value B"}
{"Property 1":"value x","Property 2":"value y"}
I'm trying desperately to get the log entries into LogStash. In an attempt to do this, I've created the following LogStash configuration file:
input {
file {
type => "json"
path => "/logs/mylogs.log"
codec => "json"
}
}
output {
file {
path => "/logs/out.log"
}
}
Right now, I'm manually adding records to mylogs.log to try and get it working. However, they appear oddly in the stdout. When I look open out.log, I see something like the following:
{"message":"\"Property 1\":\"value A\", \"Property 2\":\"value B\"}","#version":"1","#timestamp":"2014-04-08T15:33:07.519Z","type":"json","host":"ip-[myAddress]","path":"/logs/mylogs.log"}
Because of this, if I send the message to ElasticSearch, I don't get the fields. Instead I get a jumbled mess. I need my properties to still be properties. I do not want them crammed into the message portion or the output. I have a hunch this has something to do with Codecs. Yet, I'm not sure. I'm not sure if I should change the codec on the logstash input configuration. Or, if I should change the input on the output configuration.
Try removing the json codec and adding a json filter:
input {
file {
type => "json"
path => "/logs/mylogs.log"
}
}
filter{
json{
source => "message"
}
}
output {
file {
path => "/logs/out.log"
}
}
You do not need the json codec because you do not want decode the source JSON but you want filter the input to get the JSON data in the #message field only.
By default tcp put everything to message field if json codec not specified.
An workaround to _jsonparsefailure of the message field after we specify the json codec also can be rectified by doing the following:
input {
tcp {
port => '9563'
}
}
filter{
json{
source => "message"
target => "myroot"
}
json{
source => "myroot"
}
}
output {
elasticsearch {
hosts => [ "localhost:9200" ]
}
}
It will parse message field to proper json string to field myroot
and then myroot is parsed to yield the json.
We can remove the redundant field like message as
filter {
json {
source => "message"
remove_field => ["message"]
}
}
Try with this one:
filter {
json {
source => "message"
target => "jsoncontent" # with multiple layers structure
}
}

Having Logstash reading JSON

I am trying to use logstash for analyzing a file containing JSON objects as follows:
{"Query":{"project_id":"a7565b911f324a9199a91854ea18de7e","timestamp":1392076800,"tx_id":"2e20a255448742cebdd2ccf5c207cd4e","token":"3F23A788D06DD5FE9745D140C264C2A4D7A8C0E6acf4a4e01ba39c66c7c9cbd6a123588b22dc3a24"}}
{"Response":{"result_code":"Success","project_id":"a7565b911f324a9199a91854ea18de7e","timestamp":1392076801,"http_status_code":200,"tx_id":"2e20a255448742cebdd2ccf5c207cd4e","token":"3F23A788D06DD5FE9745D140C264C2A4D7A8C0E6acf4a4e01ba39c66c7c9cbd6a123588b22dc3a24","targets":[]}}
{"Query":{"project_id":"a7565b911f324a9199a91854ea18de7e","timestamp":1392076801,"tx_id":"f7f68c7fb14f4959a1db1a206c88a5b7","token":"3F23A788D06DD5FE9745D140C264C2A4D7A8C0E6acf4a4e01ba39c66c7c9cbd6a123588b22dc3a24"}}
Ideally i'd expect Logstash to understand the JSON.
I used the following config:
input {
file {
type => "recolog"
format => json_event
# Wildcards work, here :)
path => [ "/root/isaac/DailyLog/reco.log" ]
}
}
output {
stdout { debug => true }
elasticsearch { embedded => true }
}
I built this file based on this Apache recipe
When running logstash with debug = true, it reads the objects like this:
How could i see stats in the kibana GUI based on my JSON file, for example number of Query objects and even queries based on timestamp.
For now it looks like it understand a very basic version of the data not the structure of it.
Thx in advance
I found out that logstash will automatically detect JSON byt using the codec field within the file input as follows:
input {
stdin {
type => "stdin-type"
}
file {
type => "prodlog"
# Wildcards work, here :)
path => [ "/root/isaac/Mylogs/testlog.log"]
codec => json
}
}
output {
stdout { debug => true }
elasticsearch { embedded => true }
}
Then Kibana showed the fields of the JSON perfectly.