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,51 @@
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/formatter'
18
+ require 'fluent/time'
19
+ require 'yajl'
20
+
21
+ module Fluent
22
+ module Plugin
23
+ class OutFileFormatter < Formatter
24
+ Plugin.register_formatter('out_file', self)
25
+
26
+ config_param :output_time, :bool, default: true
27
+ config_param :output_tag, :bool, default: true
28
+ config_param :delimiter, default: "\t" do |val|
29
+ case val
30
+ when /SPACE/i then ' '
31
+ when /COMMA/i then ','
32
+ else "\t"
33
+ end
34
+ end
35
+ config_set_default :time_type, :string
36
+ config_set_default :time_format, nil # time_format nil => iso8601
37
+
38
+ def configure(conf)
39
+ super
40
+ @timef = time_formatter_create
41
+ end
42
+
43
+ def format(tag, time, record)
44
+ header = ''
45
+ header << "#{@timef.format(time)}#{@delimiter}" if @output_time
46
+ header << "#{tag}#{@delimiter}" if @output_tag
47
+ "#{header}#{Yajl.dump(record)}\n"
48
+ end
49
+ end
50
+ end
51
+ end
@@ -0,0 +1,34 @@
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/formatter'
18
+
19
+ module Fluent
20
+ module Plugin
21
+ class SingleValueFormatter < Formatter
22
+ Plugin.register_formatter('single_value', self)
23
+
24
+ config_param :message_key, :string, default: 'message'
25
+ config_param :add_newline, :bool, default: true
26
+
27
+ def format(tag, time, record)
28
+ text = record[@message_key].to_s.dup
29
+ text << "\n" if @add_newline
30
+ text
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,76 @@
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/formatter'
18
+
19
+ module Fluent
20
+ module Plugin
21
+ class StdoutFormatter < Formatter
22
+ Plugin.register_formatter('stdout', self)
23
+
24
+ TIME_FORMAT = '%Y-%m-%d %H:%M:%S.%N %z'
25
+
26
+ config_param :output_type, :string, default: 'json'
27
+
28
+ def configure(conf)
29
+ super
30
+
31
+ @time_formatter = Strftime.new(TIME_FORMAT)
32
+ @sub_formatter = Plugin.new_formatter(@output_type, parent: self.owner)
33
+ @sub_formatter.configure(conf)
34
+ end
35
+
36
+ def start
37
+ super
38
+ @sub_formatter.start
39
+ end
40
+
41
+ def format(tag, time, record)
42
+ "#{@time_formatter.exec(Time.at(time).localtime)} #{tag}: #{@sub_formatter.format(tag, time, record).chomp}\n"
43
+ end
44
+
45
+ def stop
46
+ @sub_formatter.stop
47
+ super
48
+ end
49
+
50
+ def before_shutdown
51
+ @sub_formatter.before_shutdown
52
+ super
53
+ end
54
+
55
+ def shutdown
56
+ @sub_formatter.shutdown
57
+ super
58
+ end
59
+
60
+ def after_shutdown
61
+ @sub_formatter.after_shutdown
62
+ super
63
+ end
64
+
65
+ def close
66
+ @sub_formatter.close
67
+ super
68
+ end
69
+
70
+ def terminate
71
+ @sub_formatter.terminate
72
+ super
73
+ end
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,38 @@
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/formatter'
18
+
19
+ module Fluent
20
+ module Plugin
21
+ class TSVFormatter < Formatter
22
+ Plugin.register_formatter('tsv', self)
23
+
24
+ desc 'Field names included in each lines'
25
+ config_param :keys, :array, value_type: :string
26
+ desc 'The delimiter character (or string) of TSV values'
27
+ config_param :delimiter, :string, default: "\t"
28
+ desc 'The parameter to enable writing to new lines'
29
+ config_param :add_newline, :bool, default: true
30
+
31
+ def format(tag, time, record)
32
+ formatted = @keys.map{|k| record[k].to_s }.join(@delimiter)
33
+ formatted << "\n".freeze if @add_newline
34
+ formatted
35
+ end
36
+ end
37
+ end
38
+ end
@@ -14,11 +14,11 @@
14
14
  # limitations under the License.
15
15
  #
16
16
 
17
- require 'fluent/input'
17
+ require 'fluent/plugin/input'
18
18
 
19
- module Fluent
19
+ module Fluent::Plugin
20
20
  class DebugAgentInput < Input
21
- Plugin.register_input('debug_agent', self)
21
+ Fluent::Plugin.register_input('debug_agent', self)
22
22
 
23
23
  def initialize
24
24
  require 'drb/drb'
@@ -30,31 +30,42 @@ module Fluent
30
30
  config_param :port, :integer, default: 24230
31
31
  config_param :unix_path, :string, default: nil
32
32
  #config_param :unix_mode # TODO
33
- config_param :object, :string, default: 'Engine'
33
+ config_param :object, :string, default: 'Fluent::Engine'
34
34
 
35
35
  def configure(conf)
36
36
  super
37
+ if system_config.workers > 1
38
+ @port += fluentd_worker_id
39
+ end
37
40
  if @unix_path
38
41
  unless ::Fluent::FileUtil.writable?(@unix_path)
39
- raise ConfigError, "in_debug_agent: `#{@unix_path}` is not writable"
42
+ raise Fluent::ConfigError, "in_debug_agent: `#{@unix_path}` is not writable"
40
43
  end
41
44
  end
42
45
  end
43
46
 
47
+ def multi_workers_ready?
48
+ @unix_path.nil?
49
+ end
50
+
44
51
  def start
52
+ super
53
+
45
54
  if @unix_path
46
55
  require 'drb/unix'
47
56
  uri = "drbunix:#{@unix_path}"
48
57
  else
49
58
  uri = "druby://#{@bind}:#{@port}"
50
59
  end
51
- log.info "listening dRuby", uri: uri, object: @object
60
+ log.info "listening dRuby", uri: uri, object: @object, worker: fluentd_worker_id
52
61
  obj = eval(@object)
53
62
  @server = DRb::DRbServer.new(uri, obj)
54
63
  end
55
64
 
56
65
  def shutdown
57
66
  @server.stop_service if @server
67
+
68
+ super
58
69
  end
59
70
  end
60
71
  end
@@ -16,30 +16,37 @@
16
16
 
17
17
  require 'json'
18
18
 
19
- require 'fluent/input'
19
+ require 'fluent/plugin/input'
20
20
  require 'fluent/config/error'
21
21
 
22
- module Fluent
22
+ module Fluent::Plugin
23
23
  class DummyInput < Input
24
24
  Fluent::Plugin.register_input('dummy', self)
25
25
 
26
+ helpers :thread, :storage
27
+
26
28
  BIN_NUM = 10
29
+ DEFAULT_STORAGE_TYPE = 'local'
27
30
 
28
31
  desc "The value is the tag assigned to the generated events."
29
32
  config_param :tag, :string
33
+ desc "The number of events in event stream of each emits."
34
+ config_param :size, :integer, default: 1
30
35
  desc "It configures how many events to generate per second."
31
36
  config_param :rate, :integer, default: 1
32
37
  desc "If specified, each generated event has an auto-incremented key field."
33
38
  config_param :auto_increment_key, :string, default: nil
39
+ desc "The boolean to suspend-and-resume incremental value after restart"
40
+ config_param :suspend, :bool, default: false
34
41
  desc "The dummy data to be generated. An array of JSON hashes or a single JSON hash."
35
42
  config_param :dummy, default: [{"message"=>"dummy"}] do |val|
36
43
  begin
37
44
  parsed = JSON.parse(val)
38
- rescue JSON::ParserError => e
45
+ rescue JSON::ParserError => ex
39
46
  # Fluent::ConfigParseError, "got incomplete JSON" will be raised
40
47
  # at literal_parser.rb with --use-v1-config, but I had to
41
48
  # take care at here for the case of --use-v0-config.
42
- raise Fluent::ConfigError, "#{e.class}: #{e.message}"
49
+ raise Fluent::ConfigError, "#{ex.class}: #{ex.message}"
43
50
  end
44
51
  dummy = parsed.is_a?(Array) ? parsed : [parsed]
45
52
  dummy.each_with_index do |e, i|
@@ -48,56 +55,76 @@ module Fluent
48
55
  dummy
49
56
  end
50
57
 
51
- def configure(conf)
58
+ def initialize
52
59
  super
60
+ @storage = nil
61
+ end
53
62
 
54
- @increment_value = 0
63
+ def configure(conf)
64
+ super
55
65
  @dummy_index = 0
66
+ config = conf.elements.select{|e| e.name == 'storage' }.first
67
+ @storage = storage_create(usage: 'suspend', conf: config, default_type: DEFAULT_STORAGE_TYPE)
68
+ end
69
+
70
+ def multi_workers_ready?
71
+ true
56
72
  end
57
73
 
58
74
  def start
59
75
  super
60
- @running = true
61
- @thread = Thread.new(&method(:run))
62
- end
63
76
 
64
- def shutdown
65
- @running = false
66
- @thread.join
77
+ @storage.put(:increment_value, 0) unless @storage.get(:increment_value)
78
+ @storage.put(:dummy_index, 0) unless @storage.get(:dummy_index)
79
+
80
+ if @auto_increment_key && !@storage.get(:auto_increment_value)
81
+ @storage.put(:auto_increment_value, -1)
82
+ end
83
+
84
+ thread_create(:dummy_input, &method(:run))
67
85
  end
68
86
 
69
87
  def run
70
88
  batch_num = (@rate / BIN_NUM).to_i
71
89
  residual_num = (@rate % BIN_NUM)
72
- while @running
90
+ while thread_current_running?
73
91
  current_time = Time.now.to_i
74
92
  BIN_NUM.times do
75
- break unless (@running && Time.now.to_i <= current_time)
93
+ break unless (thread_current_running? && Time.now.to_i <= current_time)
76
94
  wait(0.1) { emit(batch_num) }
77
95
  end
78
- emit(residual_num)
96
+ emit(residual_num) if thread_current_running?
79
97
  # wait for next second
80
- while @running && Time.now.to_i <= current_time
98
+ while thread_current_running? && Time.now.to_i <= current_time
81
99
  sleep 0.01
82
100
  end
83
101
  end
84
102
  end
85
103
 
86
104
  def emit(num)
87
- num.times { router.emit(@tag, Fluent::Engine.now, generate()) }
105
+ begin
106
+ if @size > 1
107
+ num.times do
108
+ router.emit_array(@tag, Array.new(@size) { [Fluent::Engine.now, generate] })
109
+ end
110
+ else
111
+ num.times { router.emit(@tag, Fluent::Engine.now, generate) }
112
+ end
113
+ rescue => _
114
+ # ignore all errors not to stop emits by emit errors
115
+ end
88
116
  end
89
117
 
90
118
  def generate
91
119
  d = @dummy[@dummy_index]
92
120
  unless d
93
121
  @dummy_index = 0
94
- d = @dummy[0]
122
+ d = @dummy[@dummy_index]
95
123
  end
96
124
  @dummy_index += 1
97
125
  if @auto_increment_key
98
126
  d = d.dup
99
- d[@auto_increment_key] = @increment_value
100
- @increment_value += 1
127
+ d[@auto_increment_key] = @storage.update(:auto_increment_value){|v| v + 1 }
101
128
  end
102
129
  d
103
130
  end
@@ -14,163 +14,95 @@
14
14
  # limitations under the License.
15
15
  #
16
16
 
17
+ require 'fluent/plugin/input'
17
18
  require 'yajl'
18
19
 
19
- require 'fluent/input'
20
- require 'fluent/time'
21
- require 'fluent/timezone'
22
- require 'fluent/config/error'
20
+ module Fluent::Plugin
21
+ class ExecInput < Fluent::Plugin::Input
22
+ Fluent::Plugin.register_input('exec', self)
23
23
 
24
- module Fluent
25
- class ExecInput < Input
26
- Plugin.register_input('exec', self)
27
-
28
- def initialize
29
- super
30
- require 'fluent/plugin/exec_util'
31
- end
24
+ helpers :compat_parameters, :extract, :parser, :child_process
32
25
 
33
26
  desc 'The command (program) to execute.'
34
27
  config_param :command, :string
35
- desc 'The format used to map the program output to the incoming event.(tsv,json,msgpack)'
36
- config_param :format, :string, default: 'tsv'
37
- desc 'Specify the comma-separated keys when using the tsv format.'
38
- config_param :keys, default: [] do |val|
39
- val.split(',')
28
+
29
+ config_section :parse do
30
+ config_set_default :@type, 'tsv'
31
+ config_set_default :time_type, :float
32
+ config_set_default :time_key, nil
33
+ config_set_default :estimate_current_event, false
34
+ end
35
+
36
+ config_section :extract do
37
+ config_set_default :time_type, :float
40
38
  end
39
+
41
40
  desc 'Tag of the output events.'
42
41
  config_param :tag, :string, default: nil
43
- desc 'The key to use as the event tag instead of the value in the event record. '
44
- config_param :tag_key, :string, default: nil
45
- desc 'The key to use as the event time instead of the value in the event record.'
46
- config_param :time_key, :string, default: nil
47
- desc 'The format of the event time used for the time_key parameter.'
48
- config_param :time_format, :string, default: nil
49
42
  desc 'The interval time between periodic program runs.'
50
43
  config_param :run_interval, :time, default: nil
44
+ desc 'The default block size to read if parser requires partial read.'
45
+ config_param :read_block_size, :size, default: 10240 # 10k
51
46
 
52
- def configure(conf)
53
- super
54
-
55
- if localtime = conf['localtime']
56
- @localtime = true
57
- elsif utc = conf['utc']
58
- @localtime = false
59
- end
47
+ attr_reader :parser
60
48
 
61
- if conf['timezone']
62
- @timezone = conf['timezone']
63
- Fluent::Timezone.validate!(@timezone)
49
+ def configure(conf)
50
+ compat_parameters_convert(conf, :extract, :parser)
51
+ ['parse', 'extract'].each do |subsection_name|
52
+ if subsection = conf.elements(subsection_name).first
53
+ if subsection.has_key?('time_format')
54
+ subsection['time_type'] ||= 'string'
55
+ end
56
+ end
64
57
  end
65
58
 
66
- if !@tag && !@tag_key
67
- raise ConfigError, "'tag' or 'tag_key' option is required on exec input"
68
- end
59
+ super
69
60
 
70
- if @time_key
71
- if @time_format
72
- f = @time_format
73
- @time_parse_proc = Proc.new {|str| Time.strptime(str, f).to_i }
74
- else
75
- @time_parse_proc = Proc.new {|str| str.to_i }
76
- end
61
+ if !@tag && (!@extract_config || !@extract_config.tag_key)
62
+ raise Fluent::ConfigError, "'tag' or 'tag_key' option is required on exec input"
77
63
  end
78
-
79
- @parser = setup_parser(conf)
64
+ @parser = parser_create
80
65
  end
81
66
 
82
- def setup_parser(conf)
83
- case @format
84
- when 'tsv'
85
- if @keys.empty?
86
- raise ConfigError, "keys option is required on exec input for tsv format"
87
- end
88
- ExecUtil::TSVParser.new(@keys, method(:on_message))
89
- when 'json'
90
- ExecUtil::JSONParser.new(method(:on_message))
91
- when 'msgpack'
92
- ExecUtil::MessagePackParser.new(method(:on_message))
93
- else
94
- ExecUtil::TextParserWrapperParser.new(conf, method(:on_message))
95
- end
67
+ def multi_workers_ready?
68
+ true
96
69
  end
97
70
 
98
71
  def start
99
- if @run_interval
100
- @finished = false
101
- @thread = Thread.new(&method(:run_periodic))
102
- else
103
- @io = IO.popen(@command, "r")
104
- @pid = @io.pid
105
- @thread = Thread.new(&method(:run))
106
- end
107
- end
72
+ super
108
73
 
109
- def shutdown
110
74
  if @run_interval
111
- @finished = true
112
- # call Thread#run which interupts sleep in order to stop run_periodic thread immediately.
113
- @thread.run
114
- @thread.join
75
+ child_process_execute(:exec_input, @command, interval: @run_interval, mode: [:read], &method(:run))
115
76
  else
116
- begin
117
- Process.kill(:TERM, @pid)
118
- rescue #Errno::ECHILD, Errno::ESRCH, Errno::EPERM
119
- end
120
- if @thread.join(60) # TODO wait time
121
- return
122
- end
123
-
124
- begin
125
- Process.kill(:KILL, @pid)
126
- rescue #Errno::ECHILD, Errno::ESRCH, Errno::EPERM
127
- end
128
- @thread.join
77
+ child_process_execute(:exec_input, @command, immediate: true, mode: [:read], &method(:run))
129
78
  end
130
79
  end
131
80
 
132
- def run
133
- @parser.call(@io)
134
- end
135
-
136
- def run_periodic
137
- sleep @run_interval
138
- until @finished
139
- begin
140
- io = IO.popen(@command, "r")
141
- @parser.call(io)
142
- Process.waitpid(io.pid)
143
- rescue
144
- log.error "exec failed to run or shutdown child process", error: $!.to_s, error_class: $!.class.to_s
145
- log.warn_backtrace $!.backtrace
146
- ensure
147
- sleep @run_interval
81
+ def run(io)
82
+ case
83
+ when @parser.implement?(:parse_io)
84
+ @parser.parse_io(io, &method(:on_record))
85
+ when @parser.implement?(:parse_partial_data)
86
+ until io.eof?
87
+ @parser.parse_partial_data(io.readpartial(@read_block_size), &method(:on_record))
148
88
  end
149
- end
150
- end
151
-
152
- private
153
-
154
- def on_message(record, parsed_time = nil)
155
- if val = record.delete(@tag_key)
156
- tag = val
157
- else
158
- tag = @tag
159
- end
160
-
161
- if parsed_time
162
- time = parsed_time
163
- else
164
- if val = record.delete(@time_key)
165
- time = @time_parse_proc.call(val)
166
- else
167
- time = Engine.now
89
+ when @parser.parser_type == :text_per_line
90
+ io.each_line do |line|
91
+ @parser.parse(line.chomp, &method(:on_record))
168
92
  end
93
+ else
94
+ @parser.parse(io.read, &method(:on_record))
169
95
  end
96
+ end
170
97
 
98
+ def on_record(time, record)
99
+ tag = extract_tag_from_record(record)
100
+ tag ||= @tag
101
+ time ||= extract_time_from_record(record) || Fluent::EventTime.now
171
102
  router.emit(tag, time, record)
172
103
  rescue => e
173
- log.error "exec failed to emit", error: e.to_s, error_class: e.class.to_s, tag: tag, record: Yajl.dump(record)
104
+ log.error "exec failed to emit", tag: tag, record: Yajl.dump(record), error: e
105
+ router.emit_error_event(tag, time, record, e) if tag && time && record
174
106
  end
175
107
  end
176
108
  end