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,324 @@
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 "optparse"
18
+ require "pathname"
19
+ require "fileutils"
20
+ require "erb"
21
+ require "open-uri"
22
+
23
+ require "fluent/registry"
24
+ require 'fluent/version'
25
+
26
+ class FluentPluginGenerator
27
+ attr_reader :type, :name
28
+ attr_reader :license_name
29
+
30
+ SUPPORTED_TYPES = ["input", "output", "filter", "parser", "formatter"]
31
+
32
+ def initialize(argv = ARGV)
33
+ @argv = argv
34
+ @parser = prepare_parser
35
+
36
+ @license_name = "Apache-2.0"
37
+ @overwrite_all = false
38
+ end
39
+
40
+ def call
41
+ parse_options!
42
+ FileUtils.mkdir_p(gem_name)
43
+ Dir.chdir(gem_name) do
44
+ copy_license
45
+ template_directory.find do |path|
46
+ next if path.directory?
47
+ dest_dir = path.dirname.sub(/\A#{Regexp.quote(template_directory.to_s)}\/?/, "")
48
+ dest_file = dest_filename(path)
49
+ if path.extname == ".erb"
50
+ if path.fnmatch?("*/plugin/*")
51
+ next unless path.basename.fnmatch?("*#{type}*")
52
+ end
53
+ template(path, dest_dir + dest_file)
54
+ else
55
+ file(path, dest_dir + dest_file)
56
+ end
57
+ end
58
+ pid = spawn("git", "init", ".")
59
+ Process.wait(pid)
60
+ end
61
+ end
62
+
63
+ private
64
+
65
+ def template_directory
66
+ (Pathname(__dir__) + "../../../templates/new_gem").realpath
67
+ end
68
+
69
+ def template_file(filename)
70
+ template_directory + filename
71
+ end
72
+
73
+ def template(source, dest)
74
+ dest.dirname.mkpath
75
+ contents =
76
+ if ERB.instance_method(:initialize).parameters.assoc(:key) # Ruby 2.6+
77
+ ERB.new(source.read, trim_mode: "-")
78
+ else
79
+ ERB.new(source.read, nil, "-")
80
+ end.result(binding)
81
+ label = create_label(dest, contents)
82
+ puts "\t#{label} #{dest}"
83
+ if label == "conflict"
84
+ return unless overwrite?(dest)
85
+ end
86
+ File.write(dest, contents)
87
+ end
88
+
89
+ def file(source, dest)
90
+ label = create_label(dest, source.read)
91
+ puts "\t#{label} #{dest}"
92
+ if label == "conflict"
93
+ return unless overwrite?(dest)
94
+ end
95
+ FileUtils.cp(source, dest)
96
+ end
97
+
98
+ def prepare_parser
99
+ @parser = OptionParser.new
100
+ @parser.version = Fluent::VERSION
101
+ @parser.banner = <<BANNER
102
+ Usage: fluent-plugin-generate [options] <type> <name>
103
+
104
+ Generate a project skeleton for creating a Fluentd plugin
105
+
106
+ Arguments:
107
+ \ttype: #{SUPPORTED_TYPES.join(",")}
108
+ \tname: Your plugin name
109
+
110
+ Options:
111
+ BANNER
112
+
113
+ @parser.on("--[no-]license=NAME", "Specify license name (default: Apache-2.0)") do |v|
114
+ @license_name = v || "no-license"
115
+ end
116
+ @parser
117
+ end
118
+
119
+ def parse_options!
120
+ @parser.parse!(@argv)
121
+ unless @argv.size == 2
122
+ raise ArgumentError, "Missing arguments"
123
+ end
124
+ @type, @name = @argv
125
+ rescue => e
126
+ usage("#{e.class}:#{e.message}")
127
+ end
128
+
129
+ def usage(message = "")
130
+ puts message
131
+ puts
132
+ puts @parser.help
133
+ exit(false)
134
+ end
135
+
136
+ def user_name
137
+ v = `git config --get user.name`.chomp
138
+ v.empty? ? "TODO: Write your name" : v
139
+ end
140
+
141
+ def user_email
142
+ v = `git config --get user.email`.chomp
143
+ v.empty? ? "TODO: Write your email" : v
144
+ end
145
+
146
+ def gem_name
147
+ "fluent-plugin-#{dash_name}"
148
+ end
149
+
150
+ def plugin_name
151
+ underscore_name
152
+ end
153
+
154
+ def class_name
155
+ "#{capitalized_name}#{type.capitalize}"
156
+ end
157
+
158
+ def plugin_filename
159
+ case type
160
+ when "input"
161
+ "in_#{underscore_name}.rb"
162
+ when "output"
163
+ "out_#{underscore_name}.rb"
164
+ else
165
+ "#{type}_#{underscore_name}.rb"
166
+ end
167
+ end
168
+
169
+ def test_filename
170
+ case type
171
+ when "input"
172
+ "test_in_#{underscore_name}.rb"
173
+ when "output"
174
+ "test_out_#{underscore_name}.rb"
175
+ else
176
+ "test_#{type}_#{underscore_name}.rb"
177
+ end
178
+ end
179
+
180
+ def dest_filename(path)
181
+ case path.to_s
182
+ when %r!\.gemspec!
183
+ "#{gem_name}.gemspec"
184
+ when %r!lib/fluent/plugin!
185
+ plugin_filename
186
+ when %r!test/plugin!
187
+ test_filename
188
+ else
189
+ path.basename.sub_ext("")
190
+ end
191
+ end
192
+
193
+ def capitalized_name
194
+ @capitalized_name ||= name.split(/[-_]/).map(&:capitalize).join
195
+ end
196
+
197
+ def underscore_name
198
+ @underscore_name ||= name.tr("-", "_")
199
+ end
200
+
201
+ def dash_name
202
+ @dash_name ||= name.tr("_", "-")
203
+ end
204
+
205
+ def preamble
206
+ @license.preamble(user_name)
207
+ end
208
+
209
+ def copy_license
210
+ # in gem_name directory
211
+ return unless license_name
212
+ puts "License: #{license_name}"
213
+ license_class = self.class.lookup_license(license_name)
214
+ @license = license_class.new
215
+ Pathname("LICENSE").write(@license.text) unless @license.text.empty?
216
+ rescue Fluent::ConfigError
217
+ usage("Unknown license: #{license_name}")
218
+ rescue => ex
219
+ usage("#{ex.class}: #{ex.message}")
220
+ end
221
+
222
+ def create_label(dest, contents)
223
+ if dest.exist?
224
+ if dest.read == contents
225
+ "identical"
226
+ else
227
+ "conflict"
228
+ end
229
+ else
230
+ "create"
231
+ end
232
+ end
233
+
234
+ def overwrite?(dest)
235
+ return true if @overwrite_all
236
+ loop do
237
+ print "Overwrite #{dest}? (enter \"h\" for help) [Ynaqh]"
238
+ answer = $stdin.gets.chomp
239
+ return true if /\Ay\z/i =~ answer || answer.empty?
240
+ case answer
241
+ when "n"
242
+ return false
243
+ when "a"
244
+ @overwrite_all = true
245
+ return true
246
+ when "q"
247
+ exit
248
+ when "h"
249
+ puts <<HELP
250
+ \tY - yes, overwrite
251
+ \tn - no, do not overwrite
252
+ \ta - all, overwrite this and all others
253
+ \tq - quit, abort
254
+ \th - help, show this help
255
+ HELP
256
+ end
257
+ puts "Retrying..."
258
+ end
259
+ end
260
+
261
+ class NoLicense
262
+ attr_reader :name, :full_name, :text
263
+
264
+ def initialize
265
+ @name = ""
266
+ @full_name = ""
267
+ @text = ""
268
+ end
269
+
270
+ def preamble(usename)
271
+ ""
272
+ end
273
+ end
274
+
275
+ class ApacheLicense
276
+ LICENSE_URL = "http://www.apache.org/licenses/LICENSE-2.0.txt"
277
+
278
+ attr_reader :text
279
+
280
+ def initialize
281
+ @text = ""
282
+ @preamble_source = ""
283
+ @preamble = nil
284
+ open(LICENSE_URL) do |io|
285
+ @text = io.read
286
+ end
287
+ @preamble_source = @text[/^(\s*Copyright.+)/m, 1]
288
+ end
289
+
290
+ def name
291
+ "Apache-2.0"
292
+ end
293
+
294
+ def full_name
295
+ "Apache License, Version 2.0"
296
+ end
297
+
298
+ def preamble(user_name)
299
+ @preamble ||= @preamble_source.dup.tap do |source|
300
+ source.gsub!(/\[yyyy\]/, "#{Date.today.year}-")
301
+ source.gsub!(/\[name of copyright owner\]/, user_name)
302
+ source.gsub!(/^ {2}|^$/, "#")
303
+ source.chomp!
304
+ end
305
+ end
306
+ end
307
+
308
+ LICENSE_REGISTRY = Fluent::Registry.new(:license, "")
309
+
310
+ def self.register_license(license, klass)
311
+ LICENSE_REGISTRY.register(license, klass)
312
+ end
313
+
314
+ def self.lookup_license(license)
315
+ LICENSE_REGISTRY.lookup(license)
316
+ end
317
+
318
+ {
319
+ "no-license" => NoLicense,
320
+ "Apache-2.0" => ApacheLicense
321
+ }.each do |license, klass|
322
+ register_license(license, klass)
323
+ end
324
+ end
@@ -0,0 +1,67 @@
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 Compat
19
+ module CallSuperMixin
20
+ # This mixin is to prepend to 3rd party plugins of v0.12 APIs.
21
+ # In past, there were not strong rule to call super in #start, #before_shutdown and #shutdown.
22
+ # But v0.14 API requires to call super in these methods to setup/teardown plugin helpers and others.
23
+ # This mixin prepends method calls to call super forcedly if checker returns false (it shows Fluent::Plugin::Base#methods wasn't called)
24
+
25
+ def self.prepended(klass)
26
+ @@_super_start ||= {}
27
+ @@_super_before_shutdown ||= {}
28
+ @@_super_shutdown ||= {}
29
+
30
+ # ancestors[0]: this module
31
+ # ancestors[1]: prepended class (plugin itself)
32
+ method_search = ->(ancestors, method){
33
+ closest = ancestors[2, ancestors.size - 2].index{|m| m.method_defined?(method) }
34
+ ancestors[2 + closest].instance_method(method)
35
+ }
36
+ @@_super_start[klass] = method_search.call(klass.ancestors, :start) # this returns Fluent::Compat::*#start (or helpers on it)
37
+ @@_super_before_shutdown[klass] = method_search.call(klass.ancestors, :before_shutdown)
38
+ @@_super_shutdown[klass] = method_search.call(klass.ancestors, :shutdown)
39
+ end
40
+
41
+ def start
42
+ super
43
+ unless self.started?
44
+ @@_super_start[self.class].bind(self).call
45
+ # #super will reset logdev (especially in test), so this warn should be after calling it
46
+ log.warn "super was not called in #start: called it forcedly", plugin: self.class
47
+ end
48
+ end
49
+
50
+ def before_shutdown
51
+ super
52
+ unless self.before_shutdown?
53
+ log.warn "super was not called in #before_shutdown: calling it forcedly", plugin: self.class
54
+ @@_super_before_shutdown[self.class].bind(self).call
55
+ end
56
+ end
57
+
58
+ def shutdown
59
+ super
60
+ unless self.shutdown?
61
+ log.warn "super was not called in #shutdown: calling it forcedly", plugin: self.class
62
+ @@_super_shutdown[self.class].bind(self).call
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,33 @@
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 Compat
19
+ module DetachProcessMixin
20
+ def detach_process
21
+ log.warn "#{__method__} is not supported in this version. ignored."
22
+ yield
23
+ end
24
+ end
25
+
26
+ module DetachMultiProcessMixin
27
+ def detach_multi_process
28
+ log.warn "#{__method__} is not supported in this version. ignored."
29
+ yield
30
+ end
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,129 @@
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 'msgpack'
18
+ require 'yajl'
19
+
20
+ require 'fluent/engine'
21
+ require 'fluent/plugin'
22
+ require 'fluent/parser'
23
+
24
+ module Fluent
25
+ module Compat
26
+ module ExecUtil
27
+ SUPPORTED_FORMAT = {
28
+ 'tsv' => :tsv,
29
+ 'json' => :json,
30
+ 'msgpack' => :msgpack,
31
+ }
32
+
33
+ class Parser
34
+ def initialize(on_message)
35
+ @on_message = on_message
36
+ end
37
+ end
38
+
39
+ class TextParserWrapperParser < Parser
40
+ def initialize(conf, on_message)
41
+ @parser = Plugin.new_parser(conf['format'])
42
+ @parser.configure(conf)
43
+ super(on_message)
44
+ end
45
+
46
+ def call(io)
47
+ io.each_line(&method(:each_line))
48
+ end
49
+
50
+ def each_line(line)
51
+ line.chomp!
52
+ @parser.parse(line) { |time, record|
53
+ @on_message.call(record, time)
54
+ }
55
+ end
56
+ end
57
+
58
+ class TSVParser < Parser
59
+ def initialize(keys, on_message)
60
+ @keys = keys
61
+ super(on_message)
62
+ end
63
+
64
+ def call(io)
65
+ io.each_line(&method(:each_line))
66
+ end
67
+
68
+ def each_line(line)
69
+ line.chomp!
70
+ vals = line.split("\t")
71
+
72
+ record = Hash[@keys.zip(vals)]
73
+
74
+ @on_message.call(record)
75
+ end
76
+ end
77
+
78
+ class JSONParser < Parser
79
+ def call(io)
80
+ y = Yajl::Parser.new
81
+ y.on_parse_complete = @on_message
82
+ y.parse(io)
83
+ end
84
+ end
85
+
86
+ class MessagePackParser < Parser
87
+ def call(io)
88
+ @u = Fluent::Engine.msgpack_factory.unpacker(io)
89
+ begin
90
+ @u.each(&@on_message)
91
+ rescue EOFError
92
+ end
93
+ end
94
+ end
95
+
96
+ class Formatter
97
+ end
98
+
99
+ class TSVFormatter < Formatter
100
+ def initialize(in_keys)
101
+ @in_keys = in_keys
102
+ super()
103
+ end
104
+
105
+ def call(record, out)
106
+ last = @in_keys.length-1
107
+ for i in 0..last
108
+ key = @in_keys[i]
109
+ out << record[key].to_s
110
+ out << "\t" if i != last
111
+ end
112
+ out << "\n"
113
+ end
114
+ end
115
+
116
+ class JSONFormatter < Formatter
117
+ def call(record, out)
118
+ out << Yajl.dump(record) << "\n"
119
+ end
120
+ end
121
+
122
+ class MessagePackFormatter < Formatter
123
+ def call(record, out)
124
+ record.to_msgpack(out)
125
+ end
126
+ end
127
+ end
128
+ end
129
+ end
@@ -0,0 +1,54 @@
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 Compat
19
+ module FileUtil
20
+ # Check file is writable if file exists
21
+ # Check directory is writable if file does not exist
22
+ #
23
+ # @param [String] path File path
24
+ # @return [Boolean] file is writable or not
25
+ def writable?(path)
26
+ return false if File.directory?(path)
27
+ return File.writable?(path) if File.exist?(path)
28
+
29
+ dirname = File.dirname(path)
30
+ return false if !File.directory?(dirname)
31
+ File.writable?(dirname)
32
+ end
33
+ module_function :writable?
34
+
35
+ # Check file is writable in conjunction with mkdir_p(dirname(path))
36
+ #
37
+ # @param [String] path File path
38
+ # @return [Boolean] file writable or not
39
+ def writable_p?(path)
40
+ return false if File.directory?(path)
41
+ return File.writable?(path) if File.exist?(path)
42
+
43
+ dirname = File.dirname(path)
44
+ until File.exist?(dirname)
45
+ dirname = File.dirname(dirname)
46
+ end
47
+
48
+ return false if !File.directory?(dirname)
49
+ File.writable?(dirname)
50
+ end
51
+ module_function :writable_p?
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,68 @@
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'
18
+ require 'fluent/plugin/filter'
19
+ require 'fluent/compat/call_super_mixin'
20
+ require 'fluent/compat/formatter_utils'
21
+ require 'fluent/compat/parser_utils'
22
+
23
+ module Fluent
24
+ module Compat
25
+ class Filter < Fluent::Plugin::Filter
26
+ # TODO: warn when deprecated
27
+
28
+ helpers_internal :inject
29
+
30
+ def initialize
31
+ super
32
+ unless self.class.ancestors.include?(Fluent::Compat::CallSuperMixin)
33
+ self.class.prepend Fluent::Compat::CallSuperMixin
34
+ end
35
+ end
36
+
37
+ def configure(conf)
38
+ ParserUtils.convert_parser_conf(conf)
39
+ FormatterUtils.convert_formatter_conf(conf)
40
+
41
+ super
42
+ end
43
+
44
+ # These definitions are to get instance methods of superclass of 3rd party plugins
45
+ # to make it sure to call super
46
+ def start
47
+ super
48
+
49
+ if instance_variable_defined?(:@formatter) && @inject_config
50
+ unless @formatter.class.ancestors.include?(Fluent::Compat::HandleTagAndTimeMixin)
51
+ if @formatter.respond_to?(:owner) && !@formatter.owner
52
+ @formatter.owner = self
53
+ @formatter.singleton_class.prepend FormatterUtils::InjectMixin
54
+ end
55
+ end
56
+ end
57
+ end
58
+
59
+ def before_shutdown
60
+ super
61
+ end
62
+
63
+ def shutdown
64
+ super
65
+ end
66
+ end
67
+ end
68
+ end