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
data/lib/fluent/log.rb CHANGED
@@ -15,6 +15,7 @@
15
15
  #
16
16
 
17
17
  require 'forwardable'
18
+ require 'logger'
18
19
 
19
20
  module Fluent
20
21
  class Log
@@ -41,6 +42,14 @@ module Fluent
41
42
 
42
43
  LEVEL_TEXT = %w(trace debug info warn error fatal)
43
44
 
45
+ LOG_EVENT_TAG_PREFIX = 'fluent'
46
+ LOG_EVENT_LABEL = '@FLUENT_LOG'
47
+ LOG_TYPE_SUPERVISOR = :supervisor # only in supervisor, or a worker with --no-supervisor
48
+ LOG_TYPE_WORKER0 = :worker0 # only in a worker with worker_id=0 (without showing worker id)
49
+ LOG_TYPE_DEFAULT = :default # show logs in all supervisor/workers, with worker id in workers (default)
50
+
51
+ LOG_TYPES = [LOG_TYPE_SUPERVISOR, LOG_TYPE_WORKER0, LOG_TYPE_DEFAULT].freeze
52
+
44
53
  def self.str_to_level(log_level_str)
45
54
  case log_level_str.downcase
46
55
  when "trace" then LEVEL_TRACE
@@ -53,30 +62,146 @@ module Fluent
53
62
  end
54
63
  end
55
64
 
56
- def initialize(out=STDERR, level=LEVEL_TRACE, opts={})
57
- @out = out
58
- @level = level
65
+ def self.event_tags
66
+ LEVEL_TEXT.map{|t| "#{LOG_EVENT_TAG_PREFIX}.#{t}" }
67
+ end
68
+
69
+ def initialize(logger, opts={})
70
+ # overwrites logger.level= so that config reloading resets level of Fluentd::Log
71
+ orig_logger_level_setter = logger.class.public_instance_method(:level=).bind(logger)
72
+ me = self
73
+ # The original ruby logger sets the number as each log level like below.
74
+ # DEBUG = 0
75
+ # INFO = 1
76
+ # WARN = 2
77
+ # ERROR = 3
78
+ # FATAL = 4
79
+ # Serverengine use this original log number. In addition to this, serverengine sets -1 as TRACE level.
80
+ # TRACE = -1
81
+ #
82
+ # On the other hand, in fluentd side, it sets the number like below.
83
+ # TRACE = 0
84
+ # DEBUG = 1
85
+ # INFO = 2
86
+ # WARN = 3
87
+ # ERROR = 4
88
+ # FATAL = 5
89
+ #
90
+ # Then fluentd's level is set as serverengine's level + 1.
91
+ # So if serverengine's logger level is changed, fluentd's log level will be changed to that + 1.
92
+ logger.define_singleton_method(:level=) {|level| orig_logger_level_setter.call(level); me.level = self.level + 1 }
93
+
94
+ @logger = logger
95
+ @out = logger.instance_variable_get(:@logdev)
96
+ @level = logger.level + 1
59
97
  @debug_mode = false
60
- @self_event = false
61
- @tag = 'fluent'
62
- @time_format = '%Y-%m-%d %H:%M:%S %z '
98
+ @log_event_enabled = false
63
99
  @depth_offset = 1
100
+ @format = nil
101
+ @time_format = nil
102
+ @formatter = nil
103
+
104
+ self.format = :text
64
105
  enable_color out.tty?
65
106
  # TODO: This variable name is unclear so we should change to better name.
66
107
  @threads_exclude_events = []
67
108
 
68
109
  # Fluent::Engine requires Fluent::Log, so we must take that object lazily
69
110
  @engine = Fluent.const_get('Engine')
70
-
71
- if opts.has_key?(:suppress_repeated_stacktrace)
72
- @suppress_repeated_stacktrace = opts[:suppress_repeated_stacktrace]
111
+ @optional_header = nil
112
+ @optional_attrs = nil
113
+
114
+ @suppress_repeated_stacktrace = opts[:suppress_repeated_stacktrace]
115
+
116
+ @process_type = opts[:process_type] # :supervisor, :worker0, :workers Or :standalone
117
+ @process_type ||= :standalone # to keep behavior of existing code
118
+ case @process_type
119
+ when :supervisor
120
+ @show_supervisor_log = true
121
+ @show_worker0_log = false
122
+ when :worker0
123
+ @show_supervisor_log = false
124
+ @show_worker0_log = true
125
+ when :workers
126
+ @show_supervisor_log = false
127
+ @show_worker0_log = false
128
+ when :standalone
129
+ @show_supervisor_log = true
130
+ @show_worker0_log = true
131
+ else
132
+ raise "BUG: unknown process type for logger:#{@process_type}"
73
133
  end
134
+ @worker_id = opts[:worker_id]
135
+ @worker_id_part = "##{@worker_id} " # used only for :default log type in workers
74
136
  end
75
137
 
138
+ def dup
139
+ dl_opts = {}
140
+ dl_opts[:log_level] = @level - 1
141
+ logger = ServerEngine::DaemonLogger.new(@out, dl_opts)
142
+ clone = self.class.new(logger, suppress_repeated_stacktrace: @suppress_repeated_stacktrace, process_type: @process_type, worker_id: @worker_id)
143
+ clone.format = @format
144
+ clone.time_format = @time_format
145
+ clone.log_event_enabled = @log_event_enabled
146
+ # optional headers/attrs are not copied, because new PluginLogger should have another one of it
147
+ clone
148
+ end
149
+
150
+ attr_reader :format
151
+ attr_reader :time_format
152
+ attr_accessor :log_event_enabled
76
153
  attr_accessor :out
77
154
  attr_accessor :level
78
- attr_accessor :tag
79
- attr_accessor :time_format
155
+ attr_accessor :optional_header, :optional_attrs
156
+
157
+ def logdev=(logdev)
158
+ @out = logdev
159
+ @logger.instance_variable_set(:@logdev, logdev)
160
+ nil
161
+ end
162
+
163
+ def format=(fmt)
164
+ return if @format == fmt
165
+
166
+ @time_format = '%Y-%m-%d %H:%M:%S %z'
167
+ @time_formatter = Strftime.new(@time_format) rescue nil
168
+
169
+ case fmt
170
+ when :text
171
+ @format = :text
172
+ @formatter = Proc.new { |type, time, level, msg|
173
+ r = caller_line(type, time, @depth_offset, level)
174
+ r << msg
175
+ r
176
+ }
177
+ when :json
178
+ @format = :json
179
+ @formatter = Proc.new { |type, time, level, msg|
180
+ r = {
181
+ 'time' => format_time(time),
182
+ 'level' => LEVEL_TEXT[level],
183
+ 'message' => msg
184
+ }
185
+ if wid = get_worker_id(type)
186
+ r['worker_id'] = wid
187
+ end
188
+ Yajl.dump(r)
189
+ }
190
+ end
191
+
192
+ nil
193
+ end
194
+
195
+ def time_format=(time_fmt)
196
+ @time_format = time_fmt
197
+ @time_formatter = Strftime.new(@time_format) rescue nil
198
+ end
199
+
200
+ def reopen!
201
+ # do nothing in @logger.reopen! because it's already reopened in Supervisor.load_config
202
+ @logger.reopen! if @logger
203
+ nil
204
+ end
80
205
 
81
206
  def enable_debug(b=true)
82
207
  @debug_mode = b
@@ -84,10 +209,17 @@ module Fluent
84
209
  end
85
210
 
86
211
  def enable_event(b=true)
87
- @self_event = b
212
+ @log_event_enabled = b
88
213
  self
89
214
  end
90
215
 
216
+ # If you want to suppress event emitting in specific thread, please use this method.
217
+ # Events in passed thread are never emitted.
218
+ def disable_events(thread)
219
+ # this method is not symmetric with #enable_event.
220
+ @threads_exclude_events.push(thread) unless @threads_exclude_events.include?(thread)
221
+ end
222
+
91
223
  def enable_color?
92
224
  !@color_reset.empty?
93
225
  end
@@ -113,123 +245,151 @@ module Fluent
113
245
  self
114
246
  end
115
247
 
116
- # If you want to suppress event emitting in specific thread, please use this method.
117
- # Events in passed thread are never emitted.
118
- def disable_events(thread)
119
- @threads_exclude_events.push(thread) unless @threads_exclude_events.include?(thread)
248
+ def log_type(args)
249
+ if LOG_TYPES.include?(args.first)
250
+ args.shift
251
+ else
252
+ LOG_TYPE_DEFAULT
253
+ end
120
254
  end
121
255
 
122
- def on_trace(&block)
256
+ # TODO: skip :worker0 logs when Fluentd gracefully restarted
257
+ def skipped_type?(type)
258
+ case type
259
+ when LOG_TYPE_DEFAULT
260
+ false
261
+ when LOG_TYPE_WORKER0
262
+ !@show_worker0_log
263
+ when LOG_TYPE_SUPERVISOR
264
+ !@show_supervisor_log
265
+ else
266
+ raise "BUG: unknown log type:#{type}"
267
+ end
268
+ end
269
+
270
+ def on_trace
123
271
  return if @level > LEVEL_TRACE
124
- block.call if block
272
+ yield
125
273
  end
126
274
 
127
275
  def trace(*args, &block)
128
276
  return if @level > LEVEL_TRACE
277
+ type = log_type(args)
278
+ return if skipped_type?(type)
129
279
  args << block.call if block
130
280
  time, msg = event(:trace, args)
131
- puts [@color_trace, caller_line(time, @depth_offset, LEVEL_TRACE), msg, @color_reset].join
281
+ puts [@color_trace, @formatter.call(type, time, LEVEL_TRACE, msg), @color_reset].join
132
282
  rescue
133
283
  # logger should not raise an exception. This rescue prevents unexpected behaviour.
134
284
  end
135
285
  alias TRACE trace
136
286
 
137
- def trace_backtrace(backtrace=$!.backtrace)
138
- dump_stacktrace(backtrace, LEVEL_TRACE)
287
+ def trace_backtrace(backtrace=$!.backtrace, type: :default)
288
+ dump_stacktrace(type, backtrace, LEVEL_TRACE)
139
289
  end
140
290
 
141
- def on_debug(&block)
291
+ def on_debug
142
292
  return if @level > LEVEL_DEBUG
143
- block.call if block
293
+ yield
144
294
  end
145
295
 
146
296
  def debug(*args, &block)
147
297
  return if @level > LEVEL_DEBUG
298
+ type = log_type(args)
299
+ return if skipped_type?(type)
148
300
  args << block.call if block
149
301
  time, msg = event(:debug, args)
150
- puts [@color_debug, caller_line(time, @depth_offset, LEVEL_DEBUG), msg, @color_reset].join
302
+ puts [@color_debug, @formatter.call(type, time, LEVEL_DEBUG, msg), @color_reset].join
151
303
  rescue
152
304
  end
153
305
  alias DEBUG debug
154
306
 
155
- def debug_backtrace(backtrace=$!.backtrace)
156
- dump_stacktrace(backtrace, LEVEL_DEBUG)
307
+ def debug_backtrace(backtrace=$!.backtrace, type: :default)
308
+ dump_stacktrace(type, backtrace, LEVEL_DEBUG)
157
309
  end
158
310
 
159
- def on_info(&block)
311
+ def on_info
160
312
  return if @level > LEVEL_INFO
161
- block.call if block
313
+ yield
162
314
  end
163
315
 
164
316
  def info(*args, &block)
165
317
  return if @level > LEVEL_INFO
318
+ type = log_type(args)
319
+ return if skipped_type?(type)
166
320
  args << block.call if block
167
321
  time, msg = event(:info, args)
168
- puts [@color_info, caller_line(time, @depth_offset, LEVEL_INFO), msg, @color_reset].join
322
+ puts [@color_info, @formatter.call(type, time, LEVEL_INFO, msg), @color_reset].join
169
323
  rescue
170
324
  end
171
325
  alias INFO info
172
326
 
173
- def info_backtrace(backtrace=$!.backtrace)
174
- dump_stacktrace(backtrace, LEVEL_INFO)
327
+ def info_backtrace(backtrace=$!.backtrace, type: :default)
328
+ dump_stacktrace(type, backtrace, LEVEL_INFO)
175
329
  end
176
330
 
177
- def on_warn(&block)
331
+ def on_warn
178
332
  return if @level > LEVEL_WARN
179
- block.call if block
333
+ yield
180
334
  end
181
335
 
182
336
  def warn(*args, &block)
183
337
  return if @level > LEVEL_WARN
338
+ type = log_type(args)
339
+ return if skipped_type?(type)
184
340
  args << block.call if block
185
341
  time, msg = event(:warn, args)
186
- puts [@color_warn, caller_line(time, @depth_offset, LEVEL_WARN), msg, @color_reset].join
342
+ puts [@color_warn, @formatter.call(type, time, LEVEL_WARN, msg), @color_reset].join
187
343
  rescue
188
344
  end
189
345
  alias WARN warn
190
346
 
191
- def warn_backtrace(backtrace=$!.backtrace)
192
- dump_stacktrace(backtrace, LEVEL_WARN)
347
+ def warn_backtrace(backtrace=$!.backtrace, type: :default)
348
+ dump_stacktrace(type, backtrace, LEVEL_WARN)
193
349
  end
194
350
 
195
- def on_error(&block)
351
+ def on_error
196
352
  return if @level > LEVEL_ERROR
197
- block.call if block
353
+ yield
198
354
  end
199
355
 
200
356
  def error(*args, &block)
201
357
  return if @level > LEVEL_ERROR
358
+ type = log_type(args)
359
+ return if skipped_type?(type)
202
360
  args << block.call if block
203
361
  time, msg = event(:error, args)
204
- puts [@color_error, caller_line(time, @depth_offset, LEVEL_ERROR), msg, @color_reset].join
362
+ puts [@color_error, @formatter.call(type, time, LEVEL_ERROR, msg), @color_reset].join
205
363
  rescue
206
364
  end
207
365
  alias ERROR error
208
366
 
209
- def error_backtrace(backtrace=$!.backtrace)
210
- dump_stacktrace(backtrace, LEVEL_ERROR)
367
+ def error_backtrace(backtrace=$!.backtrace, type: :default)
368
+ dump_stacktrace(type, backtrace, LEVEL_ERROR)
211
369
  end
212
370
 
213
- def on_fatal(&block)
371
+ def on_fatal
214
372
  return if @level > LEVEL_FATAL
215
- block.call if block
373
+ yield
216
374
  end
217
375
 
218
376
  def fatal(*args, &block)
219
377
  return if @level > LEVEL_FATAL
378
+ type = log_type(args)
379
+ return if skipped_type?(type)
220
380
  args << block.call if block
221
381
  time, msg = event(:fatal, args)
222
- puts [@color_fatal, caller_line(time, @depth_offset, LEVEL_FATAL), msg, @color_reset].join
382
+ puts [@color_fatal, @formatter.call(type, time, LEVEL_FATAL, msg), @color_reset].join
223
383
  rescue
224
384
  end
225
385
  alias FATAL fatal
226
386
 
227
- def fatal_backtrace(backtrace=$!.backtrace)
228
- dump_stacktrace(backtrace, LEVEL_FATAL)
387
+ def fatal_backtrace(backtrace=$!.backtrace, type: :default)
388
+ dump_stacktrace(type, backtrace, LEVEL_FATAL)
229
389
  end
230
390
 
231
391
  def puts(msg)
232
- @out.puts(msg)
392
+ @logger << msg + "\n"
233
393
  @out.flush
234
394
  msg
235
395
  rescue
@@ -248,10 +408,59 @@ module Fluent
248
408
  @out.flush
249
409
  end
250
410
 
411
+ def reset
412
+ @out.reset if @out.respond_to?(:reset)
413
+ end
414
+
415
+ def dump_stacktrace(type, backtrace, level)
416
+ return if @level > level
417
+
418
+ time = Time.now
419
+
420
+ if @format == :text
421
+ line = caller_line(type, time, 5, level)
422
+ if @suppress_repeated_stacktrace && (Thread.current[:last_repeated_stacktrace] == backtrace)
423
+ puts [" ", line, 'suppressed same stacktrace'].join
424
+ else
425
+ backtrace.each { |msg|
426
+ puts [" ", line, msg].join
427
+ }
428
+ Thread.current[:last_repeated_stacktrace] = backtrace if @suppress_repeated_stacktrace
429
+ end
430
+ else
431
+ r = {
432
+ 'time' => format_time(time),
433
+ 'level' => LEVEL_TEXT[level],
434
+ }
435
+ if wid = get_worker_id(type)
436
+ r['worker_id'] = wid
437
+ end
438
+
439
+ if @suppress_repeated_stacktrace && (Thread.current[:last_repeated_stacktrace] == backtrace)
440
+ r['message'] = 'suppressed same stacktrace'
441
+ else
442
+ r['message'] = backtrace.join("\n")
443
+ Thread.current[:last_repeated_stacktrace] = backtrace if @suppress_repeated_stacktrace
444
+ end
445
+
446
+ puts Yajl.dump(r)
447
+ end
448
+
449
+ nil
450
+ end
451
+
452
+ def get_worker_id(type)
453
+ if type == :default && (@process_type == :worker0 || @process_type == :workers)
454
+ @worker_id
455
+ else
456
+ nil
457
+ end
458
+ end
459
+
251
460
  def event(level, args)
252
461
  time = Time.now
253
- message = ''
254
- map = {}
462
+ message = @optional_header ? @optional_header.dup : ''
463
+ map = @optional_attrs ? @optional_attrs.dup : {}
255
464
  args.each {|a|
256
465
  if a.is_a?(Hash)
257
466
  a.each_pair {|k,v|
@@ -263,23 +472,32 @@ module Fluent
263
472
  }
264
473
 
265
474
  map.each_pair {|k,v|
266
- message << " #{k}=#{v.inspect}"
475
+ if k == "error".freeze && v.is_a?(Exception) && !map.has_key?("error_class")
476
+ message << " error_class=#{v.class.to_s} error=#{v.to_s.inspect}"
477
+ else
478
+ message << " #{k}=#{v.inspect}"
479
+ end
267
480
  }
268
481
 
269
- unless @threads_exclude_events.include?(Thread.current)
482
+ if @log_event_enabled && !@threads_exclude_events.include?(Thread.current)
270
483
  record = map.dup
271
484
  record.keys.each {|key|
272
485
  record[key] = record[key].inspect unless record[key].respond_to?(:to_msgpack)
273
486
  }
274
487
  record['message'] = message.dup
275
- @engine.push_log_event("#{@tag}.#{level}", time.to_i, record)
488
+ @engine.push_log_event("#{LOG_EVENT_TAG_PREFIX}.#{level}", Fluent::EventTime.from_time(time), record)
276
489
  end
277
490
 
278
491
  return time, message
279
492
  end
280
493
 
281
- def caller_line(time, depth, level)
282
- log_msg = "#{time.strftime(@time_format)}[#{LEVEL_TEXT[level]}]: "
494
+ def caller_line(type, time, depth, level)
495
+ worker_id_part = if type == :default && (@process_type == :worker0 || @process_type == :workers)
496
+ @worker_id_part
497
+ else
498
+ "".freeze
499
+ end
500
+ log_msg = "#{format_time(time)} [#{LEVEL_TEXT[level]}]: #{worker_id_part}"
283
501
  if @debug_mode
284
502
  line = caller(depth+1)[0]
285
503
  if match = /^(.+?):(\d+)(?::in `(.*)')?/.match(line)
@@ -292,23 +510,8 @@ module Fluent
292
510
  return log_msg
293
511
  end
294
512
 
295
- private
296
-
297
- def dump_stacktrace(backtrace, level)
298
- return if @level > level
299
-
300
- time = Time.now
301
- line = caller_line(time, 5, level)
302
- if @suppress_repeated_stacktrace && (Thread.current[:last_repeated_stacktrace] == backtrace)
303
- puts [" ", line, 'suppressed same stacktrace'].join
304
- else
305
- backtrace.each { |msg|
306
- puts [" ", line, msg].join
307
- }
308
- Thread.current[:last_repeated_stacktrace] = backtrace if @suppress_repeated_stacktrace
309
- end
310
-
311
- nil
513
+ def format_time(time)
514
+ @time_formatter ? @time_formatter.exec(time) : time.strftime(@time_format)
312
515
  end
313
516
  end
314
517
 
@@ -317,14 +520,19 @@ module Fluent
317
520
  # This class enables log_level option in each plugin.
318
521
  #
319
522
  # PluginLogger has same functionality as Log but some methods are forwarded to internal logger
320
- # for keeping logging action consistency in the process, e.g. color, tag, event, etc.
523
+ # for keeping logging action consistency in the process, e.g. color, event, etc.
321
524
  class PluginLogger < Log
322
525
  def initialize(logger)
323
526
  @logger = logger
324
527
  @level = @logger.level
528
+ @format = nil
325
529
  @depth_offset = 2
326
- @suppress_repeated_stacktrace = logger.instance_variable_get(:@suppress_repeated_stacktrace)
530
+ if logger.instance_variable_defined?(:@suppress_repeated_stacktrace)
531
+ @suppress_repeated_stacktrace = logger.instance_variable_get(:@suppress_repeated_stacktrace)
532
+ end
327
533
 
534
+ self.format = @logger.format
535
+ self.time_format = @logger.time_format
328
536
  enable_color @logger.enable_color?
329
537
  end
330
538
 
@@ -332,17 +540,30 @@ module Fluent
332
540
  @level = Log.str_to_level(log_level_str)
333
541
  end
334
542
 
543
+ alias orig_format= format=
544
+ alias orig_time_format= time_format=
335
545
  alias orig_enable_color enable_color
336
546
 
547
+ def format=(fmt)
548
+ self.orig_format = fmt
549
+ @logger.format = fmt
550
+ end
551
+
552
+ def time_format=(fmt)
553
+ self.orig_time_format = fmt
554
+ @logger.time_format = fmt
555
+ end
556
+
337
557
  def enable_color(b = true)
338
558
  orig_enable_color b
339
559
  @logger.enable_color b
340
560
  end
341
561
 
342
562
  extend Forwardable
343
- def_delegators '@logger', :enable_color?, :enable_debug, :enable_event,
344
- :disable_events, :tag, :tag=, :time_format, :time_format=,
345
- :event, :caller_line, :puts, :write, :<<, :flush, :out, :out=
563
+ def_delegators '@logger', :get_worker_id, :enable_color?, :enable_debug, :enable_event,
564
+ :disable_events, :log_event_enabled, :log_event_enabled=, :event, :caller_line, :puts, :write,
565
+ :<<, :flush, :reset, :out, :out=, :optional_header, :optional_header=, :optional_attrs,
566
+ :optional_attrs=
346
567
  end
347
568
 
348
569
 
@@ -350,7 +571,7 @@ module Fluent
350
571
  def self.included(klass)
351
572
  klass.instance_eval {
352
573
  desc 'Allows the user to set different levels of logging for each plugin.'
353
- config_param :log_level, :string, default: nil, alias: :@log_level
574
+ config_param :@log_level, :string, default: nil, alias: :log_level # 'log_level' will be warned as deprecated
354
575
  }
355
576
  end
356
577
 
@@ -365,12 +586,58 @@ module Fluent
365
586
  def configure(conf)
366
587
  super
367
588
 
368
- if @log_level
369
- unless @log.is_a?(PluginLogger)
370
- @log = PluginLogger.new($log)
589
+ if plugin_id_configured? || conf['@log_level']
590
+ @log = PluginLogger.new($log.dup) unless @log.is_a?(PluginLogger)
591
+ @log.optional_attrs = {}
592
+
593
+ if level = conf['@log_level']
594
+ @log.level = level
371
595
  end
372
- @log.level = @log_level
596
+
597
+ if plugin_id_configured?
598
+ @log.optional_header = "[#{@id}] "
599
+ end
600
+ end
601
+ end
602
+
603
+ def terminate
604
+ super
605
+ @log.reset
606
+ end
607
+ end
608
+
609
+ # This class delegetes some methods which are used in `Fluent::Logger` to a instance variable(`dev`) in `Logger::LogDevice` class
610
+ # https://github.com/ruby/ruby/blob/7b2d47132ff8ee950b0f978ab772dee868d9f1b0/lib/logger.rb#L661
611
+ class LogDeviceIO < ::Logger::LogDevice
612
+ def flush
613
+ if @dev.respond_to?(:flush)
614
+ @dev.flush
615
+ else
616
+ super
617
+ end
618
+ end
619
+
620
+ def tty?
621
+ if @dev.respond_to?(:tty?)
622
+ @dev.tty?
623
+ else
624
+ super
625
+ end
626
+ end
627
+
628
+ def sync=(v)
629
+ if @dev.respond_to?(:sync=)
630
+ @dev.sync = v
631
+ else
632
+ super
633
+ end
634
+ end
635
+
636
+ def reopen(path, mode)
637
+ if mode != 'a'
638
+ raise "Unsupported mode: #{mode}"
373
639
  end
640
+ super(path)
374
641
  end
375
642
  end
376
643
  end