刚开始学习ELK的时候,通常我们会让logstash去读取一个文件,然后再让logstash将读取到的内容输出的控制台,这个过程的logstash配置文件大致如下:
input {
file {
path => ["/home/ubuntu/Desktop/test.log"]
}
}
output {
stdout {
codec => rubydebug
}
}
可能接下来你进阶的第二步,就是在上面的配置文件中增加一个filter插件,对日志文件进行解析操作,增加filer之后的logstash具体配置大致如下:
input {
file {
path => ["/home/ubuntu/Desktop/test.log"]
}
}
filter {
multiline{
pattern => "^["
negate => true
what => "previous"
}
}
output {
stdout {
codec => rubydebug
}
}
好了,配置完了之后,你可能会想要看看filer插件多行合并的效果,你重新启动logstash,然后静静的等待着控制台的输出,然后你等待啊,等待,貌似并没有你期待的输出。那么问题来了,控制台为什么什么都没有输出呢?
这是因为:在你第一次配置时,运行logstash对日志文件进行的读取操作,然后输出到了控制台,这个过程logstash会记录自己读取完日志文件的位置,然后将自己读取内容的偏移量保存到一个隐藏文件中(默认位置是~/.sincedb_****文件);当我们配置了filer之后,启动logstash后,logstash从隐藏文件中的读取完成的日志文件位置知道,日志文件并没有发生改变。所以,logstash并没有对日志文件再次进行读取,所以控制台没有任何输出。
这种情况的一个解决办法是:删除~/.sincedb_****文件,这样lostash就不知道自己读取完成的日志文件位置了,logstash就会重新读取文件了。
但实际上,我们在测试时,我们都是希望不管我们有没有改动logstash都从头读取文件。如果每次都删除隐藏文件着实有点麻烦。
这里还有另外一个更加方面的方法,我们可以进行如下配置:
input {
file {
path => ["/home/ubuntu/Desktop/test.log"]
start_position => "beginning"
sincedb_path => "/dev/null"
}
}
filter {
multiline{
pattern => "^["
negate => true
what => "previous"
}
}
output {
stdout {
codec => rubydebug
}
}
通过配置文件可知,我们增加了一个参数sincedb_path,其值为“/dev/null”,这个参数的是用来配置记录logstash读取日志文件位置的文件的名称的,我们将文件的名称指定为“/dev/null”这个 Linux 系统上特殊的空洞文件,那么 logstash 每次重启进程的时候,尝试读取 sincedb 内容,都只会读到空白内容,也就会理解成之前没有过运行记录,自然就从初始位置开始读取了!
谢谢了
不客气