Logstash从头开始读取文件?

时间:2014-10-31 11:35:42

标签: elasticsearch logstash

我遇到Logstash文件输入问题。

最初配置:

input {
     file{
                path => "/home/Desktop/Logstash-Input/**/*_log"
                start_position => "beginning"
                sincedb_path => "/dev/null"
        }
}

我执行此操作(sincedb_path => "/dev/null"),以便logstash忘记以前的文件偏移量。因此logstash会读取所有日志文件。

现在我重新启动了logstash并删除了sincedb_path => "/dev/null",所以现在logstash启动时没有读取新文件(根据我的logstash控制台)。

现在,当我将一个日志行追加到一个文件时,它应该只读取最后一行,但是它开始从中间的某个地方读取文件。

Logstash控制台:

/home/Desktop/Logstash-Input/Server2/CronLog/2014.05.30/cron_log: **old inode** was [**2754731**, 0, 2054], new is [**2754740**, 0, 2054] {:level=>:debug, :file=>"filewatch/watch.rb", :line=>"73"}

:delete for /home/Desktop/Logstash-Input/Server2/CronLog/2014.05.30/cron_log, deleted from @files {:level=>:debug, :file=>"filewatch/tail.rb", :line=>"85"}

**writing sincedb** (delta since last write = 190) {:level=>:debug, :file=>"filewatch/tail.rb", :line=>"177"}
_open_file: /home/Desktop/Logstash-Input/Server2/CronLog/2014.05.30/cron_log: opening {:level=>:debug, :file=>"filewatch/tail.rb", :line=>"98"}

/home/Desktop/Logstash-Input/Server2/CronLog/2014.05.30/cron_log: sincedb last value **741**, cur size 2488 {:level=>:debug, :file=>"filewatch/tail.rb", :line=>"122"}

/home/Desktop/Logstash-Input/Server2/CronLog/2014.05.30/cron_log: sincedb: seeking to 741 {:level=>:debug, :file=>"filewatch/tail.rb", :line=>"124"}

Received line {:path=>"/home/Desktop/Logstash-Input/Server2/CronLog/2014.05.30/cron_log", :text=>"5-26T00:00:01+05:30 bx920as1 crond[26393]: (user6) CMD (sh 2014/05/30/server2/cron/log)", :level=>:debug, :file=>"logstash/inputs/file.rb", :line=>"134"}

filter received {:event=>{"message"=>"5-26T00:00:01+05:30 bx920as1 crond[26393]: (user6) CMD (sh 2014/05/30/server2/cron/log)", "@version"=>"1", "@timestamp"=>"2014-10-31T07:00:44.404Z", "host"=>"cdot-HP-Pro-3330-MT", "path"=>"/home/Desktop/Logstash-Input/Server2/CronLog/2014.05.30/cron_log"}, :level=>:debug, :file=>"(eval)", :line=>"33"}

添加sincedb_path => "/dev/null"之前我的sincedb文件内容是:

2754732 0 2054 1178
2755530 0 2054 249
2754730 0 2054 495
2755274 0 2054 548
2624449 0 2054 1140
2755536 0 2054 248
**2754731 0 2054 2396**
2754735 0 2054 1358
2755539 0 2054 239
2755542 0 2054 316
2755540 0 2054 316
2887689 0 2054 3482
2754736 0 2054 584
2754737 0 2054 675
2754738 0 2054 438
2754739 0 2054 546
2754734 0 2054 1269
2754740 0 2054 577
**2754741 0 2054 2304**
2754733 0 2054 659
删除sincedb_path => "/dev/null"

和sincedb文件:

2754732 0 2054 1178
2755530 0 2054 249
2754730 0 2054 905
2755274 0 2054 548
2624449 0 2054 1140
2755536 0 2054 248
2754731 0 2054 2396
2754735 0 2054 1358
2755539 0 2054 239
2755542 0 2054 316
2755540 0 2054 316
2887689 0 2054 3482
2754736 0 2054 584
2754737 0 2054 675
2754738 0 2054 438
2754739 0 2054 546
2754734 0 2054 1269
**2754740 0 2054 741
2754741 0 2054 2304**
2754733 0 2054 823

为什么logstash从中间读取文件? Plz帮助。

1 个答案:

答案 0 :(得分:0)

the doc中所述,start_position仅用于新文件。 Logstash通过检查inode的sincdb文件来确定文件是否是新文件。

从您的日志文件片段中,logstash看到cron_log是inode 2754740.现在,请注意此节点存在于第一个(重启前)sincedb文件中:

  

2754740 0 2054 577

当您使用真实(或默认)sincedb位置重新启动logstash时,它将在文件中找到inode并从字节偏移量577开始。

如果您刚刚退出测试,请确保您的inode未列在sincedb文件中。在我的环境中,我会在需要时删除sincedb文件,尽管这可能在您的环境中无效。