logstash simple file input/output - logstash

I have trouble getting logstash to work. The Basic logstash Example works. But then I struggle with the Advanced Pipeline Example. Perhaps it could be as well a problem with elasticsearch.
Now I just want to check if a simple example work:
input: read textfile-a
output: generate new textfile-b with input of the textfile-a
But I am struggling with that. My config is the following:
# foo.conf
input {
file {
path => "C:/logstash-2.3.1/logstash-tutorial-dataset"
start_position => "beginning"
}
}
output {
stdout {}
file {
#message_format => "%{foo},%{bar},%{fii},%{bor},%{bing}"
#codec => { line { format => "custom format: %{message}"}}
path => "C:/output.txt"
}
}
When I run logstash, I get the following response and nothings happens.
bin/logstash -f foo.conf -v --debug --verbose
io/console not supported; tty will not be manipulated
{:timestamp=>"2016-04-22T13:41:15.514000+0200", :message=>"starting agent", :level=>:info}
{:timestamp=>"2016-04-22T13:41:15.518000+0200", :message=>"starting pipeline", :id=>"main", :level=>:info}
{:timestamp=>"2016-04-22T13:41:16.035000+0200", :message=>"Registering file input", :path=>["C:/logstash-2.3.1/logstash-tutorial-dataset"], :level=>:info}
{:timestamp=>"2016-04-22T13:41:16.039000+0200", :message=>"No sincedb_path set, generating one based on the file path", :sincedb_path=>"c:/Users/foobar/.sincedb_802dc9c88c8fad631bf3d3a5c96435e4", :path=>["C:/logstash-2.3.1/logstash-tutorial-dataset"], :level=>:info}
{:timestamp=>"2016-04-22T13:41:16.103000+0200", :message=>"Starting pipeline", :id=>"main", :pipeline_workers=>4, :batch_size=>125, :batch_delay=>5, :max_inflight=>500, :level=>:info}
{:timestamp=>"2016-04-22T13:41:16.106000+0200", :message=>"Pipeline main started"}
how do I get the simple example working?

ignore_older => 0 did the trick, see documentaion: ignore_older.
The working configuration is the following:
# foo.conf
input {
file {
path => "C:/logstash-2.3.1/logstash-tutorial-dataset"
start_position => "beginning"
ignore_older => 0
}
}
output {
stdout {}
file {
path => "C:/output.txt"
}
}
Now the .sincedb* file contains as well content.

Logstash remembers which files it has processed, and how much of them it has processed. In normal operations, this allows it to restart in case of failure and not reprocess logs.
In your case, I imagine that your log file has been processed once already, so logstash is ignoring it. The "start_position" parameter you've provided is documented to only apply to new files.
You would either need to reset your registry (perhaps files like /var/lib/logstash/.sincedb*), or set the "sincedb_path" parameter in your file{} into to /dev/null so that it doesn't maintain the history while you're testing.

Related

Logstash not producing output or inserting to elastic search

When i execute the configuration file using the command bin\logstash -f the configfile.conf. There is not display on the console just the logs by logstash.
Here is the configuation file:
input
{
file
{
path => "F:\ELK\50_Startups.csv"
start_position => "beginning"
}
}
filter
{
csv
{
separator => ","
columns => ["R&D","Administration","Marketing","State","Profit"]
}
}
output
{
elasticsearch
{
hosts => ["localhost:9200"]
index => ["Startups"]
}
stdout{}
}
do the input file (50_Startups.csv) has fresh data written to? if not, it might be that logstash already stored the read offset as the last line, and it would not re-read it on future runs, unless you delete the sincedb_path offset files, of just add the following config:
sincedb_path => "/dev/null"
That would force logstash to re-parse the file.
see more info on files offsets here:https://www.elastic.co/guide/en/logstash/current/plugins-inputs-file.html#_tracking_of_current_position_in_watched_files
from it:
By default, the sincedb file is placed in the data directory of Logstash with a filename based on the filename patterns being watched

logstash: File input not working, stdout does not show anything at all (Windows)

I am new to logstash, I was trying to give a sample log file as input through the logstash config file. But it does not seem to be working. Initially I gave input through stdin, it worked perfectly and showed the output in stdout. I placed the same input I gave through stdin in the log file and tried giving the input but it does not seem to read the file at all.
This is my config file:
`
input {
file{
path =>"C:\pdata\ct.log"
start_position =>"beginning"
}
}
filter {
grok {
match => { "message" => "%{IP:client} %{WORD:method} %{URIPATHPARAM:request} %{NUMBER:bytes} %{NUMBER:duration}" }
}
}
output {
stdout {codec => rubydebug}
}
The presence of sincedb_path does not seem to make any difference.
Use forward slashes in your input configuration.
input {
file{
path =>"C:/pdata/ctop.log"
start_position =>"beginning"
}

Parsing log file with logs of different patterns Logstash

I am new to logstash in that matter ELK stack. A log file is having different processes logging data to it. Each process writes logs with different patterns. I want to parse this log file. Each log in this log file is started with below grok pattern,
%{SYSLOGTIMESTAMP:timestamp} %{SYSLOGHOST:logsource} %{SYSLOGPROG}: +
%{SRCFILE:srcfile}:%{NUMBER:linenumber} where SRCFILE is defined as
[a-zA-Z0-9._-]+
Please let me know how can I parse this file so that different type of logs from each process logging in this file can be parsed.
Since you're trying to pass in log files, you might have to use the file input plugin in order to retrieve a file or x number of files from a given path. So a basic input could look something like this:
input {
file {
path => "/your/path/*"
exclude => "*.gz"
start_position => "beginning"
ignore_older => 0
sincedb_path => "/dev/null"
}
}
The above is just a sample for you to reproduce. So once you get the files and start processing them line by line, you could use the grok filter in order to match the keywords from your log file. A sample filter could look something like this:
grok {
patterns_dir => ["/pathto/patterns"]
match => { "message" => "%{SYSLOGTIMESTAMP:timestamp} %{SYSLOGHOST:logsource} %{SYSLOGPROG}: + %{SRCFILE:srcfile}:%{NUMBER:linenumber} where SRCFILE is defined as [a-zA-Z0-9._-]+" }
}
You might have to use different filters if you're having different type of logs printed within a single file OR you could have it in the same line with a , comma separated values. Something like:
grok {
match => { "message" => [
"TYPE1,%{WORD:a1},%{WORD:a2},%{WORD:a3},%{POSINT:a4}",
"TYPE2,%{WORD:b1},%{WORD:b2},%{WORD:b3},%{WORD:b4}",
"TYPE3,%{POSINT:c1},%{WORD:c2},%{POSINT:c3},%{WORD:c4}" ]
}
}
And then maybe you could play around with the message, since you've got all the values you needed right within it. Hope it helps!

Duplicate entries into Elastic Search while logstash instance is running

I have been trying to send logs from logstash to elasticsearch.Suppose I am running a logstash instance and while it is running,I make a change to the file which the logstash instance is monitoring,then all the logs which have been previously saved in the elasticsearch are saved again,hence duplicates are formed.
Also,when the logstash instance is closed and is restarted again,the logs gets duplicated in the elasticsearch.
How do I counter this problem?
How to send only the newest added entry in the file from logstash to elasticsearch?
My logstash instance command is the following:
bin/logstash -f logstash-complex.conf
and the configuration file is this:
input
{
file
{
path => "/home/amith/Desktop/logstash-1.4.2/accesslog1"
}
}
filter
{
if [path] =~ "access"
{
mutate
{
replace =>
{ "type" => "apache_access" } }
grok {
match => { "message" => "%{COMBINEDAPACHELOG}" }
}
}
date {
match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ]
}
}
output {
elasticsearch {
host => localhost
index => feb9
}
stdout { codec => rubydebug }
}
I got the solution.
I was opening the file,adding a record and saving it ,due to which logstash treated the same file as a different file each time I saved it as it registered different inode number for the same file.
The solution is to append a line to the file without opening the file but by running the following command.
echo "the string you want to add to the file" >> filename
[ELK stack]
I wanted some custom configs in
/etc/logstash/conf.d/vagrant.conf
so the first step was to make a backup: /etc/logstash/conf.d/vagrant.conf.bk
This caused logstash to add 2 entries in elasticseach for each entry in <file>.log;
the same if i had 3 files in /etc/logstash/conf.d/*.conf.* in ES i had 8 entries for each line in *.log
As you mentioned in your question.
when the logstash instance is closed and is restarted again,the logs gets duplicated in the elasticsearch.
So, it probably you have delete the .since_db. Please have a look at here.
Try to specific the since_db and start_position. For example:
input
{
file
{
path => "/home/amith/Desktop/logstash-1.4.2/accesslog1"
start_position => "end"
sincedb_path => /home/amith/Desktop/sincedb
}
}

logstash : file input is not working

I am trying to run sample eg. using logstash-1.4.2 in CDH 4.4. Whenever I use file input instead of stdin, the window freezes at the following message:
Using milestone 2 plugin 'file'. This plugin should be stable but if
you see strange behavior, please let us know! For more
information.....
My code looks like this:
input {
file {
path => "/tmp/access_log"
start_position => "beginning"
}
}
filter {
if [path] =~ "access" {
mutate { replace => { "type" => "apache_access" } }
grok {
match => { "message" => "%{COMBINEDAPACHELOG}" }
}
}
date {
match => [ "timestamp" , "dd/MMM/yyyy:HH:mm:ss Z" ]
}
}
output {
file{
path =>"/logs/output_log"
}
}
Command- bin/logstash -f logstash-apache.conf
I have tried deleting all my previous sincedb files in the $HOME. directory and re-run logstash, but that doesn't seem to work either. Am I missing something?
if you have just one line in your input file,
you should add an empty line at the end!
that should work!
edited:
AND if you are on a windows machine, you need to write the absolute path like
"c:/dev/access-log.txt"
and take care of just using one / instead of // after the c:
I got stuck because logstash tracks which logs it has already read: https://stackoverflow.com/a/24034718/268907
Remember that this option only modifies “first contact” situations where a file is new and not seen before. If a file has already been seen before, this option has no effect. Otherwise you have to set your sincedb_path to /dev/null .
Set sincedb_path to /dev/null and you will prevent it from tracking the position in the file that it last read.
Are you running with root permissions? It looks like /logs/output_log needs root permission to be written to.
I tried your configuration locally with logstash 1.4.1 (and sudo) and it seems to be working fine.
Could you try the below one. It worked for me.
path => "/tmp/access_log/*"
instead of
path => "/tmp/access_log"

Resources