欢迎光临
一个废柴的博客

配置sincedb_path让logstash每次都从头读取文件

刚开始学习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 内容,都只会读到空白内容,也就会理解成之前没有过运行记录,自然就从初始位置开始读取了!

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址