fluentd 0.12.40 → 1.6.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 (428) hide show
  1. checksums.yaml +5 -5
  2. data/.github/ISSUE_TEMPLATE/bug_report.md +39 -0
  3. data/.github/ISSUE_TEMPLATE/feature_request.md +23 -0
  4. data/.github/ISSUE_TEMPLATE.md +17 -0
  5. data/.github/PULL_REQUEST_TEMPLATE.md +13 -0
  6. data/.gitignore +5 -0
  7. data/.gitlab/cicd-template.yaml +10 -0
  8. data/.gitlab-ci.yml +147 -0
  9. data/.travis.yml +56 -20
  10. data/ADOPTERS.md +5 -0
  11. data/CHANGELOG.md +1369 -0
  12. data/CONTRIBUTING.md +16 -5
  13. data/GOVERNANCE.md +55 -0
  14. data/Gemfile +5 -0
  15. data/GithubWorkflow.md +78 -0
  16. data/LICENSE +202 -0
  17. data/MAINTAINERS.md +7 -0
  18. data/README.md +23 -11
  19. data/Rakefile +48 -2
  20. data/Vagrantfile +17 -0
  21. data/appveyor.yml +37 -0
  22. data/bin/fluent-binlog-reader +7 -0
  23. data/bin/fluent-ca-generate +6 -0
  24. data/bin/fluent-plugin-config-format +5 -0
  25. data/bin/fluent-plugin-generate +5 -0
  26. data/bin/fluentd +3 -0
  27. data/code-of-conduct.md +3 -0
  28. data/example/copy_roundrobin.conf +39 -0
  29. data/example/counter.conf +18 -0
  30. data/example/in_dummy_blocks.conf +17 -0
  31. data/example/in_dummy_with_compression.conf +23 -0
  32. data/example/in_forward.conf +7 -0
  33. data/example/in_forward_client.conf +37 -0
  34. data/example/in_forward_shared_key.conf +15 -0
  35. data/example/in_forward_tls.conf +14 -0
  36. data/example/in_forward_users.conf +24 -0
  37. data/example/in_forward_workers.conf +21 -0
  38. data/example/in_http.conf +3 -1
  39. data/example/in_out_forward.conf +17 -0
  40. data/example/logevents.conf +25 -0
  41. data/example/multi_filters.conf +61 -0
  42. data/example/out_exec_filter.conf +42 -0
  43. data/example/out_forward.conf +13 -13
  44. data/example/out_forward_buf_file.conf +23 -0
  45. data/example/out_forward_client.conf +109 -0
  46. data/example/out_forward_heartbeat_none.conf +16 -0
  47. data/example/out_forward_shared_key.conf +36 -0
  48. data/example/out_forward_tls.conf +18 -0
  49. data/example/out_forward_users.conf +65 -0
  50. data/example/out_null.conf +36 -0
  51. data/example/secondary_file.conf +42 -0
  52. data/example/suppress_config_dump.conf +7 -0
  53. data/example/worker_section.conf +36 -0
  54. data/fluent.conf +29 -0
  55. data/fluentd.gemspec +21 -11
  56. data/lib/fluent/agent.rb +67 -90
  57. data/lib/fluent/clock.rb +62 -0
  58. data/lib/fluent/command/binlog_reader.rb +244 -0
  59. data/lib/fluent/command/ca_generate.rb +181 -0
  60. data/lib/fluent/command/cat.rb +42 -18
  61. data/lib/fluent/command/debug.rb +12 -10
  62. data/lib/fluent/command/fluentd.rb +153 -5
  63. data/lib/fluent/command/plugin_config_formatter.rb +292 -0
  64. data/lib/fluent/command/plugin_generator.rb +324 -0
  65. data/lib/fluent/compat/call_super_mixin.rb +67 -0
  66. data/lib/fluent/compat/detach_process_mixin.rb +33 -0
  67. data/lib/fluent/compat/exec_util.rb +129 -0
  68. data/lib/fluent/compat/file_util.rb +54 -0
  69. data/lib/fluent/compat/filter.rb +68 -0
  70. data/lib/fluent/compat/formatter.rb +111 -0
  71. data/lib/fluent/compat/formatter_utils.rb +85 -0
  72. data/lib/fluent/compat/handle_tag_and_time_mixin.rb +62 -0
  73. data/lib/fluent/compat/handle_tag_name_mixin.rb +53 -0
  74. data/lib/fluent/compat/input.rb +49 -0
  75. data/lib/fluent/compat/output.rb +718 -0
  76. data/lib/fluent/compat/output_chain.rb +60 -0
  77. data/lib/fluent/compat/parser.rb +310 -0
  78. data/lib/fluent/compat/parser_utils.rb +40 -0
  79. data/lib/fluent/compat/propagate_default.rb +62 -0
  80. data/lib/fluent/compat/record_filter_mixin.rb +34 -0
  81. data/lib/fluent/compat/set_tag_key_mixin.rb +50 -0
  82. data/lib/fluent/compat/set_time_key_mixin.rb +69 -0
  83. data/lib/fluent/compat/socket_util.rb +165 -0
  84. data/lib/fluent/compat/string_util.rb +34 -0
  85. data/lib/fluent/compat/structured_format_mixin.rb +26 -0
  86. data/lib/fluent/compat/type_converter.rb +90 -0
  87. data/lib/fluent/config/configure_proxy.rb +210 -62
  88. data/lib/fluent/config/dsl.rb +12 -5
  89. data/lib/fluent/config/element.rb +107 -9
  90. data/lib/fluent/config/literal_parser.rb +9 -3
  91. data/lib/fluent/config/parser.rb +4 -4
  92. data/lib/fluent/config/section.rb +51 -14
  93. data/lib/fluent/config/types.rb +28 -13
  94. data/lib/fluent/config/v1_parser.rb +3 -5
  95. data/lib/fluent/config.rb +23 -20
  96. data/lib/fluent/configurable.rb +79 -21
  97. data/lib/fluent/counter/base_socket.rb +46 -0
  98. data/lib/fluent/counter/client.rb +297 -0
  99. data/lib/fluent/counter/error.rb +86 -0
  100. data/lib/fluent/counter/mutex_hash.rb +163 -0
  101. data/lib/fluent/counter/server.rb +273 -0
  102. data/lib/fluent/counter/store.rb +205 -0
  103. data/lib/fluent/counter/validator.rb +145 -0
  104. data/lib/fluent/counter.rb +23 -0
  105. data/lib/fluent/daemon.rb +15 -0
  106. data/lib/fluent/engine.rb +102 -65
  107. data/lib/fluent/env.rb +7 -3
  108. data/lib/fluent/error.rb +30 -0
  109. data/lib/fluent/event.rb +197 -21
  110. data/lib/fluent/event_router.rb +93 -10
  111. data/lib/fluent/filter.rb +2 -50
  112. data/lib/fluent/formatter.rb +4 -293
  113. data/lib/fluent/input.rb +2 -32
  114. data/lib/fluent/label.rb +10 -2
  115. data/lib/fluent/load.rb +3 -3
  116. data/lib/fluent/log.rb +348 -81
  117. data/lib/fluent/match.rb +37 -36
  118. data/lib/fluent/mixin.rb +12 -176
  119. data/lib/fluent/msgpack_factory.rb +62 -0
  120. data/lib/fluent/output.rb +10 -612
  121. data/lib/fluent/output_chain.rb +23 -0
  122. data/lib/fluent/parser.rb +4 -800
  123. data/lib/fluent/plugin/bare_output.rb +63 -0
  124. data/lib/fluent/plugin/base.rb +192 -0
  125. data/lib/fluent/plugin/buf_file.rb +128 -174
  126. data/lib/fluent/plugin/buf_memory.rb +9 -92
  127. data/lib/fluent/plugin/buffer/chunk.rb +221 -0
  128. data/lib/fluent/plugin/buffer/file_chunk.rb +383 -0
  129. data/lib/fluent/plugin/buffer/memory_chunk.rb +90 -0
  130. data/lib/fluent/plugin/buffer.rb +779 -0
  131. data/lib/fluent/plugin/compressable.rb +92 -0
  132. data/lib/fluent/plugin/exec_util.rb +3 -108
  133. data/lib/fluent/plugin/file_util.rb +4 -34
  134. data/lib/fluent/plugin/file_wrapper.rb +120 -0
  135. data/lib/fluent/plugin/filter.rb +93 -0
  136. data/lib/fluent/plugin/filter_grep.rb +117 -34
  137. data/lib/fluent/plugin/filter_parser.rb +85 -62
  138. data/lib/fluent/plugin/filter_record_transformer.rb +27 -39
  139. data/lib/fluent/plugin/filter_stdout.rb +15 -12
  140. data/lib/fluent/plugin/formatter.rb +50 -0
  141. data/lib/fluent/plugin/formatter_csv.rb +52 -0
  142. data/lib/fluent/plugin/formatter_hash.rb +33 -0
  143. data/lib/fluent/plugin/formatter_json.rb +55 -0
  144. data/lib/fluent/plugin/formatter_ltsv.rb +42 -0
  145. data/lib/fluent/plugin/formatter_msgpack.rb +33 -0
  146. data/lib/fluent/plugin/formatter_out_file.rb +51 -0
  147. data/lib/fluent/plugin/formatter_single_value.rb +34 -0
  148. data/lib/fluent/plugin/formatter_stdout.rb +76 -0
  149. data/lib/fluent/plugin/formatter_tsv.rb +38 -0
  150. data/lib/fluent/plugin/in_debug_agent.rb +17 -6
  151. data/lib/fluent/plugin/in_dummy.rb +47 -20
  152. data/lib/fluent/plugin/in_exec.rb +55 -123
  153. data/lib/fluent/plugin/in_forward.rb +299 -216
  154. data/lib/fluent/plugin/in_gc_stat.rb +14 -36
  155. data/lib/fluent/plugin/in_http.rb +204 -91
  156. data/lib/fluent/plugin/in_monitor_agent.rb +186 -258
  157. data/lib/fluent/plugin/in_object_space.rb +13 -41
  158. data/lib/fluent/plugin/in_syslog.rb +112 -134
  159. data/lib/fluent/plugin/in_tail.rb +408 -745
  160. data/lib/fluent/plugin/in_tcp.rb +66 -9
  161. data/lib/fluent/plugin/in_udp.rb +60 -11
  162. data/lib/fluent/plugin/{in_stream.rb → in_unix.rb} +8 -4
  163. data/lib/fluent/plugin/input.rb +37 -0
  164. data/lib/fluent/plugin/multi_output.rb +158 -0
  165. data/lib/fluent/plugin/out_copy.rb +23 -35
  166. data/lib/fluent/plugin/out_exec.rb +67 -70
  167. data/lib/fluent/plugin/out_exec_filter.rb +204 -271
  168. data/lib/fluent/plugin/out_file.rb +267 -73
  169. data/lib/fluent/plugin/out_forward.rb +854 -325
  170. data/lib/fluent/plugin/out_null.rb +42 -9
  171. data/lib/fluent/plugin/out_relabel.rb +9 -5
  172. data/lib/fluent/plugin/out_roundrobin.rb +18 -37
  173. data/lib/fluent/plugin/out_secondary_file.rb +133 -0
  174. data/lib/fluent/plugin/out_stdout.rb +43 -10
  175. data/lib/fluent/plugin/out_stream.rb +7 -2
  176. data/lib/fluent/plugin/output.rb +1498 -0
  177. data/lib/fluent/plugin/owned_by_mixin.rb +42 -0
  178. data/lib/fluent/plugin/parser.rb +191 -0
  179. data/lib/fluent/plugin/parser_apache.rb +28 -0
  180. data/lib/fluent/plugin/parser_apache2.rb +88 -0
  181. data/lib/fluent/plugin/parser_apache_error.rb +26 -0
  182. data/lib/fluent/plugin/parser_csv.rb +39 -0
  183. data/lib/fluent/plugin/parser_json.rb +94 -0
  184. data/lib/fluent/plugin/parser_ltsv.rb +49 -0
  185. data/lib/fluent/plugin/parser_msgpack.rb +50 -0
  186. data/lib/fluent/plugin/parser_multiline.rb +106 -0
  187. data/lib/fluent/plugin/parser_nginx.rb +28 -0
  188. data/lib/fluent/plugin/parser_none.rb +36 -0
  189. data/lib/fluent/plugin/parser_regexp.rb +68 -0
  190. data/lib/fluent/plugin/parser_syslog.rb +142 -0
  191. data/lib/fluent/plugin/parser_tsv.rb +42 -0
  192. data/lib/fluent/plugin/socket_util.rb +3 -143
  193. data/lib/fluent/plugin/storage.rb +84 -0
  194. data/lib/fluent/plugin/storage_local.rb +164 -0
  195. data/lib/fluent/plugin/string_util.rb +3 -15
  196. data/lib/fluent/plugin.rb +122 -121
  197. data/lib/fluent/plugin_helper/cert_option.rb +178 -0
  198. data/lib/fluent/plugin_helper/child_process.rb +364 -0
  199. data/lib/fluent/plugin_helper/compat_parameters.rb +333 -0
  200. data/lib/fluent/plugin_helper/counter.rb +51 -0
  201. data/lib/fluent/plugin_helper/event_emitter.rb +93 -0
  202. data/lib/fluent/plugin_helper/event_loop.rb +170 -0
  203. data/lib/fluent/plugin_helper/extract.rb +104 -0
  204. data/lib/fluent/plugin_helper/formatter.rb +147 -0
  205. data/lib/fluent/plugin_helper/http_server/app.rb +79 -0
  206. data/lib/fluent/plugin_helper/http_server/compat/server.rb +81 -0
  207. data/lib/fluent/plugin_helper/http_server/compat/webrick_handler.rb +58 -0
  208. data/lib/fluent/plugin_helper/http_server/methods.rb +35 -0
  209. data/lib/fluent/plugin_helper/http_server/request.rb +42 -0
  210. data/lib/fluent/plugin_helper/http_server/router.rb +54 -0
  211. data/lib/fluent/plugin_helper/http_server/server.rb +87 -0
  212. data/lib/fluent/plugin_helper/http_server.rb +76 -0
  213. data/lib/fluent/plugin_helper/inject.rb +151 -0
  214. data/lib/fluent/plugin_helper/parser.rb +147 -0
  215. data/lib/fluent/plugin_helper/record_accessor.rb +210 -0
  216. data/lib/fluent/plugin_helper/retry_state.rb +205 -0
  217. data/lib/fluent/plugin_helper/server.rb +807 -0
  218. data/lib/fluent/plugin_helper/socket.rb +250 -0
  219. data/lib/fluent/plugin_helper/socket_option.rb +80 -0
  220. data/lib/fluent/plugin_helper/storage.rb +349 -0
  221. data/lib/fluent/plugin_helper/thread.rb +179 -0
  222. data/lib/fluent/plugin_helper/timer.rb +92 -0
  223. data/lib/fluent/plugin_helper.rb +73 -0
  224. data/lib/fluent/plugin_id.rb +80 -0
  225. data/lib/fluent/process.rb +3 -489
  226. data/lib/fluent/registry.rb +52 -10
  227. data/lib/fluent/root_agent.rb +204 -42
  228. data/lib/fluent/supervisor.rb +597 -359
  229. data/lib/fluent/system_config.rb +131 -42
  230. data/lib/fluent/test/base.rb +6 -54
  231. data/lib/fluent/test/driver/base.rb +224 -0
  232. data/lib/fluent/test/driver/base_owned.rb +70 -0
  233. data/lib/fluent/test/driver/base_owner.rb +135 -0
  234. data/lib/fluent/test/driver/event_feeder.rb +98 -0
  235. data/lib/fluent/test/driver/filter.rb +57 -0
  236. data/lib/fluent/test/driver/formatter.rb +30 -0
  237. data/lib/fluent/test/driver/input.rb +31 -0
  238. data/lib/fluent/test/driver/multi_output.rb +53 -0
  239. data/lib/fluent/test/driver/output.rb +102 -0
  240. data/lib/fluent/test/driver/parser.rb +30 -0
  241. data/lib/fluent/test/driver/test_event_router.rb +45 -0
  242. data/lib/fluent/test/filter_test.rb +0 -1
  243. data/lib/fluent/test/formatter_test.rb +4 -1
  244. data/lib/fluent/test/helpers.rb +58 -10
  245. data/lib/fluent/test/input_test.rb +27 -19
  246. data/lib/fluent/test/log.rb +79 -0
  247. data/lib/fluent/test/output_test.rb +28 -39
  248. data/lib/fluent/test/parser_test.rb +3 -1
  249. data/lib/fluent/test/startup_shutdown.rb +46 -0
  250. data/lib/fluent/test.rb +33 -1
  251. data/lib/fluent/time.rb +450 -1
  252. data/lib/fluent/timezone.rb +27 -3
  253. data/lib/fluent/{status.rb → unique_id.rb} +15 -24
  254. data/lib/fluent/version.rb +1 -1
  255. data/lib/fluent/winsvc.rb +85 -0
  256. data/templates/new_gem/Gemfile +3 -0
  257. data/templates/new_gem/README.md.erb +43 -0
  258. data/templates/new_gem/Rakefile +13 -0
  259. data/templates/new_gem/fluent-plugin.gemspec.erb +27 -0
  260. data/templates/new_gem/lib/fluent/plugin/filter.rb.erb +14 -0
  261. data/templates/new_gem/lib/fluent/plugin/formatter.rb.erb +14 -0
  262. data/templates/new_gem/lib/fluent/plugin/input.rb.erb +11 -0
  263. data/templates/new_gem/lib/fluent/plugin/output.rb.erb +11 -0
  264. data/templates/new_gem/lib/fluent/plugin/parser.rb.erb +15 -0
  265. data/templates/new_gem/test/helper.rb.erb +8 -0
  266. data/templates/new_gem/test/plugin/test_filter.rb.erb +18 -0
  267. data/templates/new_gem/test/plugin/test_formatter.rb.erb +18 -0
  268. data/templates/new_gem/test/plugin/test_input.rb.erb +18 -0
  269. data/templates/new_gem/test/plugin/test_output.rb.erb +18 -0
  270. data/templates/new_gem/test/plugin/test_parser.rb.erb +18 -0
  271. data/templates/plugin_config_formatter/param.md-compact.erb +25 -0
  272. data/templates/plugin_config_formatter/param.md.erb +34 -0
  273. data/templates/plugin_config_formatter/section.md.erb +12 -0
  274. data/test/command/test_binlog_reader.rb +346 -0
  275. data/test/command/test_ca_generate.rb +70 -0
  276. data/test/command/test_fluentd.rb +901 -0
  277. data/test/command/test_plugin_config_formatter.rb +276 -0
  278. data/test/command/test_plugin_generator.rb +92 -0
  279. data/test/compat/test_calls_super.rb +166 -0
  280. data/test/compat/test_parser.rb +92 -0
  281. data/test/config/test_config_parser.rb +126 -2
  282. data/test/config/test_configurable.rb +946 -187
  283. data/test/config/test_configure_proxy.rb +424 -74
  284. data/test/config/test_dsl.rb +11 -11
  285. data/test/config/test_element.rb +500 -0
  286. data/test/config/test_literal_parser.rb +8 -0
  287. data/test/config/test_plugin_configuration.rb +56 -0
  288. data/test/config/test_section.rb +79 -7
  289. data/test/config/test_system_config.rb +122 -35
  290. data/test/config/test_types.rb +38 -0
  291. data/test/counter/test_client.rb +559 -0
  292. data/test/counter/test_error.rb +44 -0
  293. data/test/counter/test_mutex_hash.rb +179 -0
  294. data/test/counter/test_server.rb +589 -0
  295. data/test/counter/test_store.rb +258 -0
  296. data/test/counter/test_validator.rb +137 -0
  297. data/test/helper.rb +89 -6
  298. data/test/helpers/fuzzy_assert.rb +89 -0
  299. data/test/plugin/test_bare_output.rb +118 -0
  300. data/test/plugin/test_base.rb +115 -0
  301. data/test/plugin/test_buf_file.rb +823 -460
  302. data/test/plugin/test_buf_memory.rb +32 -194
  303. data/test/plugin/test_buffer.rb +1233 -0
  304. data/test/plugin/test_buffer_chunk.rb +198 -0
  305. data/test/plugin/test_buffer_file_chunk.rb +844 -0
  306. data/test/plugin/test_buffer_memory_chunk.rb +338 -0
  307. data/test/plugin/test_compressable.rb +84 -0
  308. data/test/plugin/test_filter.rb +357 -0
  309. data/test/plugin/test_filter_grep.rb +540 -29
  310. data/test/plugin/test_filter_parser.rb +439 -452
  311. data/test/plugin/test_filter_record_transformer.rb +123 -166
  312. data/test/plugin/test_filter_stdout.rb +160 -72
  313. data/test/plugin/test_formatter_csv.rb +111 -0
  314. data/test/plugin/test_formatter_hash.rb +35 -0
  315. data/test/plugin/test_formatter_json.rb +51 -0
  316. data/test/plugin/test_formatter_ltsv.rb +62 -0
  317. data/test/plugin/test_formatter_msgpack.rb +28 -0
  318. data/test/plugin/test_formatter_out_file.rb +95 -0
  319. data/test/plugin/test_formatter_single_value.rb +38 -0
  320. data/test/plugin/test_formatter_tsv.rb +68 -0
  321. data/test/plugin/test_in_debug_agent.rb +24 -1
  322. data/test/plugin/test_in_dummy.rb +111 -18
  323. data/test/plugin/test_in_exec.rb +200 -113
  324. data/test/plugin/test_in_forward.rb +990 -387
  325. data/test/plugin/test_in_gc_stat.rb +10 -8
  326. data/test/plugin/test_in_http.rb +600 -224
  327. data/test/plugin/test_in_monitor_agent.rb +690 -0
  328. data/test/plugin/test_in_object_space.rb +24 -8
  329. data/test/plugin/test_in_syslog.rb +154 -215
  330. data/test/plugin/test_in_tail.rb +1006 -707
  331. data/test/plugin/test_in_tcp.rb +125 -48
  332. data/test/plugin/test_in_udp.rb +204 -63
  333. data/test/plugin/{test_in_stream.rb → test_in_unix.rb} +14 -13
  334. data/test/plugin/test_input.rb +126 -0
  335. data/test/plugin/test_metadata.rb +89 -0
  336. data/test/plugin/test_multi_output.rb +180 -0
  337. data/test/plugin/test_out_copy.rb +117 -112
  338. data/test/plugin/test_out_exec.rb +258 -53
  339. data/test/plugin/test_out_exec_filter.rb +538 -115
  340. data/test/plugin/test_out_file.rb +865 -178
  341. data/test/plugin/test_out_forward.rb +998 -210
  342. data/test/plugin/test_out_null.rb +105 -0
  343. data/test/plugin/test_out_relabel.rb +28 -0
  344. data/test/plugin/test_out_roundrobin.rb +36 -29
  345. data/test/plugin/test_out_secondary_file.rb +458 -0
  346. data/test/plugin/test_out_stdout.rb +135 -37
  347. data/test/plugin/test_out_stream.rb +18 -0
  348. data/test/plugin/test_output.rb +984 -0
  349. data/test/plugin/test_output_as_buffered.rb +2021 -0
  350. data/test/plugin/test_output_as_buffered_backup.rb +312 -0
  351. data/test/plugin/test_output_as_buffered_compress.rb +165 -0
  352. data/test/plugin/test_output_as_buffered_overflow.rb +250 -0
  353. data/test/plugin/test_output_as_buffered_retries.rb +911 -0
  354. data/test/plugin/test_output_as_buffered_secondary.rb +874 -0
  355. data/test/plugin/test_output_as_standard.rb +374 -0
  356. data/test/plugin/test_owned_by.rb +35 -0
  357. data/test/plugin/test_parser.rb +359 -0
  358. data/test/plugin/test_parser_apache.rb +42 -0
  359. data/test/plugin/test_parser_apache2.rb +47 -0
  360. data/test/plugin/test_parser_apache_error.rb +45 -0
  361. data/test/plugin/test_parser_csv.rb +103 -0
  362. data/test/plugin/test_parser_json.rb +138 -0
  363. data/test/plugin/test_parser_labeled_tsv.rb +145 -0
  364. data/test/plugin/test_parser_multiline.rb +100 -0
  365. data/test/plugin/test_parser_nginx.rb +88 -0
  366. data/test/plugin/test_parser_none.rb +52 -0
  367. data/test/plugin/test_parser_regexp.rb +289 -0
  368. data/test/plugin/test_parser_syslog.rb +441 -0
  369. data/test/plugin/test_parser_tsv.rb +122 -0
  370. data/test/plugin/test_storage.rb +167 -0
  371. data/test/plugin/test_storage_local.rb +335 -0
  372. data/test/plugin_helper/data/cert/cert-key.pem +27 -0
  373. data/test/plugin_helper/data/cert/cert-with-no-newline.pem +19 -0
  374. data/test/plugin_helper/data/cert/cert.pem +19 -0
  375. data/test/plugin_helper/http_server/test_app.rb +65 -0
  376. data/test/plugin_helper/http_server/test_route.rb +32 -0
  377. data/test/plugin_helper/test_cert_option.rb +16 -0
  378. data/test/plugin_helper/test_child_process.rb +794 -0
  379. data/test/plugin_helper/test_compat_parameters.rb +353 -0
  380. data/test/plugin_helper/test_event_emitter.rb +51 -0
  381. data/test/plugin_helper/test_event_loop.rb +52 -0
  382. data/test/plugin_helper/test_extract.rb +194 -0
  383. data/test/plugin_helper/test_formatter.rb +255 -0
  384. data/test/plugin_helper/test_http_server_helper.rb +205 -0
  385. data/test/plugin_helper/test_inject.rb +519 -0
  386. data/test/plugin_helper/test_parser.rb +264 -0
  387. data/test/plugin_helper/test_record_accessor.rb +197 -0
  388. data/test/plugin_helper/test_retry_state.rb +442 -0
  389. data/test/plugin_helper/test_server.rb +1714 -0
  390. data/test/plugin_helper/test_storage.rb +542 -0
  391. data/test/plugin_helper/test_thread.rb +164 -0
  392. data/test/plugin_helper/test_timer.rb +132 -0
  393. data/test/scripts/exec_script.rb +0 -6
  394. data/test/scripts/fluent/plugin/formatter1/formatter_test1.rb +7 -0
  395. data/test/scripts/fluent/plugin/formatter2/formatter_test2.rb +7 -0
  396. data/test/scripts/fluent/plugin/out_test.rb +23 -15
  397. data/test/scripts/fluent/plugin/out_test2.rb +80 -0
  398. data/test/test_clock.rb +164 -0
  399. data/test/test_config.rb +16 -7
  400. data/test/test_configdsl.rb +2 -2
  401. data/test/test_event.rb +360 -13
  402. data/test/test_event_router.rb +108 -11
  403. data/test/test_event_time.rb +199 -0
  404. data/test/test_filter.rb +48 -6
  405. data/test/test_formatter.rb +11 -391
  406. data/test/test_input.rb +1 -1
  407. data/test/test_log.rb +591 -31
  408. data/test/test_mixin.rb +1 -1
  409. data/test/test_output.rb +121 -185
  410. data/test/test_plugin.rb +251 -0
  411. data/test/test_plugin_classes.rb +177 -10
  412. data/test/test_plugin_helper.rb +81 -0
  413. data/test/test_plugin_id.rb +101 -0
  414. data/test/test_process.rb +8 -42
  415. data/test/test_root_agent.rb +766 -21
  416. data/test/test_supervisor.rb +481 -0
  417. data/test/test_test_drivers.rb +135 -0
  418. data/test/test_time_formatter.rb +282 -0
  419. data/test/test_time_parser.rb +231 -0
  420. data/test/test_unique_id.rb +47 -0
  421. metadata +454 -60
  422. data/COPYING +0 -14
  423. data/ChangeLog +0 -666
  424. data/lib/fluent/buffer.rb +0 -365
  425. data/lib/fluent/plugin/in_status.rb +0 -76
  426. data/test/plugin/test_in_status.rb +0 -38
  427. data/test/test_buffer.rb +0 -624
  428. data/test/test_parser.rb +0 -1305
@@ -0,0 +1,92 @@
1
+ #
2
+ # Fluentd
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #
16
+
17
+ require 'stringio'
18
+ require 'zlib'
19
+
20
+ module Fluent
21
+ module Plugin
22
+ module Compressable
23
+ def compress(data, **kwargs)
24
+ output_io = kwargs[:output_io]
25
+ io = output_io || StringIO.new
26
+ Zlib::GzipWriter.wrap(io) do |gz|
27
+ gz.write data
28
+ end
29
+
30
+ output_io || io.string
31
+ end
32
+
33
+ # compressed_data is String like `compress(data1) + compress(data2) + ... + compress(dataN)`
34
+ # https://www.ruby-forum.com/topic/971591#979503
35
+ def decompress(compressed_data = nil, output_io: nil, input_io: nil)
36
+ case
37
+ when input_io && output_io
38
+ io_decompress(input_io, output_io)
39
+ when input_io
40
+ output_io = StringIO.new
41
+ io = io_decompress(input_io, output_io)
42
+ io.string
43
+ when compressed_data.nil? || compressed_data.empty?
44
+ # check compressed_data(String) is 0 length
45
+ compressed_data
46
+ when output_io
47
+ # execute after checking compressed_data is empty or not
48
+ io = StringIO.new(compressed_data)
49
+ io_decompress(io, output_io)
50
+ else
51
+ string_decompress(compressed_data)
52
+ end
53
+ end
54
+
55
+ private
56
+
57
+ def string_decompress(compressed_data)
58
+ io = StringIO.new(compressed_data)
59
+
60
+ out = ''
61
+ loop do
62
+ gz = Zlib::GzipReader.new(io)
63
+ out << gz.read
64
+ unused = gz.unused
65
+ gz.finish
66
+
67
+ break if unused.nil?
68
+ adjust = unused.length
69
+ io.pos -= adjust
70
+ end
71
+
72
+ out
73
+ end
74
+
75
+ def io_decompress(input, output)
76
+ loop do
77
+ gz = Zlib::GzipReader.new(input)
78
+ v = gz.read
79
+ output.write(v)
80
+ unused = gz.unused
81
+ gz.finish
82
+
83
+ break if unused.nil?
84
+ adjust = unused.length
85
+ input.pos -= adjust
86
+ end
87
+
88
+ output
89
+ end
90
+ end
91
+ end
92
+ end
@@ -14,114 +14,9 @@
14
14
  # limitations under the License.
15
15
  #
16
16
 
17
- require 'msgpack'
18
- require 'yajl'
19
-
20
- require 'fluent/engine'
21
- require 'fluent/plugin'
22
- require 'fluent/parser'
17
+ require 'fluent/compat/exec_util'
23
18
 
24
19
  module Fluent
25
- module ExecUtil
26
- SUPPORTED_FORMAT = {
27
- 'tsv' => :tsv,
28
- 'json' => :json,
29
- 'msgpack' => :msgpack,
30
- }
31
-
32
- class Parser
33
- def initialize(on_message)
34
- @on_message = on_message
35
- end
36
- end
37
-
38
- class TextParserWrapperParser < Parser
39
- def initialize(conf, on_message)
40
- @parser = Plugin.new_parser(conf['format'])
41
- @parser.configure(conf)
42
- super(on_message)
43
- end
44
-
45
- def call(io)
46
- io.each_line(&method(:each_line))
47
- end
48
-
49
- def each_line(line)
50
- line.chomp!
51
- @parser.parse(line) { |time, record|
52
- @on_message.call(record, time)
53
- }
54
- end
55
- end
56
-
57
- class TSVParser < Parser
58
- def initialize(keys, on_message)
59
- @keys = keys
60
- super(on_message)
61
- end
62
-
63
- def call(io)
64
- io.each_line(&method(:each_line))
65
- end
66
-
67
- def each_line(line)
68
- line.chomp!
69
- vals = line.split("\t")
70
-
71
- record = Hash[@keys.zip(vals)]
72
-
73
- @on_message.call(record)
74
- end
75
- end
76
-
77
- class JSONParser < Parser
78
- def call(io)
79
- y = Yajl::Parser.new
80
- y.on_parse_complete = @on_message
81
- y.parse(io)
82
- end
83
- end
84
-
85
- class MessagePackParser < Parser
86
- def call(io)
87
- @u = Fluent::Engine.msgpack_factory.unpacker(io)
88
- begin
89
- @u.each(&@on_message)
90
- rescue EOFError
91
- end
92
- end
93
- end
94
-
95
- class Formatter
96
- end
97
-
98
- class TSVFormatter < Formatter
99
- def initialize(in_keys)
100
- @in_keys = in_keys
101
- super()
102
- end
103
-
104
- def call(record, out)
105
- last = @in_keys.length-1
106
- for i in 0..last
107
- key = @in_keys[i]
108
- out << record[key].to_s
109
- out << "\t" if i != last
110
- end
111
- out << "\n"
112
- end
113
- end
114
-
115
- class JSONFormatter < Formatter
116
- def call(record, out)
117
- out << Yajl.dump(record) << "\n"
118
- end
119
- end
120
-
121
- class MessagePackFormatter < Formatter
122
- def call(record, out)
123
- record.to_msgpack(out)
124
- end
125
- end
126
- end
20
+ # obsolete
21
+ ExecUtil = Fluent::Compat::ExecUtil
127
22
  end
@@ -14,39 +14,9 @@
14
14
  # limitations under the License.
15
15
  #
16
16
 
17
- module Fluent
18
- module FileUtil
19
- # Check file is writable if file exists
20
- # Check directory is writable if file does not exist
21
- #
22
- # @param [String] path File path
23
- # @return [Boolean] file is writable or not
24
- def writable?(path)
25
- return false if File.directory?(path)
26
- return File.writable?(path) if File.exist?(path)
27
-
28
- dirname = File.dirname(path)
29
- return false if !File.directory?(dirname)
30
- File.writable?(dirname)
31
- end
32
- module_function :writable?
33
-
34
- # Check file is writable in conjunction wtih mkdir_p(dirname(path))
35
- #
36
- # @param [String] path File path
37
- # @return [Boolean] file writable or not
38
- def writable_p?(path)
39
- return false if File.directory?(path)
40
- return File.writable?(path) if File.exist?(path)
17
+ require 'fluent/compat/file_util'
41
18
 
42
- dirname = File.dirname(path)
43
- until File.exist?(dirname)
44
- dirname = File.dirname(dirname)
45
- end
46
-
47
- return false if !File.directory?(dirname)
48
- File.writable?(dirname)
49
- end
50
- module_function :writable_p?
51
- end
19
+ module Fluent
20
+ # obsolete
21
+ FileUtil = Fluent::Compat::FileUtil
52
22
  end
@@ -0,0 +1,120 @@
1
+ #
2
+ # Fluentd
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #
16
+
17
+ module Fluent
18
+ module FileWrapper
19
+ def self.open(*args)
20
+ io = WindowsFile.new(*args).io
21
+ if block_given?
22
+ v = yield io
23
+ io.close
24
+ v
25
+ else
26
+ io
27
+ end
28
+ end
29
+
30
+ def self.stat(path)
31
+ f = WindowsFile.new(path)
32
+ s = f.stat
33
+ f.close
34
+ s
35
+ end
36
+ end
37
+
38
+ module WindowsFileExtension
39
+ attr_reader :path
40
+
41
+ def stat
42
+ s = super
43
+ s.instance_variable_set :@ino, @ino
44
+ def s.ino; @ino; end
45
+ s
46
+ end
47
+ end
48
+
49
+ # To open and get stat with setting FILE_SHARE_DELETE
50
+ class WindowsFile
51
+ require 'windows/file'
52
+ require 'windows/error'
53
+ require 'windows/handle'
54
+ require 'windows/nio'
55
+
56
+ include Windows::Error
57
+ include Windows::File
58
+ include Windows::Handle
59
+ include Windows::NIO
60
+
61
+ def initialize(path, mode='r', sharemode=FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE)
62
+ @path = path
63
+ @file_handle = INVALID_HANDLE_VALUE
64
+ @mode = mode
65
+
66
+
67
+ access, creationdisposition, seektoend = case mode.delete('b')
68
+ when "r" ; [FILE_GENERIC_READ , OPEN_EXISTING, false]
69
+ when "r+"; [FILE_GENERIC_READ | FILE_GENERIC_WRITE, OPEN_ALWAYS , false]
70
+ when "w" ; [FILE_GENERIC_WRITE , CREATE_ALWAYS, false]
71
+ when "w+"; [FILE_GENERIC_READ | FILE_GENERIC_WRITE, CREATE_ALWAYS, false]
72
+ when "a" ; [FILE_GENERIC_WRITE , OPEN_ALWAYS , true]
73
+ when "a+"; [FILE_GENERIC_READ | FILE_GENERIC_WRITE, OPEN_ALWAYS , true]
74
+ else raise "unknown mode '#{mode}'"
75
+ end
76
+
77
+ @file_handle = CreateFile.call(@path, access, sharemode,
78
+ 0, creationdisposition, FILE_ATTRIBUTE_NORMAL, 0)
79
+ if @file_handle == INVALID_HANDLE_VALUE
80
+ err = GetLastError.call
81
+ if err == ERROR_FILE_NOT_FOUND || err == ERROR_PATH_NOT_FOUND || err == ERROR_ACCESS_DENIED
82
+ raise SystemCallError.new(2)
83
+ end
84
+ raise SystemCallError.new(err)
85
+ end
86
+ end
87
+
88
+ def close
89
+ CloseHandle.call(@file_handle)
90
+ @file_handle = INVALID_HANDLE_VALUE
91
+ end
92
+
93
+ def io
94
+ fd = _open_osfhandle(@file_handle, 0)
95
+ raise Errno::ENOENT if fd == -1
96
+ io = File.for_fd(fd, @mode)
97
+ io.instance_variable_set :@ino, self.ino
98
+ io.instance_variable_set :@path, @path
99
+ io.extend WindowsFileExtension
100
+ io
101
+ end
102
+
103
+ def ino
104
+ by_handle_file_information = '\0'*(4+8+8+8+4+4+4+4+4+4) #72bytes
105
+
106
+ unless GetFileInformationByHandle.call(@file_handle, by_handle_file_information)
107
+ return 0
108
+ end
109
+
110
+ by_handle_file_information.unpack("I11Q1")[11] # fileindex
111
+ end
112
+
113
+ def stat
114
+ s = File.stat(@path)
115
+ s.instance_variable_set :@ino, self.ino
116
+ def s.ino; @ino; end
117
+ s
118
+ end
119
+ end
120
+ end if Fluent.windows?
@@ -0,0 +1,93 @@
1
+ #
2
+ # Fluentd
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #
16
+
17
+ require 'fluent/plugin/base'
18
+
19
+ require 'fluent/event'
20
+ require 'fluent/log'
21
+ require 'fluent/plugin_id'
22
+ require 'fluent/plugin_helper'
23
+
24
+ module Fluent
25
+ module Plugin
26
+ class Filter < Base
27
+ include PluginId
28
+ include PluginLoggerMixin
29
+ include PluginHelper::Mixin
30
+
31
+ helpers_internal :event_emitter
32
+
33
+ attr_reader :has_filter_with_time
34
+
35
+ def initialize
36
+ super
37
+ @has_filter_with_time = has_filter_with_time?
38
+ end
39
+
40
+ def filter(tag, time, record)
41
+ raise NotImplementedError, "BUG: filter plugins MUST implement this method"
42
+ end
43
+
44
+ def filter_with_time(tag, time, record)
45
+ raise NotImplementedError, "BUG: filter plugins MUST implement this method"
46
+ end
47
+
48
+ def filter_stream(tag, es)
49
+ new_es = MultiEventStream.new
50
+ if @has_filter_with_time
51
+ es.each do |time, record|
52
+ begin
53
+ filtered_time, filtered_record = filter_with_time(tag, time, record)
54
+ new_es.add(filtered_time, filtered_record) if filtered_time && filtered_record
55
+ rescue => e
56
+ router.emit_error_event(tag, time, record, e)
57
+ end
58
+ end
59
+ else
60
+ es.each do |time, record|
61
+ begin
62
+ filtered_record = filter(tag, time, record)
63
+ new_es.add(time, filtered_record) if filtered_record
64
+ rescue => e
65
+ router.emit_error_event(tag, time, record, e)
66
+ end
67
+ end
68
+ end
69
+ new_es
70
+ end
71
+
72
+ private
73
+
74
+ def has_filter_with_time?
75
+ implmented_methods = self.class.instance_methods(false)
76
+ # Plugins that override `filter_stream` don't need check,
77
+ # because they may not call `filter` or `filter_with_time`
78
+ # for example fluentd/lib/fluent/plugin/filter_record_transformer.rb
79
+ return nil if implmented_methods.include?(:filter_stream)
80
+ case
81
+ when [:filter, :filter_with_time].all? { |e| implmented_methods.include?(e) }
82
+ raise "BUG: Filter plugins MUST implement either `filter` or `filter_with_time`"
83
+ when implmented_methods.include?(:filter)
84
+ false
85
+ when implmented_methods.include?(:filter_with_time)
86
+ true
87
+ else
88
+ raise NotImplementedError, "BUG: Filter plugins MUST implement either `filter` or `filter_with_time`"
89
+ end
90
+ end
91
+ end
92
+ end
93
+ end
@@ -14,18 +14,28 @@
14
14
  # limitations under the License.
15
15
  #
16
16
 
17
- require 'fluent/filter'
17
+ require 'fluent/plugin/filter'
18
18
  require 'fluent/config/error'
19
+ require 'fluent/plugin/string_util'
19
20
 
20
- module Fluent
21
+ module Fluent::Plugin
21
22
  class GrepFilter < Filter
22
23
  Fluent::Plugin.register_filter('grep', self)
23
24
 
24
25
  def initialize
25
26
  super
26
- require 'fluent/plugin/string_util'
27
+
28
+ @_regexp_and_conditions = nil
29
+ @_exclude_and_conditions = nil
30
+ @_regexp_or_conditions = nil
31
+ @_exclude_or_conditions = nil
27
32
  end
28
33
 
34
+ # for test
35
+ attr_reader :_regexp_and_conditions, :_exclude_and_conditions, :_regexp_or_conditions, :_exclude_or_conditions
36
+
37
+ helpers :record_accessor
38
+
29
39
  REGEXP_MAX_NUM = 20
30
40
 
31
41
  (1..REGEXP_MAX_NUM).each {|i| config_param :"regexp#{i}", :string, default: nil, deprecated: "Use <regexp> section" }
@@ -35,72 +45,145 @@ module Fluent
35
45
  desc "The field name to which the regular expression is applied."
36
46
  config_param :key, :string
37
47
  desc "The regular expression."
38
- config_param :pattern do |value|
39
- Regexp.compile(value)
40
- end
48
+ config_param :pattern, :regexp
41
49
  end
42
50
 
43
51
  config_section :exclude, param_name: :excludes, multi: true do
44
52
  desc "The field name to which the regular expression is applied."
45
53
  config_param :key, :string
46
54
  desc "The regular expression."
47
- config_param :pattern do |value|
48
- Regexp.compile(value)
55
+ config_param :pattern, :regexp
56
+ end
57
+
58
+ config_section :and, param_name: :and_conditions, multi: true do
59
+ config_section :regexp, param_name: :regexps, multi: true do
60
+ desc "The field name to which the regular expression is applied."
61
+ config_param :key, :string
62
+ desc "The regular expression."
63
+ config_param :pattern, :regexp
64
+ end
65
+ config_section :exclude, param_name: :excludes, multi: true do
66
+ desc "The field name to which the regular expression is applied."
67
+ config_param :key, :string
68
+ desc "The regular expression."
69
+ config_param :pattern, :regexp
49
70
  end
50
71
  end
51
72
 
52
- # for test
53
- attr_reader :_regexps
54
- attr_reader :_excludes
73
+ config_section :or, param_name: :or_conditions, multi: true do
74
+ config_section :regexp, param_name: :regexps, multi: true do
75
+ desc "The field name to which the regular expression is applied."
76
+ config_param :key, :string
77
+ desc "The regular expression."
78
+ config_param :pattern, :regexp
79
+ end
80
+ config_section :exclude, param_name: :excludes, multi: true do
81
+ desc "The field name to which the regular expression is applied."
82
+ config_param :key, :string
83
+ desc "The regular expression."
84
+ config_param :pattern, :regexp
85
+ end
86
+ end
55
87
 
56
88
  def configure(conf)
57
89
  super
58
90
 
59
- @_regexps = {}
91
+ regexp_and_conditions = {}
92
+ regexp_or_conditions = {}
93
+ exclude_and_conditions = {}
94
+ exclude_or_conditions = {}
95
+
60
96
  (1..REGEXP_MAX_NUM).each do |i|
61
97
  next unless conf["regexp#{i}"]
62
98
  key, regexp = conf["regexp#{i}"].split(/ /, 2)
63
- raise ConfigError, "regexp#{i} does not contain 2 parameters" unless regexp
64
- raise ConfigError, "regexp#{i} contains a duplicated key, #{key}" if @_regexps[key]
65
- @_regexps[key] = Regexp.compile(regexp)
99
+ raise Fluent::ConfigError, "regexp#{i} does not contain 2 parameters" unless regexp
100
+ raise Fluent::ConfigError, "regexp#{i} contains a duplicated key, #{key}" if regexp_and_conditions[key]
101
+ regexp_and_conditions[key] = Expression.new(record_accessor_create(key), Regexp.compile(regexp))
66
102
  end
67
103
 
68
- @_excludes = {}
69
104
  (1..REGEXP_MAX_NUM).each do |i|
70
105
  next unless conf["exclude#{i}"]
71
106
  key, exclude = conf["exclude#{i}"].split(/ /, 2)
72
- raise ConfigError, "exclude#{i} does not contain 2 parameters" unless exclude
73
- raise ConfigError, "exclude#{i} contains a duplicated key, #{key}" if @_excludes[key]
74
- @_excludes[key] = Regexp.compile(exclude)
107
+ raise Fluent::ConfigError, "exclude#{i} does not contain 2 parameters" unless exclude
108
+ raise Fluent::ConfigError, "exclude#{i} contains a duplicated key, #{key}" if exclude_or_conditions[key]
109
+ exclude_or_conditions[key] = Expression.new(record_accessor_create(key), Regexp.compile(exclude))
75
110
  end
76
111
 
112
+ if @regexps.size > 1
113
+ log.info "Top level multiple <regexp> is intepreted as 'and' condition"
114
+ end
77
115
  @regexps.each do |e|
78
- raise Fluent::ConfigError, "Duplicate key: #{e.key}" if @_regexps.key?(e.key)
79
- @_regexps[e.key] = e.pattern
116
+ raise Fluent::ConfigError, "Duplicate key: #{e.key}" if regexp_and_conditions.key?(e.key)
117
+ regexp_and_conditions[e.key] = Expression.new(record_accessor_create(e.key), e.pattern)
118
+ end
119
+
120
+ if @excludes.size > 1
121
+ log.info "Top level multiple <exclude> is intepreted as 'or' condition"
80
122
  end
81
123
  @excludes.each do |e|
82
- raise Fluent::ConfigError, "Duplicate key: #{e.key}" if @_excludes.key?(e.key)
83
- @_excludes[e.key] = e.pattern
124
+ raise Fluent::ConfigError, "Duplicate key: #{e.key}" if exclude_or_conditions.key?(e.key)
125
+ exclude_or_conditions[e.key] = Expression.new(record_accessor_create(e.key), e.pattern)
84
126
  end
127
+
128
+ @and_conditions.each do |and_condition|
129
+ if !and_condition.regexps.empty? && !and_condition.excludes.empty?
130
+ raise Fluent::ConfigError, "Do not specify both <regexp> and <exclude> in <and>"
131
+ end
132
+ and_condition.regexps.each do |e|
133
+ raise Fluent::ConfigError, "Duplicate key in <and>: #{e.key}" if regexp_and_conditions.key?(e.key)
134
+ regexp_and_conditions[e.key] = Expression.new(record_accessor_create(e.key), e.pattern)
135
+ end
136
+ and_condition.excludes.each do |e|
137
+ raise Fluent::ConfigError, "Duplicate key in <and>: #{e.key}" if exclude_and_conditions.key?(e.key)
138
+ exclude_and_conditions[e.key] = Expression.new(record_accessor_create(e.key), e.pattern)
139
+ end
140
+ end
141
+
142
+ @or_conditions.each do |or_condition|
143
+ if !or_condition.regexps.empty? && !or_condition.excludes.empty?
144
+ raise Fluent::ConfigError, "Do not specify both <regexp> and <exclude> in <or>"
145
+ end
146
+ or_condition.regexps.each do |e|
147
+ raise Fluent::ConfigError, "Duplicate key in <or>: #{e.key}" if regexp_or_conditions.key?(e.key)
148
+ regexp_or_conditions[e.key] = Expression.new(record_accessor_create(e.key), e.pattern)
149
+ end
150
+ or_condition.excludes.each do |e|
151
+ raise Fluent::ConfigError, "Duplicate key in <or>: #{e.key}" if exclude_or_conditions.key?(e.key)
152
+ exclude_or_conditions[e.key] = Expression.new(record_accessor_create(e.key), e.pattern)
153
+ end
154
+ end
155
+
156
+ @_regexp_and_conditions = regexp_and_conditions.values unless regexp_and_conditions.empty?
157
+ @_exclude_and_conditions = exclude_and_conditions.values unless exclude_and_conditions.empty?
158
+ @_regexp_or_conditions = regexp_or_conditions.values unless regexp_or_conditions.empty?
159
+ @_exclude_or_conditions = exclude_or_conditions.values unless exclude_or_conditions.empty?
85
160
  end
86
161
 
87
162
  def filter(tag, time, record)
88
- result = nil
89
163
  begin
90
- catch(:break_loop) do
91
- @_regexps.each do |key, regexp|
92
- throw :break_loop unless ::Fluent::StringUtil.match_regexp(regexp, record[key].to_s)
93
- end
94
- @_excludes.each do |key, exclude|
95
- throw :break_loop if ::Fluent::StringUtil.match_regexp(exclude, record[key].to_s)
96
- end
97
- result = record
164
+ if @_regexp_and_conditions && @_regexp_and_conditions.any? { |expression| !expression.match?(record) }
165
+ return nil
166
+ end
167
+ if @_regexp_or_conditions && @_regexp_or_conditions.none? { |expression| expression.match?(record) }
168
+ return nil
169
+ end
170
+ if @_exclude_and_conditions && @_exclude_and_conditions.all? { |expression| expression.match?(record) }
171
+ return nil
172
+ end
173
+ if @_exclude_or_conditions && @_exclude_or_conditions.any? { |expression| expression.match?(record) }
174
+ return nil
98
175
  end
99
176
  rescue => e
100
- log.warn "failed to grep events", error_class: e.class, error: e.message
177
+ log.warn "failed to grep events", error: e
101
178
  log.warn_backtrace
102
179
  end
103
- result
180
+ record
181
+ end
182
+
183
+ Expression = Struct.new(:key, :pattern) do
184
+ def match?(record)
185
+ ::Fluent::StringUtil.match_regexp(pattern, key.call(record).to_s)
186
+ end
104
187
  end
105
188
  end
106
189
  end