fluentd 0.12.0.pre.1 → 0.12.0.pre.2

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of fluentd might be problematic. Click here for more details.

Files changed (81) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -1
  3. data/.travis.yml +1 -0
  4. data/ChangeLog +21 -0
  5. data/README.md +10 -2
  6. data/Rakefile +4 -13
  7. data/example/v1_literal_example.conf +36 -0
  8. data/fluentd.gemspec +4 -1
  9. data/lib/fluent/buffer.rb +73 -46
  10. data/lib/fluent/command/fluentd.rb +7 -2
  11. data/lib/fluent/config/basic_parser.rb +5 -0
  12. data/lib/fluent/config/element.rb +2 -5
  13. data/lib/fluent/config/literal_parser.rb +26 -7
  14. data/lib/fluent/config/section.rb +2 -0
  15. data/lib/fluent/config/v1_parser.rb +9 -2
  16. data/lib/fluent/formatter.rb +2 -1
  17. data/lib/fluent/mixin.rb +22 -7
  18. data/lib/fluent/output.rb +17 -8
  19. data/lib/fluent/parser.rb +14 -3
  20. data/lib/fluent/plugin/buf_file.rb +30 -15
  21. data/lib/fluent/plugin/filter_grep.rb +69 -0
  22. data/lib/fluent/plugin/filter_record_transformer.rb +183 -0
  23. data/lib/fluent/plugin/in_exec.rb +6 -0
  24. data/lib/fluent/plugin/in_forward.rb +34 -4
  25. data/lib/fluent/plugin/in_http.rb +1 -1
  26. data/lib/fluent/plugin/out_exec.rb +1 -1
  27. data/lib/fluent/plugin/out_exec_filter.rb +8 -1
  28. data/lib/fluent/plugin/out_forward.rb +82 -4
  29. data/lib/fluent/supervisor.rb +1 -1
  30. data/lib/fluent/timezone.rb +131 -0
  31. data/lib/fluent/version.rb +1 -1
  32. data/test/config/assertions.rb +42 -0
  33. data/test/config/test_config_parser.rb +385 -0
  34. data/test/config/test_configurable.rb +530 -0
  35. data/test/config/test_configure_proxy.rb +99 -0
  36. data/test/config/test_dsl.rb +237 -0
  37. data/test/config/test_literal_parser.rb +293 -0
  38. data/test/config/test_section.rb +112 -0
  39. data/test/config/test_system_config.rb +49 -0
  40. data/test/helper.rb +25 -0
  41. data/test/plugin/test_buf_file.rb +604 -0
  42. data/test/plugin/test_buf_memory.rb +204 -0
  43. data/test/plugin/test_filter_grep.rb +124 -0
  44. data/test/plugin/test_filter_record_transformer.rb +251 -0
  45. data/test/plugin/test_in_exec.rb +1 -0
  46. data/test/plugin/test_in_forward.rb +205 -2
  47. data/test/plugin/test_in_gc_stat.rb +1 -0
  48. data/test/plugin/test_in_http.rb +58 -2
  49. data/test/plugin/test_in_object_space.rb +1 -0
  50. data/test/plugin/test_in_status.rb +1 -0
  51. data/test/plugin/test_in_stream.rb +1 -1
  52. data/test/plugin/test_in_syslog.rb +1 -1
  53. data/test/plugin/test_in_tail.rb +1 -0
  54. data/test/plugin/test_in_tcp.rb +1 -1
  55. data/test/plugin/test_in_udp.rb +1 -1
  56. data/test/plugin/test_out_copy.rb +1 -0
  57. data/test/plugin/test_out_exec.rb +1 -0
  58. data/test/plugin/test_out_exec_filter.rb +1 -0
  59. data/test/plugin/test_out_file.rb +36 -0
  60. data/test/plugin/test_out_forward.rb +279 -8
  61. data/test/plugin/test_out_roundrobin.rb +1 -0
  62. data/test/plugin/test_out_stdout.rb +1 -0
  63. data/test/plugin/test_out_stream.rb +1 -1
  64. data/test/test_buffer.rb +530 -0
  65. data/test/test_config.rb +1 -1
  66. data/test/test_configdsl.rb +1 -1
  67. data/test/test_formatter.rb +223 -0
  68. data/test/test_match.rb +1 -2
  69. data/test/test_mixin.rb +74 -2
  70. data/test/test_parser.rb +7 -1
  71. metadata +88 -35
  72. data/lib/fluent/plugin/buf_zfile.rb +0 -75
  73. data/spec/config/config_parser_spec.rb +0 -314
  74. data/spec/config/configurable_spec.rb +0 -524
  75. data/spec/config/configure_proxy_spec.rb +0 -96
  76. data/spec/config/dsl_spec.rb +0 -239
  77. data/spec/config/helper.rb +0 -49
  78. data/spec/config/literal_parser_spec.rb +0 -222
  79. data/spec/config/section_spec.rb +0 -97
  80. data/spec/config/system_config_spec.rb +0 -49
  81. data/spec/spec_helper.rb +0 -60
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 38b8348d98cec8b31c27e634bd22a9afee293ad0
4
- data.tar.gz: 983f2d287d63a26637c95266ce4cd1a85dcd1757
3
+ metadata.gz: 5728345e3e45be5f8327ea9cfe0268b958c78d92
4
+ data.tar.gz: 453abbcdf2c21a2ff97fb6da4b9e4468c0519de1
5
5
  SHA512:
6
- metadata.gz: 0b62fb35a7a546cfa741564854091983fdf1d05ff7a85c44cae4dab1889b9f5eb3c5940b32e5739e05bd43a8c7fdbce05723d76a42959fb04cd7b9a6090aee6b
7
- data.tar.gz: 8538fff4fcff3ca9fd72ac88681490a7d9e263d53ea51d410b82e486cf6896df7857d158fb6f5dceb55f5ef78072d2bfc3b3bf30faf3dbd00be1b7603452c761
6
+ metadata.gz: 0c2878ba5c1d0d45e12d75eea0ed5700ec513b2dde96ecbf8efce4d6e2a0d81eeb9b4a20b7d43b3a053c9c84c24caf3a794fdc1af750b37d7d8e4e3feaf4bdcd
7
+ data.tar.gz: 68f2edd339b18575244d1643df2144f71b4dc2d48dac9355071fbc4a0ceb141bddcdee67189d84d1bf451b8445b83fe50bc545ecc6c866593012702c57b1bb24
data/.gitignore CHANGED
@@ -17,5 +17,5 @@ fluent-gem
17
17
  fluentd
18
18
  pkg/*
19
19
  test/tmp/*
20
- spec/config/tmp/*
20
+ test/config/tmp/*
21
21
  make_dist.sh
data/.travis.yml CHANGED
@@ -14,6 +14,7 @@ os:
14
14
  branches:
15
15
  only:
16
16
  - master
17
+ - v0.10
17
18
 
18
19
  gemfile:
19
20
  - Gemfile
data/ChangeLog CHANGED
@@ -1,3 +1,24 @@
1
+ Release 0.10.55 - 2014/10/16
2
+
3
+ * config: Change v1's non-quoted string literal behaviour to v0's behaviour
4
+ https://github.com/fluent/fluentd/pull/436
5
+ * config: Relax '@' handling in the plugin configuration for backward compatibility
6
+ https://github.com/fluent/fluentd/pull/455
7
+ * config: Add --use-v0-config for keeping old configuration
8
+ https://github.com/fluent/fluentd/pull/434
9
+ * config: Add single quoted literal in v1 configuration
10
+ https://github.com/fluent/fluentd/pull/437
11
+ * config: Improve error message of Array / Hash parse error
12
+ https://github.com/fluent/fluentd/pull/457
13
+ * input: Reduce shutdown time in some network related plugins when use Cool.io 1.2
14
+ https://github.com/fluent/fluentd/pull/440
15
+ * parser: Use ParserError instead of general exception classes
16
+ https://github.com/fluent/fluentd/pull/453
17
+ * Remove unused zfile buffer plugin
18
+ https://github.com/fluent/fluentd/pull/445
19
+
20
+ Release 0.10.54 - skipped
21
+
1
22
  Release 0.10.53 - 2014/08/21
2
23
 
3
24
  * in_tail: Fix forget to detach Closer timer object
data/README.md CHANGED
@@ -1,9 +1,8 @@
1
- Fluentd: Open-Source Data Collector
1
+ Fluentd: Open-Source Log Collector
2
2
  ===================================
3
3
 
4
4
  [<img src="https://travis-ci.org/fluent/fluentd.svg" />](https://travis-ci.org/fluent/fluentd) [![Code Climate](https://codeclimate.com/github/fluent/fluentd/badges/gpa.svg)](https://codeclimate.com/github/fluent/fluentd)
5
5
 
6
-
7
6
  [Fluentd](http://fluentd.org/) collects events from various data sources and writes them to files, RDBMS, NoSQL, IaaS, SaaS, Hadoop and so on. Fluentd helps you unify your logging infrastructure (Learn more about the [Unified Logging Layer](http://www.fluentd.org/blog/unified-logging-layer)).
8
7
 
9
8
  <p align="center">
@@ -12,6 +11,13 @@ Fluentd: Open-Source Data Collector
12
11
 
13
12
  An event consists of *tag*, *time* and *record*. Tag is a string separated with '.' (e.g. myapp.access). It is used to categorize events. Time is a UNIX time recorded at occurrence of an event. Record is a JSON object.
14
13
 
14
+ ## Example Use Cases
15
+
16
+ Use Case | Description | Diagram
17
+ -------- | ------------|:---------:
18
+ Centralizing Apache/Nginx Server Logs | Fluentd can be used to tail access/error logs and transport them reliably to remote systems. | <img src="https://www.fluentd.org/assets/img/recipes/elasticsearch-s3-fluentd.png" height="150"/>
19
+ Syslog Alerting | Fluentd can "grep" for events and send out alerts. | <img src="https://www.fluentd.org/images/syslog-fluentd-alert.png" height="100"/>
20
+ Mobile/Web Application Logging | Fluentd can function as middleware to enable asynchronous, scalable logging for user action events. | <img src="https://www.fluentd.org/assets/img/datasources/asynchronous_logging.png" height="150"/>
15
21
 
16
22
  ## Quick Start
17
23
 
@@ -24,6 +30,8 @@ An event consists of *tag*, *time* and *record*. Tag is a string separated with
24
30
 
25
31
  [Fluentd UI](https://github.com/fluent/fluentd-ui) is a graphical user interface to start/stop/configure Fluentd.
26
32
 
33
+ <p align="center"><img width="500" src="http://www.fluentd.org/images/blog/fluentd-ui.gif"/></p>
34
+
27
35
  ## More Information
28
36
 
29
37
  - Website: http://fluentd.org/
data/Rakefile CHANGED
@@ -4,10 +4,8 @@ require "bundler/gem_tasks"
4
4
  require 'fileutils'
5
5
  require 'rake/testtask'
6
6
  require 'rake/clean'
7
- require 'rspec/core'
8
- require 'rspec/core/rake_task'
9
7
 
10
- task :test => [:base_test, :spec]
8
+ task :test => [:base_test]
11
9
 
12
10
  desc 'Run test_unit based test'
13
11
  Rake::TestTask.new(:base_test) do |t|
@@ -15,7 +13,7 @@ Rake::TestTask.new(:base_test) do |t|
15
13
  # $ bundle exec rake base_test TEST=test/test_specified_path.rb
16
14
  # $ bundle exec rake base_test TEST=test/test_*.rb
17
15
  t.libs << "test"
18
- t.test_files = (Dir["test/test_*.rb"] + Dir["test/plugin/test_*.rb"] - ["helper.rb"]).sort
16
+ t.test_files = Dir["test/**/test_*.rb"].sort
19
17
  t.verbose = true
20
18
  #t.warning = true
21
19
  end
@@ -26,17 +24,10 @@ task :parallel_test do
26
24
  FileUtils.rm_rf('./test/tmp')
27
25
  end
28
26
 
29
- desc 'Run rspec based test'
30
- RSpec::Core::RakeTask.new(:spec) do |t|
31
- t.rspec_opts = %w[-c -f progress -r ./spec/spec_helper.rb]
32
- t.pattern = 'spec/**/*_spec.rb'
33
- t.verbose = true
34
- end
35
-
36
- desc 'Run rspec with simplecov'
27
+ desc 'Run test with simplecov'
37
28
  task :coverage do |t|
38
29
  ENV['SIMPLE_COV'] = '1'
39
- Rake::Task["spec"].invoke
30
+ Rake::Task["test"].invoke
40
31
  end
41
32
 
42
33
  task :default => [:test, :build]
@@ -0,0 +1,36 @@
1
+ <section1>
2
+ key1 'text' # text
3
+ key2 '\'' # ' (1 char)
4
+ key3 '\\' # \ (1 char)
5
+ key4 '\t' # \t (2 char)
6
+ key5 '\[' # \[ (2 char)
7
+ key6 '\\[' # \[ (2 char)
8
+ key7 '#t' # #t (2 char)
9
+ key8 '\#{test}' # \#{test} (8 char)
10
+ key9 '#{test}' # #{test} (7 char)
11
+ key10 '\[(?<time>[^\]]*)\] (?<message>.*)' # \[(?<time>[^\]]*\] (?<message>.*)
12
+ </section1>
13
+ <section2>
14
+ key1 "text" # text
15
+ key2 "\"" # " (1 char)
16
+ key3 "\\" # \ (1 char)
17
+ key4 "\t" # TAB (1 char)
18
+ key5 "\[" # [ (1 char)
19
+ key6 "\\[" # \[ (2 char)
20
+ key7 "#t" # #t (2 char)
21
+ key8 "\#{test}" # #{test} (7 char)
22
+ key9 "#{test}" # replaced by eval('test')
23
+ key10 "\\[(?<time>[^\\]]*)\\] (?<message>.*)" # \[(?<time>[^\]]*\] (?<message>.*)
24
+ </section2>
25
+ <section3>
26
+ key1 text # text
27
+ key2 \ # \ (1 char)
28
+ key3 \\ # \\ (2 char)
29
+ key4 \t # \t (2 char)
30
+ key5 \[ # \[ (2 char)
31
+ key6 \\[ # \\[ (3 char)
32
+ key7 #t # #t (2 char)
33
+ key8 \#{test} # \#{test} (8 char)
34
+ key9 #{test} # #{test} (7 char)
35
+ key10 \[(?<time>[^\]]*)\] (?<message>.*) # \[(?<time>[^\]]*\] (?<message>.*)
36
+ </section3>
data/fluentd.gemspec CHANGED
@@ -24,12 +24,15 @@ Gem::Specification.new do |gem|
24
24
  gem.add_runtime_dependency("cool.io", [">= 1.2.2", "< 2.0.0"])
25
25
  gem.add_runtime_dependency("http_parser.rb", [">= 0.5.1", "< 0.7.0"])
26
26
  gem.add_runtime_dependency("sigdump", ["~> 0.2.2"])
27
+ gem.add_runtime_dependency("tzinfo", [">= 1.0.0"])
28
+ gem.add_runtime_dependency("tzinfo-data", [">= 1.0.0"])
29
+ gem.add_runtime_dependency("string-scrub", [">= 0.0.3"])
27
30
 
28
31
  gem.add_development_dependency("rake", [">= 0.9.2"])
29
32
  gem.add_development_dependency("flexmock")
30
33
  gem.add_development_dependency("parallel_tests", [">= 0.15.3"])
31
- gem.add_development_dependency("rspec", ["~> 3.0.0"])
32
34
  gem.add_development_dependency("simplecov", ["~> 0.6.4"])
33
35
  gem.add_development_dependency("rr", [">= 1.0.0"])
34
36
  gem.add_development_dependency("timecop", [">= 0.3.0"])
37
+ gem.add_development_dependency("test-unit", ["~> 3.0.2"])
35
38
  end
data/lib/fluent/buffer.rb CHANGED
@@ -44,20 +44,25 @@ module Fluent
44
44
  def before_shutdown(out)
45
45
  end
46
46
 
47
- #def emit(key, data, chain)
48
- #end
47
+ def emit(key, data, chain)
48
+ raise NotImplementedError, "Implement this method in child class"
49
+ end
49
50
 
50
- #def keys
51
- #end
51
+ def keys
52
+ raise NotImplementedError, "Implement this method in child class"
53
+ end
52
54
 
53
- #def push(key)
54
- #end
55
+ def push(key)
56
+ raise NotImplementedError, "Implement this method in child class"
57
+ end
55
58
 
56
- #def pop(out)
57
- #end
59
+ def pop(out)
60
+ raise NotImplementedError, "Implement this method in child class"
61
+ end
58
62
 
59
- #def clear!
60
- #end
63
+ def clear!
64
+ raise NotImplementedError, "Implement this method in child class"
65
+ end
61
66
  end
62
67
 
63
68
 
@@ -71,27 +76,33 @@ module Fluent
71
76
 
72
77
  attr_reader :key
73
78
 
74
- #def <<(data)
75
- #end
79
+ def <<(data)
80
+ raise NotImplementedError, "Implement this method in child class"
81
+ end
76
82
 
77
- #def size
78
- #end
83
+ def size
84
+ raise NotImplementedError, "Implement this method in child class"
85
+ end
79
86
 
80
87
  def empty?
81
88
  size == 0
82
89
  end
83
90
 
84
- #def close
85
- #end
91
+ def close
92
+ raise NotImplementedError, "Implement this method in child class"
93
+ end
86
94
 
87
- #def purge
88
- #end
95
+ def purge
96
+ raise NotImplementedError, "Implement this method in child class"
97
+ end
89
98
 
90
- #def read
91
- #end
99
+ def read
100
+ raise NotImplementedError, "Implement this method in child class"
101
+ end
92
102
 
93
- #def open
94
- #end
103
+ def open
104
+ raise NotImplementedError, "Implement this method in child class"
105
+ end
95
106
 
96
107
  def write_to(io)
97
108
  open {|i|
@@ -116,6 +127,8 @@ module Fluent
116
127
 
117
128
  def initialize
118
129
  super
130
+ @map = nil # chunks to store data
131
+ @queue = nil # chunks to be flushed
119
132
  @parallel_pop = true
120
133
  end
121
134
 
@@ -164,18 +177,14 @@ module Fluent
164
177
  key = key.to_s
165
178
 
166
179
  synchronize do
167
- top = (@map[key] ||= new_chunk(key)) # TODO generate unique chunk id
180
+ # chunk unique id is generated in #new_chunk
181
+ chunk = (@map[key] ||= new_chunk(key))
168
182
 
169
- if storable?(top, data)
183
+ if storable?(chunk, data)
170
184
  chain.next
171
- top << data
185
+ chunk << data
172
186
  return false
173
187
 
174
- ## FIXME
175
- #elsif data.bytesize > @buffer_chunk_limit
176
- # # TODO
177
- # raise BufferChunkLimitError, "received data too large"
178
-
179
188
  elsif @queue.size >= @buffer_queue_limit
180
189
  raise BufferQueueLimitError, "queue size exceeds limit"
181
190
  end
@@ -185,9 +194,12 @@ module Fluent
185
194
  $log.warn "This may occur problems in the output plugins ``at this server.``"
186
195
  $log.warn "To avoid problems, set a smaller number to the buffer_chunk_limit"
187
196
  $log.warn "in the forward output ``at the log forwarding server.``"
197
+ ### TODO
198
+ # raise BufferChunkLimitError, "received data too large"
188
199
  end
189
200
 
190
- nc = new_chunk(key) # TODO generate unique chunk id
201
+ # chunk unique id is generated in #new_chunk
202
+ nc = new_chunk(key)
191
203
  ok = false
192
204
 
193
205
  begin
@@ -196,13 +208,17 @@ module Fluent
196
208
 
197
209
  flush_trigger = false
198
210
  @queue.synchronize {
199
- enqueue(top)
211
+ enqueue(chunk) # this is buffer enqueue *hook*
200
212
  flush_trigger = @queue.empty?
201
- @queue << top
213
+ @queue << chunk # actual enqueue
202
214
  @map[key] = nc
203
215
  }
204
216
 
205
217
  ok = true
218
+ # false: queue have 1 or more chunks before this emit
219
+ # so this enqueue is not a trigger to flush
220
+ # true: queue have no chunks before this emit
221
+ # so this enqueue is a trigger to flush this buffer ASAP
206
222
  return flush_trigger
207
223
  ensure
208
224
  nc.purge unless ok
@@ -230,25 +246,31 @@ module Fluent
230
246
  total
231
247
  end
232
248
 
233
- #def new_chunk(key)
234
- #end
249
+ def new_chunk(key)
250
+ raise NotImplementedError, "Implement this method in child class"
251
+ end
235
252
 
236
- #def resume
237
- #end
253
+ def resume
254
+ raise NotImplementedError, "Implement this method in child class"
255
+ end
238
256
 
239
- #def enqueue(chunk)
240
- #end
257
+ # enqueueing is done by #push
258
+ # this method is actually 'enqueue_hook'
259
+ def enqueue(chunk)
260
+ raise NotImplementedError, "Implement this method in child class"
261
+ end
241
262
 
263
+ # get the chunk specified by key, and push it into queue
242
264
  def push(key)
243
265
  synchronize do
244
- top = @map[key]
245
- if !top || top.empty?
266
+ chunk = @map[key]
267
+ if !chunk || chunk.empty?
246
268
  return false
247
269
  end
248
270
 
249
271
  @queue.synchronize do
250
- enqueue(top)
251
- @queue << top
272
+ enqueue(chunk)
273
+ @queue << chunk
252
274
  @map.delete(key)
253
275
  end
254
276
 
@@ -256,6 +278,8 @@ module Fluent
256
278
  end # synchronize
257
279
  end
258
280
 
281
+ # shift a chunk from queue, write and purge it
282
+ # returns boolean to indicate whether this buffer have more chunk to be flushed or not
259
283
  def pop(out)
260
284
  chunk = nil
261
285
  @queue.synchronize do
@@ -270,21 +294,24 @@ module Fluent
270
294
  end
271
295
 
272
296
  begin
297
+ # #push(key) does not push empty chunks into queue.
298
+ # so this check is nonsense...
273
299
  if !chunk.empty?
274
300
  write_chunk(chunk, out)
275
301
  end
276
302
 
277
- empty = false
303
+ queue_empty = false
278
304
  @queue.synchronize do
279
305
  @queue.delete_if {|c|
280
306
  c.object_id == chunk.object_id
281
307
  }
282
- empty = @queue.empty?
308
+ queue_empty = @queue.empty?
283
309
  end
284
310
 
285
311
  chunk.purge
286
312
 
287
- return !empty
313
+ # return to be flushed once more immediately, or not
314
+ return !queue_empty
288
315
  ensure
289
316
  chunk.mon_exit
290
317
  end
@@ -70,7 +70,8 @@ op.on('--emit-error-log-interval SECONDS', "suppress interval seconds of emit er
70
70
  opts[:suppress_interval] = s.to_i
71
71
  }
72
72
 
73
- op.on('--suppress-repeated-stacktrace', "suppress repeated stacktrace", TrueClass) {|b|
73
+ op.on('--suppress-repeated-stacktrace [VALUE]', "suppress repeated stacktrace", TrueClass) {|b|
74
+ b = true if b.nil?
74
75
  opts[:suppress_repeated_stacktrace] = b
75
76
  }
76
77
 
@@ -78,10 +79,14 @@ op.on('--without-source', "invoke a fluentd without input plugins", TrueClass) {
78
79
  opts[:without_source] = b
79
80
  }
80
81
 
81
- op.on('--use-v1-config', "Use v1 configuration format", TrueClass) {|b|
82
+ op.on('--use-v1-config', "Use v1 configuration format (default)", TrueClass) {|b|
82
83
  opts[:use_v1_config] = b
83
84
  }
84
85
 
86
+ op.on('--use-v0-config', "Use v0 configuration format", TrueClass) {|b|
87
+ opts[:use_v1_config] = !b
88
+ }
89
+
85
90
  op.on('-v', '--verbose', "increase verbose level (-v: debug, -vv: trace)", TrueClass) {|b|
86
91
  if b
87
92
  opts[:log_level] = [opts[:log_level] - 1, Fluent::Log::LEVEL_TRACE].max
@@ -27,6 +27,7 @@ module Fluent
27
27
 
28
28
  LINE_END = /(?:[ \t]*(?:\#.*)?(?:\z|[\r\n]))+/
29
29
  SPACING = /(?:[ \t\r\n]|\z|\#.*?(?:\z|[\r\n]))+/
30
+ SPACING_WITHOUT_COMMENT = /(?:[ \t\r\n]|\z)+/
30
31
 
31
32
  module ClassMethods
32
33
  def symbol(string)
@@ -78,6 +79,10 @@ module Fluent
78
79
  skip(SPACING)
79
80
  end
80
81
 
82
+ def spacing_without_comment
83
+ skip(SPACING_WITHOUT_COMMENT)
84
+ end
85
+
81
86
  def parse_error!(message)
82
87
  raise ConfigParseError, "#{message} at #{error_sample}"
83
88
  end