Logstash output plugin for JDBC/mySQL - mysql

I am collecting Twitter and Instagram data using Logstash and I want to save it to Elasticsearch, MongoDB, and MySQL. There are Logstash output plugins available for Elasticsearch and MongoDB but not for MySQL (it is a requirement to save this data to multiple databases).
Any workaround for this?
Thanks!

You should install plugin ouput-jdbc for logstash. Download from https://github.com/theangryangel/logstash-output-jdbc/tree/master And build、install 。
And then you can use like this:
input {
stdin{}
}
filter{
json{
source => "message"
}
}
output {
stdout{
codec=>rubydebug{}
}
jdbc {
connection_string => "jdbc:mysql://192.168.119.202:3306/outMysql?user=root&password=root"
statement => ["INSERT INTO user(userName,ip) values(?,?)","userName","ip"]
}
}

Related

Filter Kafka JSON messages with Logstash grok

I try to filter kafka json messages only for Germany (DE). To do that I have to write a grok expression. Can anyone help me in writing a grok pattern for this json?
{"table":"ORDERS","type":"I","payload":{"ID":"28112","COUNTRY":"DE","AMT":15.36}}
{"table":"ORDERS","type":"I","payload":{"ID":"28114","COUNTRY":"US","AMT":25.75}}
Sorry, that I'm new to these technologies. Here is what my logstash.conf looks like:
input {
kafka {topics => [ "test" ] auto_offset_reset => "earliest" }
}
filter {
grok {
match => { "message" => "?????????" }
if [message] =~ "*COUNTRY*DE*" {
drop{}
}
}
}
output { file { path => "./test.txt" } }
In the end I just wanna file with the Germany orders. Hope to get some help, thanks!
Do you need to use Logstash?
If not, I would suggest a simple KSQL statement
CREATE STREAM GERMAN_ORDERS AS SELECT * FROM ORDERS WHERE COUNTRY='DE';
This creates a Kafka topic that is streamed from the first, and has just the data that you want on it. From the Kafka topic you can use Kafka Connect to land it to a file if you want that as part of your processing pipeline.
Read an example of using KSQL here, and try it out here

Logstash conditional output using environment variable not working

I'm using Logstash to send log data to Elasticsearch (of course), but some of my end users also want the data sent to a secondary csv file so they can do their own processing. I am trying to use an environment variable to determine if we need to output to a secondary file and if so, where that file should live.
My Logstash looks like this:
input {
. . .
}
filter {
. . .
}
output {
elasticsearch {
. . .
}
if "${SECONDARY_OUTPUT_FILE:noval}" != "noval" {
csv {
fields => . . .
path => "${ SECONDARY_OUTPUT_FILE:noval}"
}
}
}
When SECONDARY_OUTPUT_FILE has a value, it works fine. When it does not, Logstash writes csv output to a file named "noval". My conclusion is that the if statement is not working correctly with the environment variable.
I'm using Logstash version 2.3.2 on a Windows 7 machine.
Any suggestions or insights would be appreciated.
Actually that is a very good question, there is still an ongoing enhancement opened on this topic on github, as mentioned by IrlJidel on the issue, a workaround to the issue would be:
mutate {
add_field => { "[#metadata][SECONDARY_OUTPUT_FILE]" => "${SECONDARY_OUTPUT_FILE:noval}" }
}
if [#metadata][SECONDARY_OUTPUT_FILE] != "noval" {
csv {
fields => . . .
path => "${SECONDARY_OUTPUT_FILE}"
}
}
just a quick update, since Logstash 7.17 using variables in conditionals work as expected: https://github.com/elastic/logstash/issues/5115#issuecomment-1022123571

How to send json events to ES with Logstash Plugin for Amazon ES?

I am new to ES. Trying to send json events to ES with https://github.com/awslabs/logstash-output-amazon_es
However, when I give below configuration it does not recognize any events?
input {
file {
path => "C:/Program Files/logstash-2.3.1/transactions.log"
start_position => beginning
codec => "json_lines"
}
}
filter {
json {
source => "message"
}
}
output {
amazon_es {
hosts => ["endpoint"]
region => "us-east-1"
codec => json
index => "production-logs-%{+YYYY.MM.dd}"
}
}
I am running it in debug mode but there is nothing in the log
Also do I need to create the index before I start sending the events from Logstash?
The below config works somehow, however it does not recognize any json fields
input {
file {
path => "C:/Program Files/logstash-2.3.1/transactions.log"
start_position => beginning
}
}
output {
amazon_es {
hosts => ["Endpoint"]
region => "us-east-1"
index => "production-logs-%{+YYYY.MM.dd}"
}
}
There may be several things at play here, including:
Logstash thinks your file has already been processed. start_position is only for files that haven't been seen before. If you're testing, set sincedb_path to /dev/null, or manually manage your registry files.
You're having mapping problems. Elasticsearch will drop documents when the field mapping isn't correct (trying to insert a string into a numeric field, etc). This should be shown in the elasticsearch logs, if you can get to them on AWS.
debug is very verbose. If you're really getting nothing, then you're not receiving any input. See the first bullet item.
adding a stdout{} output is a good idea until you get things working. This will show you what logstash is sending to elasticsearch.

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
}
}

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.