logstash file input glob not working - logstash

I'm starting to explore logstash and this is probably a newbie question, but as far as I have studied this should be working and it isn't.
I have a very simple configuration that just reads log files and dump them to the stdout. It works for a single file and for a list (array) of files, but if I use a glob that matches the same files, nothing happens.
I've tested the glob with a short ruby script and it lists the correct files.
Here is my configuration:
input {
file {
path => "/home/lpacheco/*.log"
start_position => "beginning"
}
}
output {
stdout {}
}
If I run this with --verbose I get:
{:timestamp=>"2015-09-23T11:26:47.008000-0300", :message=>"Registering file input", :path=>["/home/lpacheco/*.log"], :level=>:info}
{:timestamp=>"2015-09-23T11:26:47.068000-0300", :message=>"No sincedb_path set, generating one based on the file path", :sincedb_path=>"/home/.sincedb_6da9e0c63851aa9d5840ba19efd196cb", :path=>["/home/lpacheco/*.log"], :level=>:info}
{:timestamp=>"2015-09-23T11:26:47.089000-0300", :message=>"Pipeline started", :level=>:info}
Nothing else happens.
I'm using:
logstash 1.5.4
OpenJDK Runtime Environment (IcedTea 2.5.6)
(7u79-2.5.6-0ubuntu1.14.04.1)
ruby 1.9.3p484 (2013-11-22 revision
43786) [i686-linux]

You are apparently confronted with a sincedb-issue. Logstash saves the last position of a logfile in a file called sincedb. The sincedb is based on the inode of the log file so that renaming or using globs doesn't have any effect.
Try this input for testing:
input {
file {
path => "/home/lpacheco/*.log"
start_position => "beginning"
sincedb_path => "/dev/null"
}
}
From latest docs:
Path of the sincedb database file (keeps track of the current position
of monitored log files) that will be written to disk. The default will
write sincedb files to some path matching $HOME/.sincedb* NOTE: it
must be a file path and not a directory path
For more information, take a look at related questions like this.

Related

How to make logstash file input work on windows machine?

I have a runningversion of logstash on my windows machine.
The file input filter does not work. The logstash script starts and nothing happens -> no success or error.
Generate input filter, and stdin all work properly.
The file input filter stopped working after 2-3 days.
The file output filter works fine.
PFB my settings.
file {
path => "D:\softwares\logstash\data\sample4.txt"
# path => "D:/softwares/logstash/data/sample4.txt"
start_position => "beginning"
sincedb_path => "NUL"
ignore_older => 0
}
ignore_older => 0
In filebeat, setting ignore_older to zero turns off age based filtering. For a logstash file input it ignores any files more than zero seconds old, which can result in it ignoring all files. Delete this option.
Also, ever since the conversion of logstash core from ruby to java, a backslash in the path option is treated as an escape, so path => "D:\softwares\logstash\data\sample4.txt" is treated as if it were path => "D:softwareslogstashdatasample4.txt". Use forward slash instead.

Logstash can't write output file

I want to write output file on logstash, but logstash can't write file. file is empty and i can see logs on Kibana Dashboard.
My output.conf file ;
output {
file {
path => "/home/freed/example.txt"
codec => line { format => "custom format: %{message}"}
}
}
I want to help ?
I suspect that you have problems accessing (permission) the file for the logstash.
Check you log: /var/log/logstash/logstash-plain.log
In you example logstash must have accessing to /home/freed and be the owner file example.txt

input file start_position => "beginning" doesn't work even after deleting .sincedb files

Version: ElasticSearch-5.2.1/Logstash-5.2.1/Kibana-5.2.1
OS: Windows 2008
I've just started working on the ELK Stack & am facing some problems loading data
I've got the following .json code
input {
file {
path => "D:\server.log"
start_position => beginning
}
}
filter {
grok {
match => ["message","\[%{TIMESTAMP_ISO8601:timestamp}\] %{GREEDYDATA:log_message}"]
}
}
output {
elasticsearch {
hosts => "localhost:9200"
}
}
I've deleted the .sincedb files
And yet when I extract log info in Kibana, I can see data starting only since I first parsed. I've got data worth 2-3 months in my log file.
What if you have your file input as such, where you're missing out the ignore older which actually will stop you re-reading the old files plus you're missing out the since db path property I believe. You could have a look up on this answer by #Steve Shipway for a better explanation on having these two properties within your file input.
So your input could look something like this:
input {
file {
path => "D:\server.log"
start_position => "beginning" <-- you've missed out the quotes here
ignore_older => 0
sincedb_path => "/dev/null"
}
}
Note that setting sincedb_path to /dev/null will make the files read from the beginning, every time which isn't a good solution at all. But then deleting the .sincedb file should work I reckon. If you really want to pick up lines from where you left off, you really need the .sincedb file to hold into the last position which got updated lastly. You could have a look on this for a detailed illustration.
Hope this helps!
in my case, when you enter systemctl restart logstash, even if you have deleted the sincedb file, logstash before the process closes save a new sincedb file and then closes.
if you want really read file from beginning, you should:
stop the logstash service: sudo systemctl stop logstash
delete sincedb file from /var/lib/logstash/plugins/inputs/file or /usr/share/logstash/data/plugins/input/file directory
start the logstash service: sudo systemctl start logstash

Why is Logstash not excluding it's own log file?

According to the logstash docs, this should work; but logstash keeps causing a recursion by logging it's own stdout log to itself...
What is incorrect about my exclude config?
input {
file {
path => "/var/log/**/*"
exclude => ["**/*.gz", "logstash/*"]
}
}
output {
tcp {
host => "1.2.3.4"
port => 1234
mode => client
codec => json_lines
}
stdout { codec => rubydebug }
}
I see results with the path set to /var/log/logstash/logstash.stdout when it should be ignoring them.
(I've tested this by completely deleting the logs in the /var/log/logstash dir and restarting)
I've tried these in the array for exclusion:
logstash/*
**/logstash/*
/var/log/logstash/* #This is incorrect according to docs
Exclusion patterns for Logstash's file input are, as documented, matched against the bare filename of encountered files, so the three patterns in the question won't ever match anything. To exclude Logstash log files and gzipped files use logstash.* and *.gz as exclusion patterns.

is there any way to put a relative path in the conf files?

Well, I've been the following problem .
I've got my workspace the following way
bin conf example lib LICENSE locales patterns README.md spec vendor
In the conf folder I've got the file logstash-apache.conf with the next input
input {
file {
path => "./../example/logs/logprueba/*_log"
start_position => beginning }
}
}
When I run logstash, I get the message:
File paths must be absolute, relative path specified: ./../example/logs/logprueba/*_log
Is there any way to put a relative path?
The answer is no -- not without modifying the logstash source code... According to the docs:
The path(s) to the file(s) to use as an input. You can use globs here, such as /var/log/*.log Paths must be absolute and cannot be relative.
You can always use the environment variables using bash $(pwd) to yield the current destination, this could not be the master solution for you but at least is not anti-pattern:
export CSV_FILE=$(pwd)\/temporal_datasets\/dataset.csv
then in the logstash config file
input {
file {
path => '${CSV_FILE}'
start_position => "beginning"
sincedb_path => "/dev/null"
ignore_older => 0
}
}
If you want to get linux relative path then go to file location through terminal and type pwd it will give us the relative path of linux system like given below:
vikashsingh#CX-BUN-IT-01885:~/Documents/workspace/pw/application-management-system/logging/user-service$ pwd
/home/vikashsingh/Documents/workspace/application-management-system/logging/user-service
later on get the path and add /{filename_with_extention}
input {
file {
path => "/home/vikashsingh/Documents/workspace/application-management-system/logging/user-service/app.log"
start_position => "beginning"
}
}
It will definitely work because I was getting the same error and followed the same steps. It worked for me. Thanks.

Resources