logstash-input-file 4.1.17 → 4.2.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (37) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +16 -0
  3. data/lib/filewatch/discoverer.rb +9 -8
  4. data/lib/filewatch/observing_base.rb +1 -12
  5. data/lib/filewatch/processor.rb +55 -0
  6. data/lib/filewatch/read_mode/handlers/base.rb +12 -11
  7. data/lib/filewatch/read_mode/handlers/read_file.rb +26 -8
  8. data/lib/filewatch/read_mode/handlers/read_zip_file.rb +8 -6
  9. data/lib/filewatch/read_mode/processor.rb +22 -36
  10. data/lib/filewatch/settings.rb +1 -2
  11. data/lib/filewatch/sincedb_collection.rb +39 -40
  12. data/lib/filewatch/sincedb_record_serializer.rb +5 -11
  13. data/lib/filewatch/stat/generic.rb +8 -13
  14. data/lib/filewatch/stat/windows_path.rb +7 -9
  15. data/lib/filewatch/tail_mode/handlers/base.rb +32 -23
  16. data/lib/filewatch/tail_mode/handlers/delete.rb +2 -4
  17. data/lib/filewatch/tail_mode/handlers/shrink.rb +2 -3
  18. data/lib/filewatch/tail_mode/handlers/unignore.rb +4 -4
  19. data/lib/filewatch/tail_mode/processor.rb +47 -54
  20. data/lib/filewatch/watch.rb +12 -14
  21. data/lib/filewatch/watched_file.rb +25 -14
  22. data/lib/filewatch/watched_files_collection.rb +11 -74
  23. data/lib/jars/filewatch-1.0.1.jar +0 -0
  24. data/lib/logstash/inputs/delete_completed_file_handler.rb +5 -0
  25. data/lib/logstash/inputs/file.rb +28 -13
  26. data/lib/logstash/inputs/file_listener.rb +3 -14
  27. data/logstash-input-file.gemspec +2 -1
  28. data/spec/filewatch/reading_spec.rb +60 -9
  29. data/spec/filewatch/settings_spec.rb +3 -0
  30. data/spec/filewatch/sincedb_record_serializer_spec.rb +6 -2
  31. data/spec/filewatch/spec_helper.rb +12 -14
  32. data/spec/filewatch/tailing_spec.rb +14 -12
  33. data/spec/filewatch/watched_file_spec.rb +30 -0
  34. data/spec/filewatch/watched_files_collection_spec.rb +62 -8
  35. data/spec/helpers/spec_helper.rb +1 -0
  36. data/spec/inputs/file_read_spec.rb +119 -0
  37. metadata +17 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: cdb425f23de3ef4ccd1a1358ce48789001145a9a4620405bac4dc6a75d2b7f69
4
- data.tar.gz: b7c856e75936d99912a8a517b81e23be1603e4032a255e6340b2c4da7faa6639
3
+ metadata.gz: b9475678fd2320f61bf61a3e34884ea6512072934e96f2d16c08a4055ad5f8a9
4
+ data.tar.gz: ca48090438f9ba71d20cbaf24111fa479fabe2279b3704d092aa4df36c2680e9
5
5
  SHA512:
6
- metadata.gz: d0641b7f747964983a6f2e3b8c68a19efc74bb085e6a635cc110cd8d1c43efe330a899a951933f228cf59015785cc00730bd196a84a63dd36241045d36614ebf
7
- data.tar.gz: 834e9ad07ed15beaee47e0cd3d6d6f5e5494e41a6d5a2f4871f79df4d63837ef3c480f033eaac0d092794f4c0a36fe4d3466728d98cf2ad55ac564cd8dec0f4f
6
+ metadata.gz: 97b642eed6db061be8fc620ff66e4b89e5898fd23bad138407509db20294ec013bba3a4dfe10dfc4587bdea2c09f8f99cd468db38d46a5a82028be5c85730801
7
+ data.tar.gz: b1583d047f9c042133584f3a82673b661c1eb59f7586a7c39df807a5ec391785dad2230df8561e339be673ef3f799c65e1282eac369459fccbbc491227882121
@@ -1,3 +1,19 @@
1
+ ## 4.2.3
2
+ - Refactor: improve debug logging (log catched exceptions) [#280](https://github.com/logstash-plugins/logstash-input-file/pull/280)
3
+
4
+ ## 4.2.2
5
+ - Fix: sincedb_clean_after not being respected [#276](https://github.com/logstash-plugins/logstash-input-file/pull/276)
6
+
7
+ ## 4.2.1
8
+ - Fix: skip sincedb eviction if read mode completion deletes file during flush [#273](https://github.com/logstash-plugins/logstash-input-file/pull/273)
9
+
10
+ ## 4.2.0
11
+ - Fix: watched files performance with huge filesets [#268](https://github.com/logstash-plugins/logstash-input-file/pull/268)
12
+ - Updated logging to include full traces in debug (and trace) levels
13
+
14
+ ## 4.1.18
15
+ - Fix: release watched files on completion (in read-mode) [#271](https://github.com/logstash-plugins/logstash-input-file/pull/271)
16
+
1
17
  ## 4.1.17
2
18
  - Added configuration setting `check_archive_validity` settings to enable
3
19
  gzipped files verification, issue
@@ -9,6 +9,8 @@ module FileWatch
9
9
  # associated with a sincedb entry if one can be found
10
10
  include LogStash::Util::Loggable
11
11
 
12
+ attr_reader :watched_files_collection
13
+
12
14
  def initialize(watched_files_collection, sincedb_collection, settings)
13
15
  @watching = Concurrent::Array.new
14
16
  @exclude = Concurrent::Array.new
@@ -37,8 +39,7 @@ module FileWatch
37
39
  @exclude.each do |pattern|
38
40
  if watched_file.pathname.basename.fnmatch?(pattern)
39
41
  if new_discovery
40
- logger.trace("Discoverer can_exclude?: #{watched_file.path}: skipping " +
41
- "because it matches exclude #{pattern}")
42
+ logger.trace("skipping file because it matches exclude", :path => watched_file.path, :pattern => pattern)
42
43
  end
43
44
  watched_file.unwatch
44
45
  return true
@@ -56,13 +57,13 @@ module FileWatch
56
57
  end
57
58
 
58
59
  def discover_any_files(path, ongoing)
59
- fileset = Dir.glob(path).select{|f| File.file?(f)}
60
- logger.trace("discover_files", "count" => fileset.size)
60
+ fileset = Dir.glob(path).select { |f| File.file?(f) }
61
+ logger.trace("discover_files", :count => fileset.size)
61
62
  fileset.each do |file|
62
- pathname = Pathname.new(file)
63
63
  new_discovery = false
64
- watched_file = @watched_files_collection.watched_file_by_path(file)
64
+ watched_file = @watched_files_collection.get(file)
65
65
  if watched_file.nil?
66
+ pathname = Pathname.new(file)
66
67
  begin
67
68
  path_stat = PathStatClass.new(pathname)
68
69
  rescue Errno::ENOENT
@@ -74,7 +75,7 @@ module FileWatch
74
75
  # if it already unwatched or its excluded then we can skip
75
76
  next if watched_file.unwatched? || can_exclude?(watched_file, new_discovery)
76
77
 
77
- logger.trace("discover_files handling:", "new discovery"=> new_discovery, "watched_file details" => watched_file.details)
78
+ logger.trace? && logger.trace("handling:", :new_discovery => new_discovery, :watched_file => watched_file.details)
78
79
 
79
80
  if new_discovery
80
81
  watched_file.initial_completed if ongoing
@@ -86,7 +87,7 @@ module FileWatch
86
87
  # associated with a different watched_file
87
88
  if @sincedb_collection.associate(watched_file)
88
89
  if watched_file.file_ignorable?
89
- logger.trace("Discoverer discover_files: #{file}: skipping because it was last modified more than #{@settings.ignore_older} seconds ago")
90
+ logger.trace("skipping file because it was last modified more than #{@settings.ignore_older} seconds ago", :path => file)
90
91
  # on discovery ignorable watched_files are put into the ignored state and that
91
92
  # updates the size from the internal stat
92
93
  # so the existing contents are not read.
@@ -62,8 +62,7 @@ module FileWatch
62
62
  @sincedb_collection = SincedbCollection.new(@settings)
63
63
  @sincedb_collection.open
64
64
  discoverer = Discoverer.new(watched_files_collection, @sincedb_collection, @settings)
65
- @watch = Watch.new(discoverer, watched_files_collection, @settings)
66
- @watch.add_processor build_specific_processor(@settings)
65
+ @watch = Watch.new(discoverer, build_specific_processor(@settings), @settings)
67
66
  end
68
67
 
69
68
  def watch_this(path)
@@ -84,15 +83,5 @@ module FileWatch
84
83
  # sincedb_write("shutting down")
85
84
  end
86
85
 
87
- # close_file(path) is to be used by external code
88
- # when it knows that it is completely done with a file.
89
- # Other files or folders may still be being watched.
90
- # Caution, once unwatched, a file can't be watched again
91
- # unless a new instance of this class begins watching again.
92
- # The sysadmin should rename, move or delete the file.
93
- def close_file(path)
94
- @watch.unwatch(path)
95
- sincedb_write
96
- end
97
86
  end
98
87
  end
@@ -0,0 +1,55 @@
1
+ # encoding: utf-8
2
+ require "logstash/util/loggable"
3
+ require 'concurrent/atomic/atomic_reference'
4
+
5
+ module FileWatch
6
+ class Processor
7
+ include LogStash::Util::Loggable
8
+
9
+ attr_reader :watch
10
+
11
+ def initialize(settings)
12
+ @settings = settings
13
+ @deletable_paths = Concurrent::AtomicReference.new []
14
+ end
15
+
16
+ def add_watch(watch)
17
+ @watch = watch
18
+ self
19
+ end
20
+
21
+ def clear_deletable_paths
22
+ @deletable_paths.get_and_set []
23
+ end
24
+
25
+ def add_deletable_path(path)
26
+ @deletable_paths.get << path
27
+ end
28
+
29
+ def restat(watched_file)
30
+ changed = watched_file.restat!
31
+ if changed
32
+ # the collection (when sorted by modified_at) needs to re-sort every time watched-file is modified,
33
+ # we can perform these update operation while processing files (stat interval) instead of having to
34
+ # re-sort the whole collection every time an entry is accessed
35
+ @watch.watched_files_collection.update(watched_file)
36
+ end
37
+ end
38
+
39
+ private
40
+
41
+ def error_details(error, watched_file)
42
+ details = { :path => watched_file.path,
43
+ :exception => error.class,
44
+ :message => error.message,
45
+ :backtrace => error.backtrace }
46
+ if logger.debug?
47
+ details[:file] = watched_file
48
+ else
49
+ details[:backtrace] = details[:backtrace].take(8) if details[:backtrace]
50
+ end
51
+ details
52
+ end
53
+
54
+ end
55
+ end
@@ -19,7 +19,7 @@ module FileWatch module ReadMode module Handlers
19
19
  end
20
20
 
21
21
  def handle(watched_file)
22
- logger.trace("handling: #{watched_file.path}")
22
+ logger.trace? && logger.trace("handling:", :path => watched_file.path)
23
23
  unless watched_file.has_listener?
24
24
  watched_file.set_listener(@observer)
25
25
  end
@@ -34,19 +34,21 @@ module FileWatch module ReadMode module Handlers
34
34
 
35
35
  def open_file(watched_file)
36
36
  return true if watched_file.file_open?
37
- logger.trace("opening #{watched_file.path}")
37
+ logger.trace? && logger.trace("opening", :path => watched_file.path)
38
38
  begin
39
39
  watched_file.open
40
- rescue
40
+ rescue => e
41
41
  # don't emit this message too often. if a file that we can't
42
42
  # read is changing a lot, we'll try to open it more often, and spam the logs.
43
43
  now = Time.now.to_i
44
- logger.trace("opening OPEN_WARN_INTERVAL is '#{OPEN_WARN_INTERVAL}'")
44
+ logger.trace? && logger.trace("opening OPEN_WARN_INTERVAL is '#{OPEN_WARN_INTERVAL}'")
45
45
  if watched_file.last_open_warning_at.nil? || now - watched_file.last_open_warning_at > OPEN_WARN_INTERVAL
46
- logger.warn("failed to open #{watched_file.path}: #{$!.inspect}, #{$!.backtrace.take(3)}")
46
+ backtrace = e.backtrace
47
+ backtrace = backtrace.take(3) if backtrace && !logger.debug?
48
+ logger.warn("failed to open", :path => watched_file.path, :exception => e.class, :message => e.message, :backtrace => backtrace)
47
49
  watched_file.last_open_warning_at = now
48
50
  else
49
- logger.trace("suppressed warning for `failed to open` #{watched_file.path}: #{$!.inspect}")
51
+ logger.trace? && logger.trace("suppressed warning (failed to open)", :path => watched_file.path, :exception => e.class, :message => e.message)
50
52
  end
51
53
  watched_file.watch # set it back to watch so we can try it again
52
54
  end
@@ -65,8 +67,7 @@ module FileWatch module ReadMode module Handlers
65
67
  elsif sincedb_value.watched_file == watched_file
66
68
  update_existing_sincedb_collection_value(watched_file, sincedb_value)
67
69
  else
68
- msg = "add_or_update_sincedb_collection: the found sincedb_value has a watched_file - this is a rename, switching inode to this watched file"
69
- logger.trace(msg)
70
+ logger.trace? && logger.trace("add_or_update_sincedb_collection: the found sincedb_value has a watched_file - this is a rename, switching inode to this watched file")
70
71
  existing_watched_file = sincedb_value.watched_file
71
72
  if existing_watched_file.nil?
72
73
  sincedb_value.set_watched_file(watched_file)
@@ -75,7 +76,7 @@ module FileWatch module ReadMode module Handlers
75
76
  watched_file.update_bytes_read(sincedb_value.position)
76
77
  else
77
78
  sincedb_value.set_watched_file(watched_file)
78
- logger.trace("add_or_update_sincedb_collection: switching from...", "watched_file details" => watched_file.details)
79
+ logger.trace? && logger.trace("add_or_update_sincedb_collection: switching from", :watched_file => watched_file.details)
79
80
  watched_file.rotate_from(existing_watched_file)
80
81
  end
81
82
 
@@ -84,7 +85,7 @@ module FileWatch module ReadMode module Handlers
84
85
  end
85
86
 
86
87
  def update_existing_sincedb_collection_value(watched_file, sincedb_value)
87
- logger.trace("update_existing_sincedb_collection_value: #{watched_file.path}, last value #{sincedb_value.position}, cur size #{watched_file.last_stat_size}")
88
+ logger.trace? && logger.trace("update_existing_sincedb_collection_value: #{watched_file.path}, last value #{sincedb_value.position}, cur size #{watched_file.last_stat_size}")
88
89
  # sincedb_value is the source of truth
89
90
  watched_file.update_bytes_read(sincedb_value.position)
90
91
  end
@@ -92,7 +93,7 @@ module FileWatch module ReadMode module Handlers
92
93
  def add_new_value_sincedb_collection(watched_file)
93
94
  sincedb_value = SincedbValue.new(0)
94
95
  sincedb_value.set_watched_file(watched_file)
95
- logger.trace("add_new_value_sincedb_collection: #{watched_file.path}", "position" => sincedb_value.position)
96
+ logger.trace? && logger.trace("add_new_value_sincedb_collection:", :path => watched_file.path, :position => sincedb_value.position)
96
97
  sincedb_collection.set(watched_file.sincedb_key, sincedb_value)
97
98
  end
98
99
  end
@@ -19,16 +19,21 @@ module FileWatch module ReadMode module Handlers
19
19
  watched_file.listener.eof
20
20
  watched_file.file_close
21
21
  key = watched_file.sincedb_key
22
- sincedb_collection.reading_completed(key)
23
- sincedb_collection.clear_watched_file(key)
22
+ if sincedb_collection.get(key)
23
+ sincedb_collection.reading_completed(key)
24
+ sincedb_collection.clear_watched_file(key)
25
+ end
24
26
  watched_file.listener.deleted
27
+ # NOTE: on top of un-watching we should also remove from the watched files collection
28
+ # if the file is getting deleted (on completion), that part currently resides in
29
+ # DeleteCompletedFileHandler - triggered above using `watched_file.listener.deleted`
25
30
  watched_file.unwatch
26
31
  end
27
32
  end
28
33
  end
29
34
 
30
35
  def controlled_read(watched_file, loop_control)
31
- logger.trace("reading...", "iterations" => loop_control.count, "amount" => loop_control.size, "filename" => watched_file.filename)
36
+ logger.trace? && logger.trace("reading...", :filename => watched_file.filename, :iterations => loop_control.count, :amount => loop_control.size)
32
37
  loop_control.count.times do
33
38
  break if quit?
34
39
  begin
@@ -40,22 +45,35 @@ module FileWatch module ReadMode module Handlers
40
45
  delta = line.bytesize + @settings.delimiter_byte_size
41
46
  sincedb_collection.increment(watched_file.sincedb_key, delta)
42
47
  end
43
- rescue EOFError
44
- logger.error("controlled_read: eof error reading file", "path" => watched_file.path, "error" => e.inspect, "backtrace" => e.backtrace.take(8))
48
+ rescue EOFError => e
49
+ log_error("controlled_read: eof error reading file", watched_file, e)
45
50
  loop_control.flag_read_error
46
51
  break
47
- rescue Errno::EWOULDBLOCK, Errno::EINTR
48
- logger.error("controlled_read: block or interrupt error reading file", "path" => watched_file.path, "error" => e.inspect, "backtrace" => e.backtrace.take(8))
52
+ rescue Errno::EWOULDBLOCK, Errno::EINTR => e
53
+ log_error("controlled_read: block or interrupt error reading file", watched_file, e)
49
54
  watched_file.listener.error
50
55
  loop_control.flag_read_error
51
56
  break
52
57
  rescue => e
53
- logger.error("controlled_read: general error reading file", "path" => watched_file.path, "error" => e.inspect, "backtrace" => e.backtrace.take(8))
58
+ log_error("controlled_read: general error reading file", watched_file, e)
54
59
  watched_file.listener.error
55
60
  loop_control.flag_read_error
56
61
  break
57
62
  end
58
63
  end
59
64
  end
65
+
66
+ def log_error(msg, watched_file, error)
67
+ details = { :path => watched_file.path,
68
+ :exception => error.class,
69
+ :message => error.message,
70
+ :backtrace => error.backtrace }
71
+ if logger.debug?
72
+ details[:file] = watched_file
73
+ else
74
+ details[:backtrace] = details[:backtrace].take(8) if details[:backtrace]
75
+ end
76
+ logger.error(msg, details)
77
+ end
60
78
  end
61
79
  end end end
@@ -1,13 +1,15 @@
1
1
  # encoding: utf-8
2
2
  require 'java'
3
- java_import java.io.InputStream
4
- java_import java.io.InputStreamReader
5
- java_import java.io.FileInputStream
6
- java_import java.io.BufferedReader
7
- java_import java.util.zip.GZIPInputStream
8
- java_import java.util.zip.ZipException
9
3
 
10
4
  module FileWatch module ReadMode module Handlers
5
+
6
+ java_import java.io.InputStream
7
+ java_import java.io.InputStreamReader
8
+ java_import java.io.FileInputStream
9
+ java_import java.io.BufferedReader
10
+ java_import java.util.zip.GZIPInputStream
11
+ java_import java.util.zip.ZipException
12
+
11
13
  class ReadZipFile < Base
12
14
  def handle_specifically(watched_file)
13
15
  add_or_update_sincedb_collection(watched_file) unless sincedb_collection.member?(watched_file.sincedb_key)
@@ -1,6 +1,5 @@
1
1
  # encoding: utf-8
2
- require "logstash/util/loggable"
3
-
2
+ require 'filewatch/processor'
4
3
  require_relative "handlers/base"
5
4
  require_relative "handlers/read_file"
6
5
  require_relative "handlers/read_zip_file"
@@ -9,20 +8,7 @@ module FileWatch module ReadMode
9
8
  # Must handle
10
9
  # :read_file
11
10
  # :read_zip_file
12
- class Processor
13
- include LogStash::Util::Loggable
14
-
15
- attr_reader :watch, :deletable_filepaths
16
-
17
- def initialize(settings)
18
- @settings = settings
19
- @deletable_filepaths = []
20
- end
21
-
22
- def add_watch(watch)
23
- @watch = watch
24
- self
25
- end
11
+ class Processor < FileWatch::Processor
26
12
 
27
13
  def initialize_handlers(sincedb_collection, observer)
28
14
  # we deviate from the tail mode handler initialization here
@@ -48,24 +34,23 @@ module FileWatch module ReadMode
48
34
  private
49
35
 
50
36
  def process_watched(watched_files)
51
- logger.trace("Watched processing")
37
+ logger.trace(__method__.to_s)
52
38
  # Handles watched_files in the watched state.
53
39
  # for a slice of them:
54
40
  # move to the active state
55
41
  # should never have been active before
56
42
  # how much of the max active window is available
57
- to_take = @settings.max_active - watched_files.count{|wf| wf.active?}
43
+ to_take = @settings.max_active - watched_files.count { |wf| wf.active? }
58
44
  if to_take > 0
59
- watched_files.select {|wf| wf.watched?}.take(to_take).each do |watched_file|
60
- path = watched_file.path
45
+ watched_files.select(&:watched?).take(to_take).each do |watched_file|
61
46
  begin
62
- watched_file.restat
47
+ restat(watched_file)
63
48
  watched_file.activate
64
49
  rescue Errno::ENOENT
65
- common_deleted_reaction(watched_file, "Watched")
50
+ common_deleted_reaction(watched_file, __method__)
66
51
  next
67
52
  rescue => e
68
- common_error_reaction(path, e, "Watched")
53
+ common_error_reaction(watched_file, e, __method__)
69
54
  next
70
55
  end
71
56
  break if watch.quit?
@@ -74,7 +59,7 @@ module FileWatch module ReadMode
74
59
  now = Time.now.to_i
75
60
  if (now - watch.lastwarn_max_files) > MAX_FILES_WARN_INTERVAL
76
61
  waiting = watched_files.size - @settings.max_active
77
- logger.warn(@settings.max_warn_msg + ", files yet to open: #{waiting}")
62
+ logger.warn("#{@settings.max_warn_msg}, files yet to open: #{waiting}")
78
63
  watch.lastwarn_max_files = now
79
64
  end
80
65
  end
@@ -83,17 +68,18 @@ module FileWatch module ReadMode
83
68
  ## TODO add process_rotation_in_progress
84
69
 
85
70
  def process_active(watched_files)
86
- logger.trace("Active processing")
71
+ logger.trace(__method__.to_s)
87
72
  # Handles watched_files in the active state.
88
- watched_files.select {|wf| wf.active? }.each do |watched_file|
89
- path = watched_file.path
73
+ watched_files.each do |watched_file|
74
+ next unless watched_file.active?
75
+
90
76
  begin
91
- watched_file.restat
77
+ restat(watched_file)
92
78
  rescue Errno::ENOENT
93
- common_deleted_reaction(watched_file, "Active")
79
+ common_deleted_reaction(watched_file, __method__)
94
80
  next
95
81
  rescue => e
96
- common_error_reaction(path, e, "Active")
82
+ common_error_reaction(watched_file, e, __method__)
97
83
  next
98
84
  end
99
85
  break if watch.quit?
@@ -114,19 +100,19 @@ module FileWatch module ReadMode
114
100
  def common_detach_when_allread(watched_file)
115
101
  watched_file.unwatch
116
102
  watched_file.listener.reading_completed
117
- deletable_filepaths << watched_file.path
118
- logger.trace("Whole file read: #{watched_file.path}, removing from collection")
103
+ add_deletable_path watched_file.path
104
+ logger.trace? && logger.trace("whole file read, removing from collection", :path => watched_file.path)
119
105
  end
120
106
 
121
107
  def common_deleted_reaction(watched_file, action)
122
108
  # file has gone away or we can't read it anymore.
123
109
  watched_file.unwatch
124
- deletable_filepaths << watched_file.path
125
- logger.trace("#{action} - stat failed: #{watched_file.path}, removing from collection")
110
+ add_deletable_path watched_file.path
111
+ logger.trace? && logger.trace("#{action} - stat failed, removing from collection", :path => watched_file.path)
126
112
  end
127
113
 
128
- def common_error_reaction(path, error, action)
129
- logger.error("#{action} - other error #{path}: (#{error.message}, #{error.backtrace.take(8).inspect})")
114
+ def common_error_reaction(watched_file, error, action)
115
+ logger.error("#{action} - other error", error_details(error, watched_file))
130
116
  end
131
117
  end
132
118
  end end
@@ -6,7 +6,7 @@ module FileWatch
6
6
  attr_reader :max_active, :max_warn_msg, :lastwarn_max_files
7
7
  attr_reader :sincedb_write_interval, :stat_interval, :discover_interval
8
8
  attr_reader :exclude, :start_new_files_at, :file_chunk_count, :file_chunk_size
9
- attr_reader :sincedb_path, :sincedb_write_interval, :sincedb_expiry_duration
9
+ attr_reader :sincedb_path, :sincedb_expiry_duration
10
10
  attr_reader :file_sort_by, :file_sort_direction
11
11
  attr_reader :exit_after_read
12
12
  attr_reader :check_archive_validity
@@ -41,7 +41,6 @@ module FileWatch
41
41
  @file_chunk_size = @opts[:file_chunk_size]
42
42
  @close_older = @opts[:close_older]
43
43
  @ignore_older = @opts[:ignore_older]
44
- @sincedb_write_interval = @opts[:sincedb_write_interval]
45
44
  @stat_interval = @opts[:stat_interval]
46
45
  @discover_interval = @opts[:discover_interval]
47
46
  @exclude = Array(@opts[:exclude])