fluentd 1.14.4-x64-mingw-ucrt

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 (558) hide show
  1. checksums.yaml +7 -0
  2. data/.deepsource.toml +13 -0
  3. data/.drone.yml +35 -0
  4. data/.github/ISSUE_TEMPLATE/bug_report.yaml +70 -0
  5. data/.github/ISSUE_TEMPLATE/config.yml +5 -0
  6. data/.github/ISSUE_TEMPLATE/feature_request.yaml +38 -0
  7. data/.github/ISSUE_TEMPLATE.md +17 -0
  8. data/.github/PULL_REQUEST_TEMPLATE.md +14 -0
  9. data/.github/workflows/issue-auto-closer.yml +12 -0
  10. data/.github/workflows/linux-test.yaml +36 -0
  11. data/.github/workflows/macos-test.yaml +30 -0
  12. data/.github/workflows/stale-actions.yml +22 -0
  13. data/.github/workflows/windows-test.yaml +46 -0
  14. data/.gitignore +30 -0
  15. data/.gitlab-ci.yml +103 -0
  16. data/ADOPTERS.md +5 -0
  17. data/AUTHORS +2 -0
  18. data/CHANGELOG.md +2409 -0
  19. data/CONTRIBUTING.md +45 -0
  20. data/GOVERNANCE.md +55 -0
  21. data/Gemfile +9 -0
  22. data/GithubWorkflow.md +78 -0
  23. data/LICENSE +202 -0
  24. data/MAINTAINERS.md +11 -0
  25. data/README.md +97 -0
  26. data/Rakefile +79 -0
  27. data/SECURITY.md +18 -0
  28. data/bin/fluent-binlog-reader +7 -0
  29. data/bin/fluent-ca-generate +6 -0
  30. data/bin/fluent-cap-ctl +7 -0
  31. data/bin/fluent-cat +5 -0
  32. data/bin/fluent-ctl +7 -0
  33. data/bin/fluent-debug +5 -0
  34. data/bin/fluent-gem +9 -0
  35. data/bin/fluent-plugin-config-format +5 -0
  36. data/bin/fluent-plugin-generate +5 -0
  37. data/bin/fluentd +15 -0
  38. data/code-of-conduct.md +3 -0
  39. data/docs/SECURITY_AUDIT.pdf +0 -0
  40. data/example/copy_roundrobin.conf +39 -0
  41. data/example/counter.conf +18 -0
  42. data/example/filter_stdout.conf +22 -0
  43. data/example/in_forward.conf +14 -0
  44. data/example/in_forward_client.conf +37 -0
  45. data/example/in_forward_shared_key.conf +15 -0
  46. data/example/in_forward_tls.conf +14 -0
  47. data/example/in_forward_users.conf +24 -0
  48. data/example/in_forward_workers.conf +21 -0
  49. data/example/in_http.conf +16 -0
  50. data/example/in_out_forward.conf +17 -0
  51. data/example/in_sample_blocks.conf +17 -0
  52. data/example/in_sample_with_compression.conf +23 -0
  53. data/example/in_syslog.conf +15 -0
  54. data/example/in_tail.conf +14 -0
  55. data/example/in_tcp.conf +13 -0
  56. data/example/in_udp.conf +13 -0
  57. data/example/logevents.conf +25 -0
  58. data/example/multi_filters.conf +61 -0
  59. data/example/out_copy.conf +20 -0
  60. data/example/out_exec_filter.conf +42 -0
  61. data/example/out_file.conf +13 -0
  62. data/example/out_forward.conf +35 -0
  63. data/example/out_forward_buf_file.conf +23 -0
  64. data/example/out_forward_client.conf +109 -0
  65. data/example/out_forward_heartbeat_none.conf +16 -0
  66. data/example/out_forward_sd.conf +17 -0
  67. data/example/out_forward_shared_key.conf +36 -0
  68. data/example/out_forward_tls.conf +18 -0
  69. data/example/out_forward_users.conf +65 -0
  70. data/example/out_null.conf +36 -0
  71. data/example/sd.yaml +8 -0
  72. data/example/secondary_file.conf +42 -0
  73. data/example/suppress_config_dump.conf +7 -0
  74. data/example/v0_12_filter.conf +78 -0
  75. data/example/v1_literal_example.conf +36 -0
  76. data/example/worker_section.conf +36 -0
  77. data/fluent.conf +139 -0
  78. data/fluentd.gemspec +55 -0
  79. data/lib/fluent/agent.rb +168 -0
  80. data/lib/fluent/capability.rb +87 -0
  81. data/lib/fluent/clock.rb +66 -0
  82. data/lib/fluent/command/binlog_reader.rb +244 -0
  83. data/lib/fluent/command/bundler_injection.rb +45 -0
  84. data/lib/fluent/command/ca_generate.rb +184 -0
  85. data/lib/fluent/command/cap_ctl.rb +174 -0
  86. data/lib/fluent/command/cat.rb +365 -0
  87. data/lib/fluent/command/ctl.rb +177 -0
  88. data/lib/fluent/command/debug.rb +103 -0
  89. data/lib/fluent/command/fluentd.rb +374 -0
  90. data/lib/fluent/command/plugin_config_formatter.rb +308 -0
  91. data/lib/fluent/command/plugin_generator.rb +365 -0
  92. data/lib/fluent/compat/call_super_mixin.rb +76 -0
  93. data/lib/fluent/compat/detach_process_mixin.rb +33 -0
  94. data/lib/fluent/compat/exec_util.rb +129 -0
  95. data/lib/fluent/compat/file_util.rb +54 -0
  96. data/lib/fluent/compat/filter.rb +68 -0
  97. data/lib/fluent/compat/formatter.rb +111 -0
  98. data/lib/fluent/compat/formatter_utils.rb +85 -0
  99. data/lib/fluent/compat/handle_tag_and_time_mixin.rb +62 -0
  100. data/lib/fluent/compat/handle_tag_name_mixin.rb +53 -0
  101. data/lib/fluent/compat/input.rb +49 -0
  102. data/lib/fluent/compat/output.rb +721 -0
  103. data/lib/fluent/compat/output_chain.rb +60 -0
  104. data/lib/fluent/compat/parser.rb +310 -0
  105. data/lib/fluent/compat/parser_utils.rb +40 -0
  106. data/lib/fluent/compat/propagate_default.rb +62 -0
  107. data/lib/fluent/compat/record_filter_mixin.rb +34 -0
  108. data/lib/fluent/compat/set_tag_key_mixin.rb +50 -0
  109. data/lib/fluent/compat/set_time_key_mixin.rb +69 -0
  110. data/lib/fluent/compat/socket_util.rb +165 -0
  111. data/lib/fluent/compat/string_util.rb +34 -0
  112. data/lib/fluent/compat/structured_format_mixin.rb +26 -0
  113. data/lib/fluent/compat/type_converter.rb +90 -0
  114. data/lib/fluent/config/basic_parser.rb +123 -0
  115. data/lib/fluent/config/configure_proxy.rb +424 -0
  116. data/lib/fluent/config/dsl.rb +152 -0
  117. data/lib/fluent/config/element.rb +265 -0
  118. data/lib/fluent/config/error.rb +32 -0
  119. data/lib/fluent/config/literal_parser.rb +286 -0
  120. data/lib/fluent/config/parser.rb +107 -0
  121. data/lib/fluent/config/section.rb +272 -0
  122. data/lib/fluent/config/types.rb +249 -0
  123. data/lib/fluent/config/v1_parser.rb +192 -0
  124. data/lib/fluent/config.rb +76 -0
  125. data/lib/fluent/configurable.rb +201 -0
  126. data/lib/fluent/counter/base_socket.rb +44 -0
  127. data/lib/fluent/counter/client.rb +297 -0
  128. data/lib/fluent/counter/error.rb +86 -0
  129. data/lib/fluent/counter/mutex_hash.rb +163 -0
  130. data/lib/fluent/counter/server.rb +273 -0
  131. data/lib/fluent/counter/store.rb +205 -0
  132. data/lib/fluent/counter/validator.rb +145 -0
  133. data/lib/fluent/counter.rb +23 -0
  134. data/lib/fluent/daemon.rb +15 -0
  135. data/lib/fluent/daemonizer.rb +88 -0
  136. data/lib/fluent/engine.rb +253 -0
  137. data/lib/fluent/env.rb +40 -0
  138. data/lib/fluent/error.rb +34 -0
  139. data/lib/fluent/event.rb +326 -0
  140. data/lib/fluent/event_router.rb +297 -0
  141. data/lib/fluent/ext_monitor_require.rb +28 -0
  142. data/lib/fluent/filter.rb +21 -0
  143. data/lib/fluent/fluent_log_event_router.rb +141 -0
  144. data/lib/fluent/formatter.rb +23 -0
  145. data/lib/fluent/input.rb +21 -0
  146. data/lib/fluent/label.rb +46 -0
  147. data/lib/fluent/load.rb +34 -0
  148. data/lib/fluent/log.rb +713 -0
  149. data/lib/fluent/match.rb +187 -0
  150. data/lib/fluent/mixin.rb +31 -0
  151. data/lib/fluent/msgpack_factory.rb +106 -0
  152. data/lib/fluent/oj_options.rb +62 -0
  153. data/lib/fluent/output.rb +29 -0
  154. data/lib/fluent/output_chain.rb +23 -0
  155. data/lib/fluent/parser.rb +23 -0
  156. data/lib/fluent/plugin/bare_output.rb +104 -0
  157. data/lib/fluent/plugin/base.rb +197 -0
  158. data/lib/fluent/plugin/buf_file.rb +213 -0
  159. data/lib/fluent/plugin/buf_file_single.rb +225 -0
  160. data/lib/fluent/plugin/buf_memory.rb +34 -0
  161. data/lib/fluent/plugin/buffer/chunk.rb +240 -0
  162. data/lib/fluent/plugin/buffer/file_chunk.rb +413 -0
  163. data/lib/fluent/plugin/buffer/file_single_chunk.rb +311 -0
  164. data/lib/fluent/plugin/buffer/memory_chunk.rb +91 -0
  165. data/lib/fluent/plugin/buffer.rb +918 -0
  166. data/lib/fluent/plugin/compressable.rb +96 -0
  167. data/lib/fluent/plugin/exec_util.rb +22 -0
  168. data/lib/fluent/plugin/file_util.rb +22 -0
  169. data/lib/fluent/plugin/file_wrapper.rb +187 -0
  170. data/lib/fluent/plugin/filter.rb +127 -0
  171. data/lib/fluent/plugin/filter_grep.rb +189 -0
  172. data/lib/fluent/plugin/filter_parser.rb +130 -0
  173. data/lib/fluent/plugin/filter_record_transformer.rb +324 -0
  174. data/lib/fluent/plugin/filter_stdout.rb +53 -0
  175. data/lib/fluent/plugin/formatter.rb +75 -0
  176. data/lib/fluent/plugin/formatter_csv.rb +78 -0
  177. data/lib/fluent/plugin/formatter_hash.rb +35 -0
  178. data/lib/fluent/plugin/formatter_json.rb +59 -0
  179. data/lib/fluent/plugin/formatter_ltsv.rb +44 -0
  180. data/lib/fluent/plugin/formatter_msgpack.rb +33 -0
  181. data/lib/fluent/plugin/formatter_out_file.rb +53 -0
  182. data/lib/fluent/plugin/formatter_single_value.rb +36 -0
  183. data/lib/fluent/plugin/formatter_stdout.rb +76 -0
  184. data/lib/fluent/plugin/formatter_tsv.rb +40 -0
  185. data/lib/fluent/plugin/in_debug_agent.rb +71 -0
  186. data/lib/fluent/plugin/in_dummy.rb +18 -0
  187. data/lib/fluent/plugin/in_exec.rb +110 -0
  188. data/lib/fluent/plugin/in_forward.rb +473 -0
  189. data/lib/fluent/plugin/in_gc_stat.rb +72 -0
  190. data/lib/fluent/plugin/in_http.rb +667 -0
  191. data/lib/fluent/plugin/in_monitor_agent.rb +412 -0
  192. data/lib/fluent/plugin/in_object_space.rb +93 -0
  193. data/lib/fluent/plugin/in_sample.rb +141 -0
  194. data/lib/fluent/plugin/in_syslog.rb +276 -0
  195. data/lib/fluent/plugin/in_tail/position_file.rb +269 -0
  196. data/lib/fluent/plugin/in_tail.rb +1228 -0
  197. data/lib/fluent/plugin/in_tcp.rb +181 -0
  198. data/lib/fluent/plugin/in_udp.rb +92 -0
  199. data/lib/fluent/plugin/in_unix.rb +195 -0
  200. data/lib/fluent/plugin/input.rb +75 -0
  201. data/lib/fluent/plugin/metrics.rb +119 -0
  202. data/lib/fluent/plugin/metrics_local.rb +96 -0
  203. data/lib/fluent/plugin/multi_output.rb +195 -0
  204. data/lib/fluent/plugin/out_copy.rb +120 -0
  205. data/lib/fluent/plugin/out_exec.rb +105 -0
  206. data/lib/fluent/plugin/out_exec_filter.rb +319 -0
  207. data/lib/fluent/plugin/out_file.rb +334 -0
  208. data/lib/fluent/plugin/out_forward/ack_handler.rb +161 -0
  209. data/lib/fluent/plugin/out_forward/connection_manager.rb +113 -0
  210. data/lib/fluent/plugin/out_forward/error.rb +28 -0
  211. data/lib/fluent/plugin/out_forward/failure_detector.rb +84 -0
  212. data/lib/fluent/plugin/out_forward/handshake_protocol.rb +125 -0
  213. data/lib/fluent/plugin/out_forward/load_balancer.rb +114 -0
  214. data/lib/fluent/plugin/out_forward/socket_cache.rb +140 -0
  215. data/lib/fluent/plugin/out_forward.rb +826 -0
  216. data/lib/fluent/plugin/out_http.rb +275 -0
  217. data/lib/fluent/plugin/out_null.rb +74 -0
  218. data/lib/fluent/plugin/out_relabel.rb +32 -0
  219. data/lib/fluent/plugin/out_roundrobin.rb +84 -0
  220. data/lib/fluent/plugin/out_secondary_file.rb +131 -0
  221. data/lib/fluent/plugin/out_stdout.rb +74 -0
  222. data/lib/fluent/plugin/out_stream.rb +130 -0
  223. data/lib/fluent/plugin/output.rb +1556 -0
  224. data/lib/fluent/plugin/owned_by_mixin.rb +42 -0
  225. data/lib/fluent/plugin/parser.rb +275 -0
  226. data/lib/fluent/plugin/parser_apache.rb +28 -0
  227. data/lib/fluent/plugin/parser_apache2.rb +88 -0
  228. data/lib/fluent/plugin/parser_apache_error.rb +26 -0
  229. data/lib/fluent/plugin/parser_csv.rb +114 -0
  230. data/lib/fluent/plugin/parser_json.rb +96 -0
  231. data/lib/fluent/plugin/parser_ltsv.rb +51 -0
  232. data/lib/fluent/plugin/parser_msgpack.rb +50 -0
  233. data/lib/fluent/plugin/parser_multiline.rb +152 -0
  234. data/lib/fluent/plugin/parser_nginx.rb +28 -0
  235. data/lib/fluent/plugin/parser_none.rb +36 -0
  236. data/lib/fluent/plugin/parser_regexp.rb +68 -0
  237. data/lib/fluent/plugin/parser_syslog.rb +496 -0
  238. data/lib/fluent/plugin/parser_tsv.rb +42 -0
  239. data/lib/fluent/plugin/sd_file.rb +156 -0
  240. data/lib/fluent/plugin/sd_srv.rb +135 -0
  241. data/lib/fluent/plugin/sd_static.rb +58 -0
  242. data/lib/fluent/plugin/service_discovery.rb +65 -0
  243. data/lib/fluent/plugin/socket_util.rb +22 -0
  244. data/lib/fluent/plugin/storage.rb +84 -0
  245. data/lib/fluent/plugin/storage_local.rb +162 -0
  246. data/lib/fluent/plugin/string_util.rb +22 -0
  247. data/lib/fluent/plugin.rb +206 -0
  248. data/lib/fluent/plugin_helper/cert_option.rb +191 -0
  249. data/lib/fluent/plugin_helper/child_process.rb +366 -0
  250. data/lib/fluent/plugin_helper/compat_parameters.rb +343 -0
  251. data/lib/fluent/plugin_helper/counter.rb +51 -0
  252. data/lib/fluent/plugin_helper/event_emitter.rb +100 -0
  253. data/lib/fluent/plugin_helper/event_loop.rb +170 -0
  254. data/lib/fluent/plugin_helper/extract.rb +104 -0
  255. data/lib/fluent/plugin_helper/formatter.rb +147 -0
  256. data/lib/fluent/plugin_helper/http_server/app.rb +79 -0
  257. data/lib/fluent/plugin_helper/http_server/compat/server.rb +92 -0
  258. data/lib/fluent/plugin_helper/http_server/compat/ssl_context_extractor.rb +52 -0
  259. data/lib/fluent/plugin_helper/http_server/compat/webrick_handler.rb +58 -0
  260. data/lib/fluent/plugin_helper/http_server/methods.rb +35 -0
  261. data/lib/fluent/plugin_helper/http_server/request.rb +42 -0
  262. data/lib/fluent/plugin_helper/http_server/router.rb +54 -0
  263. data/lib/fluent/plugin_helper/http_server/server.rb +93 -0
  264. data/lib/fluent/plugin_helper/http_server/ssl_context_builder.rb +41 -0
  265. data/lib/fluent/plugin_helper/http_server.rb +135 -0
  266. data/lib/fluent/plugin_helper/inject.rb +154 -0
  267. data/lib/fluent/plugin_helper/metrics.rb +129 -0
  268. data/lib/fluent/plugin_helper/parser.rb +147 -0
  269. data/lib/fluent/plugin_helper/record_accessor.rb +207 -0
  270. data/lib/fluent/plugin_helper/retry_state.rb +209 -0
  271. data/lib/fluent/plugin_helper/server.rb +801 -0
  272. data/lib/fluent/plugin_helper/service_discovery/manager.rb +146 -0
  273. data/lib/fluent/plugin_helper/service_discovery/round_robin_balancer.rb +43 -0
  274. data/lib/fluent/plugin_helper/service_discovery.rb +125 -0
  275. data/lib/fluent/plugin_helper/socket.rb +277 -0
  276. data/lib/fluent/plugin_helper/socket_option.rb +98 -0
  277. data/lib/fluent/plugin_helper/storage.rb +349 -0
  278. data/lib/fluent/plugin_helper/thread.rb +180 -0
  279. data/lib/fluent/plugin_helper/timer.rb +92 -0
  280. data/lib/fluent/plugin_helper.rb +75 -0
  281. data/lib/fluent/plugin_id.rb +93 -0
  282. data/lib/fluent/process.rb +22 -0
  283. data/lib/fluent/registry.rb +116 -0
  284. data/lib/fluent/root_agent.rb +372 -0
  285. data/lib/fluent/rpc.rb +94 -0
  286. data/lib/fluent/static_config_analysis.rb +194 -0
  287. data/lib/fluent/supervisor.rb +1054 -0
  288. data/lib/fluent/system_config.rb +187 -0
  289. data/lib/fluent/test/base.rb +78 -0
  290. data/lib/fluent/test/driver/base.rb +225 -0
  291. data/lib/fluent/test/driver/base_owned.rb +83 -0
  292. data/lib/fluent/test/driver/base_owner.rb +135 -0
  293. data/lib/fluent/test/driver/event_feeder.rb +98 -0
  294. data/lib/fluent/test/driver/filter.rb +57 -0
  295. data/lib/fluent/test/driver/formatter.rb +30 -0
  296. data/lib/fluent/test/driver/input.rb +31 -0
  297. data/lib/fluent/test/driver/multi_output.rb +53 -0
  298. data/lib/fluent/test/driver/output.rb +102 -0
  299. data/lib/fluent/test/driver/parser.rb +30 -0
  300. data/lib/fluent/test/driver/storage.rb +30 -0
  301. data/lib/fluent/test/driver/test_event_router.rb +45 -0
  302. data/lib/fluent/test/filter_test.rb +77 -0
  303. data/lib/fluent/test/formatter_test.rb +65 -0
  304. data/lib/fluent/test/helpers.rb +134 -0
  305. data/lib/fluent/test/input_test.rb +174 -0
  306. data/lib/fluent/test/log.rb +79 -0
  307. data/lib/fluent/test/output_test.rb +156 -0
  308. data/lib/fluent/test/parser_test.rb +70 -0
  309. data/lib/fluent/test/startup_shutdown.rb +46 -0
  310. data/lib/fluent/test.rb +58 -0
  311. data/lib/fluent/time.rb +512 -0
  312. data/lib/fluent/timezone.rb +171 -0
  313. data/lib/fluent/tls.rb +81 -0
  314. data/lib/fluent/unique_id.rb +39 -0
  315. data/lib/fluent/variable_store.rb +40 -0
  316. data/lib/fluent/version.rb +21 -0
  317. data/lib/fluent/winsvc.rb +103 -0
  318. data/templates/new_gem/Gemfile +3 -0
  319. data/templates/new_gem/README.md.erb +43 -0
  320. data/templates/new_gem/Rakefile +13 -0
  321. data/templates/new_gem/fluent-plugin.gemspec.erb +27 -0
  322. data/templates/new_gem/lib/fluent/plugin/filter.rb.erb +14 -0
  323. data/templates/new_gem/lib/fluent/plugin/formatter.rb.erb +14 -0
  324. data/templates/new_gem/lib/fluent/plugin/input.rb.erb +11 -0
  325. data/templates/new_gem/lib/fluent/plugin/output.rb.erb +11 -0
  326. data/templates/new_gem/lib/fluent/plugin/parser.rb.erb +15 -0
  327. data/templates/new_gem/lib/fluent/plugin/storage.rb.erb +40 -0
  328. data/templates/new_gem/test/helper.rb.erb +8 -0
  329. data/templates/new_gem/test/plugin/test_filter.rb.erb +18 -0
  330. data/templates/new_gem/test/plugin/test_formatter.rb.erb +18 -0
  331. data/templates/new_gem/test/plugin/test_input.rb.erb +18 -0
  332. data/templates/new_gem/test/plugin/test_output.rb.erb +18 -0
  333. data/templates/new_gem/test/plugin/test_parser.rb.erb +18 -0
  334. data/templates/new_gem/test/plugin/test_storage.rb.erb +18 -0
  335. data/templates/plugin_config_formatter/param.md-compact.erb +25 -0
  336. data/templates/plugin_config_formatter/param.md-table.erb +10 -0
  337. data/templates/plugin_config_formatter/param.md.erb +34 -0
  338. data/templates/plugin_config_formatter/section.md.erb +12 -0
  339. data/test/command/test_binlog_reader.rb +362 -0
  340. data/test/command/test_ca_generate.rb +70 -0
  341. data/test/command/test_cap_ctl.rb +100 -0
  342. data/test/command/test_cat.rb +128 -0
  343. data/test/command/test_ctl.rb +57 -0
  344. data/test/command/test_fluentd.rb +1106 -0
  345. data/test/command/test_plugin_config_formatter.rb +398 -0
  346. data/test/command/test_plugin_generator.rb +109 -0
  347. data/test/compat/test_calls_super.rb +166 -0
  348. data/test/compat/test_parser.rb +92 -0
  349. data/test/config/assertions.rb +42 -0
  350. data/test/config/test_config_parser.rb +551 -0
  351. data/test/config/test_configurable.rb +1784 -0
  352. data/test/config/test_configure_proxy.rb +604 -0
  353. data/test/config/test_dsl.rb +415 -0
  354. data/test/config/test_element.rb +518 -0
  355. data/test/config/test_literal_parser.rb +309 -0
  356. data/test/config/test_plugin_configuration.rb +56 -0
  357. data/test/config/test_section.rb +191 -0
  358. data/test/config/test_system_config.rb +199 -0
  359. data/test/config/test_types.rb +408 -0
  360. data/test/counter/test_client.rb +563 -0
  361. data/test/counter/test_error.rb +44 -0
  362. data/test/counter/test_mutex_hash.rb +179 -0
  363. data/test/counter/test_server.rb +589 -0
  364. data/test/counter/test_store.rb +258 -0
  365. data/test/counter/test_validator.rb +137 -0
  366. data/test/helper.rb +155 -0
  367. data/test/helpers/fuzzy_assert.rb +89 -0
  368. data/test/helpers/process_extenstion.rb +33 -0
  369. data/test/plugin/data/2010/01/20100102-030405.log +0 -0
  370. data/test/plugin/data/2010/01/20100102-030406.log +0 -0
  371. data/test/plugin/data/2010/01/20100102.log +0 -0
  372. data/test/plugin/data/log/bar +0 -0
  373. data/test/plugin/data/log/foo/bar.log +0 -0
  374. data/test/plugin/data/log/foo/bar2 +0 -0
  375. data/test/plugin/data/log/test.log +0 -0
  376. data/test/plugin/data/sd_file/config +11 -0
  377. data/test/plugin/data/sd_file/config.json +17 -0
  378. data/test/plugin/data/sd_file/config.yaml +11 -0
  379. data/test/plugin/data/sd_file/config.yml +11 -0
  380. data/test/plugin/data/sd_file/invalid_config.yml +7 -0
  381. data/test/plugin/in_tail/test_fifo.rb +121 -0
  382. data/test/plugin/in_tail/test_io_handler.rb +140 -0
  383. data/test/plugin/in_tail/test_position_file.rb +379 -0
  384. data/test/plugin/out_forward/test_ack_handler.rb +101 -0
  385. data/test/plugin/out_forward/test_connection_manager.rb +145 -0
  386. data/test/plugin/out_forward/test_handshake_protocol.rb +112 -0
  387. data/test/plugin/out_forward/test_load_balancer.rb +106 -0
  388. data/test/plugin/out_forward/test_socket_cache.rb +149 -0
  389. data/test/plugin/test_bare_output.rb +131 -0
  390. data/test/plugin/test_base.rb +115 -0
  391. data/test/plugin/test_buf_file.rb +1275 -0
  392. data/test/plugin/test_buf_file_single.rb +833 -0
  393. data/test/plugin/test_buf_memory.rb +42 -0
  394. data/test/plugin/test_buffer.rb +1383 -0
  395. data/test/plugin/test_buffer_chunk.rb +198 -0
  396. data/test/plugin/test_buffer_file_chunk.rb +871 -0
  397. data/test/plugin/test_buffer_file_single_chunk.rb +611 -0
  398. data/test/plugin/test_buffer_memory_chunk.rb +339 -0
  399. data/test/plugin/test_compressable.rb +87 -0
  400. data/test/plugin/test_file_util.rb +96 -0
  401. data/test/plugin/test_file_wrapper.rb +126 -0
  402. data/test/plugin/test_filter.rb +368 -0
  403. data/test/plugin/test_filter_grep.rb +697 -0
  404. data/test/plugin/test_filter_parser.rb +731 -0
  405. data/test/plugin/test_filter_record_transformer.rb +577 -0
  406. data/test/plugin/test_filter_stdout.rb +207 -0
  407. data/test/plugin/test_formatter_csv.rb +136 -0
  408. data/test/plugin/test_formatter_hash.rb +38 -0
  409. data/test/plugin/test_formatter_json.rb +61 -0
  410. data/test/plugin/test_formatter_ltsv.rb +70 -0
  411. data/test/plugin/test_formatter_msgpack.rb +28 -0
  412. data/test/plugin/test_formatter_out_file.rb +116 -0
  413. data/test/plugin/test_formatter_single_value.rb +44 -0
  414. data/test/plugin/test_formatter_tsv.rb +76 -0
  415. data/test/plugin/test_in_debug_agent.rb +49 -0
  416. data/test/plugin/test_in_exec.rb +261 -0
  417. data/test/plugin/test_in_forward.rb +1180 -0
  418. data/test/plugin/test_in_gc_stat.rb +62 -0
  419. data/test/plugin/test_in_http.rb +1080 -0
  420. data/test/plugin/test_in_monitor_agent.rb +923 -0
  421. data/test/plugin/test_in_object_space.rb +60 -0
  422. data/test/plugin/test_in_sample.rb +190 -0
  423. data/test/plugin/test_in_syslog.rb +505 -0
  424. data/test/plugin/test_in_tail.rb +2363 -0
  425. data/test/plugin/test_in_tcp.rb +243 -0
  426. data/test/plugin/test_in_udp.rb +268 -0
  427. data/test/plugin/test_in_unix.rb +181 -0
  428. data/test/plugin/test_input.rb +137 -0
  429. data/test/plugin/test_metadata.rb +89 -0
  430. data/test/plugin/test_metrics.rb +294 -0
  431. data/test/plugin/test_metrics_local.rb +96 -0
  432. data/test/plugin/test_multi_output.rb +204 -0
  433. data/test/plugin/test_out_copy.rb +308 -0
  434. data/test/plugin/test_out_exec.rb +312 -0
  435. data/test/plugin/test_out_exec_filter.rb +606 -0
  436. data/test/plugin/test_out_file.rb +1037 -0
  437. data/test/plugin/test_out_forward.rb +1348 -0
  438. data/test/plugin/test_out_http.rb +428 -0
  439. data/test/plugin/test_out_null.rb +105 -0
  440. data/test/plugin/test_out_relabel.rb +28 -0
  441. data/test/plugin/test_out_roundrobin.rb +146 -0
  442. data/test/plugin/test_out_secondary_file.rb +458 -0
  443. data/test/plugin/test_out_stdout.rb +205 -0
  444. data/test/plugin/test_out_stream.rb +103 -0
  445. data/test/plugin/test_output.rb +1065 -0
  446. data/test/plugin/test_output_as_buffered.rb +2024 -0
  447. data/test/plugin/test_output_as_buffered_backup.rb +363 -0
  448. data/test/plugin/test_output_as_buffered_compress.rb +165 -0
  449. data/test/plugin/test_output_as_buffered_overflow.rb +250 -0
  450. data/test/plugin/test_output_as_buffered_retries.rb +919 -0
  451. data/test/plugin/test_output_as_buffered_secondary.rb +882 -0
  452. data/test/plugin/test_output_as_standard.rb +374 -0
  453. data/test/plugin/test_owned_by.rb +35 -0
  454. data/test/plugin/test_parser.rb +399 -0
  455. data/test/plugin/test_parser_apache.rb +42 -0
  456. data/test/plugin/test_parser_apache2.rb +47 -0
  457. data/test/plugin/test_parser_apache_error.rb +45 -0
  458. data/test/plugin/test_parser_csv.rb +200 -0
  459. data/test/plugin/test_parser_json.rb +138 -0
  460. data/test/plugin/test_parser_labeled_tsv.rb +160 -0
  461. data/test/plugin/test_parser_multiline.rb +111 -0
  462. data/test/plugin/test_parser_nginx.rb +88 -0
  463. data/test/plugin/test_parser_none.rb +52 -0
  464. data/test/plugin/test_parser_regexp.rb +289 -0
  465. data/test/plugin/test_parser_syslog.rb +650 -0
  466. data/test/plugin/test_parser_tsv.rb +122 -0
  467. data/test/plugin/test_sd_file.rb +228 -0
  468. data/test/plugin/test_sd_srv.rb +230 -0
  469. data/test/plugin/test_storage.rb +167 -0
  470. data/test/plugin/test_storage_local.rb +335 -0
  471. data/test/plugin/test_string_util.rb +26 -0
  472. data/test/plugin_helper/data/cert/cert-key.pem +27 -0
  473. data/test/plugin_helper/data/cert/cert-with-CRLF.pem +19 -0
  474. data/test/plugin_helper/data/cert/cert-with-no-newline.pem +19 -0
  475. data/test/plugin_helper/data/cert/cert.pem +19 -0
  476. data/test/plugin_helper/data/cert/cert_chains/ca-cert-key.pem +27 -0
  477. data/test/plugin_helper/data/cert/cert_chains/ca-cert.pem +20 -0
  478. data/test/plugin_helper/data/cert/cert_chains/cert-key.pem +27 -0
  479. data/test/plugin_helper/data/cert/cert_chains/cert.pem +40 -0
  480. data/test/plugin_helper/data/cert/empty.pem +0 -0
  481. data/test/plugin_helper/data/cert/generate_cert.rb +125 -0
  482. data/test/plugin_helper/data/cert/with_ca/ca-cert-key-pass.pem +30 -0
  483. data/test/plugin_helper/data/cert/with_ca/ca-cert-key.pem +27 -0
  484. data/test/plugin_helper/data/cert/with_ca/ca-cert-pass.pem +20 -0
  485. data/test/plugin_helper/data/cert/with_ca/ca-cert.pem +20 -0
  486. data/test/plugin_helper/data/cert/with_ca/cert-key-pass.pem +30 -0
  487. data/test/plugin_helper/data/cert/with_ca/cert-key.pem +27 -0
  488. data/test/plugin_helper/data/cert/with_ca/cert-pass.pem +21 -0
  489. data/test/plugin_helper/data/cert/with_ca/cert.pem +21 -0
  490. data/test/plugin_helper/data/cert/without_ca/cert-key-pass.pem +30 -0
  491. data/test/plugin_helper/data/cert/without_ca/cert-key.pem +27 -0
  492. data/test/plugin_helper/data/cert/without_ca/cert-pass.pem +20 -0
  493. data/test/plugin_helper/data/cert/without_ca/cert.pem +20 -0
  494. data/test/plugin_helper/http_server/test_app.rb +65 -0
  495. data/test/plugin_helper/http_server/test_route.rb +32 -0
  496. data/test/plugin_helper/service_discovery/test_manager.rb +93 -0
  497. data/test/plugin_helper/service_discovery/test_round_robin_balancer.rb +21 -0
  498. data/test/plugin_helper/test_cert_option.rb +25 -0
  499. data/test/plugin_helper/test_child_process.rb +840 -0
  500. data/test/plugin_helper/test_compat_parameters.rb +358 -0
  501. data/test/plugin_helper/test_event_emitter.rb +80 -0
  502. data/test/plugin_helper/test_event_loop.rb +52 -0
  503. data/test/plugin_helper/test_extract.rb +194 -0
  504. data/test/plugin_helper/test_formatter.rb +255 -0
  505. data/test/plugin_helper/test_http_server_helper.rb +372 -0
  506. data/test/plugin_helper/test_inject.rb +561 -0
  507. data/test/plugin_helper/test_metrics.rb +137 -0
  508. data/test/plugin_helper/test_parser.rb +264 -0
  509. data/test/plugin_helper/test_record_accessor.rb +238 -0
  510. data/test/plugin_helper/test_retry_state.rb +442 -0
  511. data/test/plugin_helper/test_server.rb +1823 -0
  512. data/test/plugin_helper/test_service_discovery.rb +165 -0
  513. data/test/plugin_helper/test_socket.rb +146 -0
  514. data/test/plugin_helper/test_storage.rb +542 -0
  515. data/test/plugin_helper/test_thread.rb +164 -0
  516. data/test/plugin_helper/test_timer.rb +130 -0
  517. data/test/scripts/exec_script.rb +32 -0
  518. data/test/scripts/fluent/plugin/formatter1/formatter_test1.rb +7 -0
  519. data/test/scripts/fluent/plugin/formatter2/formatter_test2.rb +7 -0
  520. data/test/scripts/fluent/plugin/formatter_known.rb +8 -0
  521. data/test/scripts/fluent/plugin/out_test.rb +81 -0
  522. data/test/scripts/fluent/plugin/out_test2.rb +80 -0
  523. data/test/scripts/fluent/plugin/parser_known.rb +4 -0
  524. data/test/test_capability.rb +74 -0
  525. data/test/test_clock.rb +164 -0
  526. data/test/test_config.rb +202 -0
  527. data/test/test_configdsl.rb +148 -0
  528. data/test/test_daemonizer.rb +91 -0
  529. data/test/test_engine.rb +203 -0
  530. data/test/test_event.rb +531 -0
  531. data/test/test_event_router.rb +331 -0
  532. data/test/test_event_time.rb +199 -0
  533. data/test/test_filter.rb +121 -0
  534. data/test/test_fluent_log_event_router.rb +99 -0
  535. data/test/test_formatter.rb +366 -0
  536. data/test/test_input.rb +31 -0
  537. data/test/test_log.rb +994 -0
  538. data/test/test_logger_initializer.rb +46 -0
  539. data/test/test_match.rb +148 -0
  540. data/test/test_mixin.rb +351 -0
  541. data/test/test_msgpack_factory.rb +18 -0
  542. data/test/test_oj_options.rb +55 -0
  543. data/test/test_output.rb +278 -0
  544. data/test/test_plugin.rb +251 -0
  545. data/test/test_plugin_classes.rb +370 -0
  546. data/test/test_plugin_helper.rb +81 -0
  547. data/test/test_plugin_id.rb +119 -0
  548. data/test/test_process.rb +14 -0
  549. data/test/test_root_agent.rb +951 -0
  550. data/test/test_static_config_analysis.rb +177 -0
  551. data/test/test_supervisor.rb +601 -0
  552. data/test/test_test_drivers.rb +136 -0
  553. data/test/test_time_formatter.rb +301 -0
  554. data/test/test_time_parser.rb +362 -0
  555. data/test/test_tls.rb +65 -0
  556. data/test/test_unique_id.rb +47 -0
  557. data/test/test_variable_store.rb +65 -0
  558. metadata +1261 -0
data/lib/fluent/log.rb ADDED
@@ -0,0 +1,713 @@
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 'forwardable'
18
+ require 'logger'
19
+
20
+ module Fluent
21
+ class Log
22
+ module TTYColor
23
+ RESET = "\033]R"
24
+ CRE = "\033[K"
25
+ CLEAR = "\033c"
26
+ NORMAL = "\033[0;39m"
27
+ RED = "\033[1;31m"
28
+ GREEN = "\033[1;32m"
29
+ YELLOW = "\033[1;33m"
30
+ BLUE = "\033[1;34m"
31
+ MAGENTA = "\033[1;35m"
32
+ CYAN = "\033[1;36m"
33
+ WHITE = "\033[1;37m"
34
+ end
35
+
36
+ LEVEL_TRACE = 0
37
+ LEVEL_DEBUG = 1
38
+ LEVEL_INFO = 2
39
+ LEVEL_WARN = 3
40
+ LEVEL_ERROR = 4
41
+ LEVEL_FATAL = 5
42
+
43
+ LEVEL_TEXT = %w(trace debug info warn error fatal)
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
+ LOG_ROTATE_AGE = %w(daily weekly monthly)
53
+
54
+ def self.str_to_level(log_level_str)
55
+ case log_level_str.downcase
56
+ when "trace" then LEVEL_TRACE
57
+ when "debug" then LEVEL_DEBUG
58
+ when "info" then LEVEL_INFO
59
+ when "warn" then LEVEL_WARN
60
+ when "error" then LEVEL_ERROR
61
+ when "fatal" then LEVEL_FATAL
62
+ else raise "Unknown log level: level = #{log_level_str}"
63
+ end
64
+ end
65
+
66
+ def self.event_tags
67
+ LEVEL_TEXT.map{|t| "#{LOG_EVENT_TAG_PREFIX}.#{t}" }
68
+ end
69
+
70
+ def initialize(logger, opts={})
71
+ # overwrites logger.level= so that config reloading resets level of Fluentd::Log
72
+ orig_logger_level_setter = logger.class.public_instance_method(:level=).bind(logger)
73
+ me = self
74
+ # The original ruby logger sets the number as each log level like below.
75
+ # DEBUG = 0
76
+ # INFO = 1
77
+ # WARN = 2
78
+ # ERROR = 3
79
+ # FATAL = 4
80
+ # Serverengine use this original log number. In addition to this, serverengine sets -1 as TRACE level.
81
+ # TRACE = -1
82
+ #
83
+ # On the other hand, in fluentd side, it sets the number like below.
84
+ # TRACE = 0
85
+ # DEBUG = 1
86
+ # INFO = 2
87
+ # WARN = 3
88
+ # ERROR = 4
89
+ # FATAL = 5
90
+ #
91
+ # Then fluentd's level is set as serverengine's level + 1.
92
+ # So if serverengine's logger level is changed, fluentd's log level will be changed to that + 1.
93
+ logger.define_singleton_method(:level=) {|level| orig_logger_level_setter.call(level); me.level = self.level + 1 }
94
+
95
+ @logger = logger
96
+ @out = logger.instance_variable_get(:@logdev)
97
+ @level = logger.level + 1
98
+ @debug_mode = false
99
+ @log_event_enabled = false
100
+ @depth_offset = 1
101
+ @format = nil
102
+ @time_format = nil
103
+ @formatter = nil
104
+
105
+ self.format = :text
106
+ enable_color out.tty?
107
+ # TODO: This variable name is unclear so we should change to better name.
108
+ @threads_exclude_events = []
109
+
110
+ # Fluent::Engine requires Fluent::Log, so we must take that object lazily
111
+ @engine = Fluent.const_get('Engine')
112
+ @optional_header = nil
113
+ @optional_attrs = nil
114
+
115
+ @suppress_repeated_stacktrace = opts[:suppress_repeated_stacktrace]
116
+ @ignore_repeated_log_interval = opts[:ignore_repeated_log_interval]
117
+ @ignore_same_log_interval = opts[:ignore_same_log_interval]
118
+
119
+ @process_type = opts[:process_type] # :supervisor, :worker0, :workers Or :standalone
120
+ @process_type ||= :standalone # to keep behavior of existing code
121
+ case @process_type
122
+ when :supervisor
123
+ @show_supervisor_log = true
124
+ @show_worker0_log = false
125
+ when :worker0
126
+ @show_supervisor_log = false
127
+ @show_worker0_log = true
128
+ when :workers
129
+ @show_supervisor_log = false
130
+ @show_worker0_log = false
131
+ when :standalone
132
+ @show_supervisor_log = true
133
+ @show_worker0_log = true
134
+ else
135
+ raise "BUG: unknown process type for logger:#{@process_type}"
136
+ end
137
+ @worker_id = opts[:worker_id]
138
+ @worker_id_part = "##{@worker_id} " # used only for :default log type in workers
139
+ end
140
+
141
+ def dup
142
+ dl_opts = {}
143
+ dl_opts[:log_level] = @level - 1
144
+ logger = ServerEngine::DaemonLogger.new(@out, dl_opts)
145
+ clone = self.class.new(logger, suppress_repeated_stacktrace: @suppress_repeated_stacktrace, process_type: @process_type,
146
+ worker_id: @worker_id, ignore_repeated_log_interval: @ignore_repeated_log_interval,
147
+ ignore_same_log_interval: @ignore_same_log_interval)
148
+ clone.format = @format
149
+ clone.time_format = @time_format
150
+ clone.log_event_enabled = @log_event_enabled
151
+ # optional headers/attrs are not copied, because new PluginLogger should have another one of it
152
+ clone
153
+ end
154
+
155
+ attr_reader :format
156
+ attr_reader :time_format
157
+ attr_accessor :log_event_enabled, :ignore_repeated_log_interval, :ignore_same_log_interval
158
+ attr_accessor :out
159
+ attr_accessor :level
160
+ attr_accessor :optional_header, :optional_attrs
161
+
162
+ def logdev=(logdev)
163
+ @out = logdev
164
+ @logger.instance_variable_set(:@logdev, logdev)
165
+ nil
166
+ end
167
+
168
+ def format=(fmt)
169
+ return if @format == fmt
170
+
171
+ @time_format = '%Y-%m-%d %H:%M:%S %z'
172
+ @time_formatter = Strftime.new(@time_format) rescue nil
173
+
174
+ case fmt
175
+ when :text
176
+ @format = :text
177
+ @formatter = Proc.new { |type, time, level, msg|
178
+ r = caller_line(type, time, @depth_offset, level)
179
+ r << msg
180
+ r
181
+ }
182
+ when :json
183
+ @format = :json
184
+ @formatter = Proc.new { |type, time, level, msg|
185
+ r = {
186
+ 'time' => format_time(time),
187
+ 'level' => LEVEL_TEXT[level],
188
+ 'message' => msg
189
+ }
190
+ if wid = get_worker_id(type)
191
+ r['worker_id'] = wid
192
+ end
193
+ Yajl.dump(r)
194
+ }
195
+ end
196
+
197
+ nil
198
+ end
199
+
200
+ def time_format=(time_fmt)
201
+ @time_format = time_fmt
202
+ @time_formatter = Strftime.new(@time_format) rescue nil
203
+ end
204
+
205
+ def reopen!
206
+ # do nothing in @logger.reopen! because it's already reopened in Supervisor.load_config
207
+ @logger.reopen! if @logger
208
+ nil
209
+ end
210
+
211
+ def enable_debug(b=true)
212
+ @debug_mode = b
213
+ self
214
+ end
215
+
216
+ def enable_event(b=true)
217
+ @log_event_enabled = b
218
+ self
219
+ end
220
+
221
+ # If you want to suppress event emitting in specific thread, please use this method.
222
+ # Events in passed thread are never emitted.
223
+ def disable_events(thread)
224
+ # this method is not symmetric with #enable_event.
225
+ @threads_exclude_events.push(thread) unless @threads_exclude_events.include?(thread)
226
+ end
227
+
228
+ def enable_color?
229
+ !@color_reset.empty?
230
+ end
231
+
232
+ def enable_color(b=true)
233
+ if b
234
+ @color_trace = TTYColor::BLUE
235
+ @color_debug = TTYColor::WHITE
236
+ @color_info = TTYColor::GREEN
237
+ @color_warn = TTYColor::YELLOW
238
+ @color_error = TTYColor::MAGENTA
239
+ @color_fatal = TTYColor::RED
240
+ @color_reset = TTYColor::NORMAL
241
+ else
242
+ @color_trace = ''
243
+ @color_debug = ''
244
+ @color_info = ''
245
+ @color_warn = ''
246
+ @color_error = ''
247
+ @color_fatal = ''
248
+ @color_reset = ''
249
+ end
250
+ self
251
+ end
252
+
253
+ def log_type(args)
254
+ if LOG_TYPES.include?(args.first)
255
+ args.shift
256
+ else
257
+ LOG_TYPE_DEFAULT
258
+ end
259
+ end
260
+
261
+ # TODO: skip :worker0 logs when Fluentd gracefully restarted
262
+ def skipped_type?(type)
263
+ case type
264
+ when LOG_TYPE_DEFAULT
265
+ false
266
+ when LOG_TYPE_WORKER0
267
+ !@show_worker0_log
268
+ when LOG_TYPE_SUPERVISOR
269
+ !@show_supervisor_log
270
+ else
271
+ raise "BUG: unknown log type:#{type}"
272
+ end
273
+ end
274
+
275
+ def on_trace
276
+ return if @level > LEVEL_TRACE
277
+ yield
278
+ end
279
+
280
+ def trace(*args, &block)
281
+ return if @level > LEVEL_TRACE
282
+ type = log_type(args)
283
+ return if skipped_type?(type)
284
+ args << block.call if block
285
+ time, msg = event(:trace, args)
286
+ return if time.nil?
287
+ puts [@color_trace, @formatter.call(type, time, LEVEL_TRACE, msg), @color_reset].join
288
+ rescue
289
+ # logger should not raise an exception. This rescue prevents unexpected behaviour.
290
+ end
291
+ alias TRACE trace
292
+
293
+ def trace_backtrace(backtrace=$!.backtrace, type: :default)
294
+ dump_stacktrace(type, backtrace, LEVEL_TRACE)
295
+ end
296
+
297
+ def on_debug
298
+ return if @level > LEVEL_DEBUG
299
+ yield
300
+ end
301
+
302
+ def debug(*args, &block)
303
+ return if @level > LEVEL_DEBUG
304
+ type = log_type(args)
305
+ return if skipped_type?(type)
306
+ args << block.call if block
307
+ time, msg = event(:debug, args)
308
+ return if time.nil?
309
+ puts [@color_debug, @formatter.call(type, time, LEVEL_DEBUG, msg), @color_reset].join
310
+ rescue
311
+ end
312
+ alias DEBUG debug
313
+
314
+ def debug_backtrace(backtrace=$!.backtrace, type: :default)
315
+ dump_stacktrace(type, backtrace, LEVEL_DEBUG)
316
+ end
317
+
318
+ def on_info
319
+ return if @level > LEVEL_INFO
320
+ yield
321
+ end
322
+
323
+ def info(*args, &block)
324
+ return if @level > LEVEL_INFO
325
+ type = log_type(args)
326
+ return if skipped_type?(type)
327
+ args << block.call if block
328
+ time, msg = event(:info, args)
329
+ return if time.nil?
330
+ puts [@color_info, @formatter.call(type, time, LEVEL_INFO, msg), @color_reset].join
331
+ rescue
332
+ end
333
+ alias INFO info
334
+
335
+ def info_backtrace(backtrace=$!.backtrace, type: :default)
336
+ dump_stacktrace(type, backtrace, LEVEL_INFO)
337
+ end
338
+
339
+ def on_warn
340
+ return if @level > LEVEL_WARN
341
+ yield
342
+ end
343
+
344
+ def warn(*args, &block)
345
+ return if @level > LEVEL_WARN
346
+ type = log_type(args)
347
+ return if skipped_type?(type)
348
+ args << block.call if block
349
+ time, msg = event(:warn, args)
350
+ return if time.nil?
351
+ puts [@color_warn, @formatter.call(type, time, LEVEL_WARN, msg), @color_reset].join
352
+ rescue
353
+ end
354
+ alias WARN warn
355
+
356
+ def warn_backtrace(backtrace=$!.backtrace, type: :default)
357
+ dump_stacktrace(type, backtrace, LEVEL_WARN)
358
+ end
359
+
360
+ def on_error
361
+ return if @level > LEVEL_ERROR
362
+ yield
363
+ end
364
+
365
+ def error(*args, &block)
366
+ return if @level > LEVEL_ERROR
367
+ type = log_type(args)
368
+ return if skipped_type?(type)
369
+ args << block.call if block
370
+ time, msg = event(:error, args)
371
+ return if time.nil?
372
+ puts [@color_error, @formatter.call(type, time, LEVEL_ERROR, msg), @color_reset].join
373
+ rescue
374
+ end
375
+ alias ERROR error
376
+
377
+ def error_backtrace(backtrace=$!.backtrace, type: :default)
378
+ dump_stacktrace(type, backtrace, LEVEL_ERROR)
379
+ end
380
+
381
+ def on_fatal
382
+ return if @level > LEVEL_FATAL
383
+ yield
384
+ end
385
+
386
+ def fatal(*args, &block)
387
+ return if @level > LEVEL_FATAL
388
+ type = log_type(args)
389
+ return if skipped_type?(type)
390
+ args << block.call if block
391
+ time, msg = event(:fatal, args)
392
+ return if time.nil?
393
+ puts [@color_fatal, @formatter.call(type, time, LEVEL_FATAL, msg), @color_reset].join
394
+ rescue
395
+ end
396
+ alias FATAL fatal
397
+
398
+ def fatal_backtrace(backtrace=$!.backtrace, type: :default)
399
+ dump_stacktrace(type, backtrace, LEVEL_FATAL)
400
+ end
401
+
402
+ def puts(msg)
403
+ @logger << msg + "\n"
404
+ @out.flush
405
+ msg
406
+ rescue
407
+ # FIXME
408
+ nil
409
+ end
410
+
411
+ def write(data)
412
+ @out.write(data)
413
+ end
414
+ # We need `#<<` method to use this logger class with other
415
+ # libraries such as aws-sdk
416
+ alias << write
417
+
418
+ def flush
419
+ @out.flush
420
+ end
421
+
422
+ def reset
423
+ @out.reset if @out.respond_to?(:reset)
424
+ end
425
+
426
+ CachedLog = Struct.new(:msg, :time)
427
+
428
+ def ignore_repeated_log?(key, time, message)
429
+ cached_log = Thread.current[key]
430
+ return false if cached_log.nil?
431
+ (cached_log.msg == message) && (time - cached_log.time <= @ignore_repeated_log_interval)
432
+ end
433
+
434
+ def ignore_same_log?(time, message)
435
+ cached_log = Thread.current[:last_same_log]
436
+ if cached_log.nil?
437
+ Thread.current[:last_same_log] = {message => time}
438
+ return false
439
+ end
440
+
441
+ prev_time = cached_log[message]
442
+ if prev_time
443
+ if (time - prev_time) <= @ignore_same_log_interval
444
+ true
445
+ else
446
+ cached_log[message] = time
447
+ false
448
+ end
449
+ else
450
+ cached_log[message] = time
451
+ false
452
+ end
453
+ end
454
+
455
+ def suppress_stacktrace?(backtrace)
456
+ cached_log = Thread.current[:last_repeated_stacktrace]
457
+ return false if cached_log.nil?
458
+ cached_log.msg == backtrace
459
+ end
460
+
461
+ def dump_stacktrace(type, backtrace, level)
462
+ return if @level > level
463
+
464
+ time = Time.now
465
+
466
+ if @format == :text
467
+ line = caller_line(type, time, 5, level)
468
+ if @ignore_repeated_log_interval && ignore_repeated_log?(:last_repeated_stacktrace, time, backtrace)
469
+ return
470
+ elsif @suppress_repeated_stacktrace && suppress_stacktrace?(backtrace)
471
+ puts [" ", line, 'suppressed same stacktrace'].join
472
+ Thread.current[:last_repeated_stacktrace] = CachedLog.new(backtrace, time) if @ignore_repeated_log_interval
473
+ else
474
+ backtrace.each { |msg|
475
+ puts [" ", line, msg].join
476
+ }
477
+ Thread.current[:last_repeated_stacktrace] = CachedLog.new(backtrace, time) if @suppress_repeated_stacktrace
478
+ end
479
+ else
480
+ r = {
481
+ 'time' => format_time(time),
482
+ 'level' => LEVEL_TEXT[level],
483
+ }
484
+ if wid = get_worker_id(type)
485
+ r['worker_id'] = wid
486
+ end
487
+
488
+ if @ignore_repeated_log_interval && ignore_repeated_log?(:last_repeated_stacktrace, time, backtrace)
489
+ return
490
+ elsif @suppress_repeated_stacktrace && suppress_stacktrace?(backtrace)
491
+ r['message'] = 'suppressed same stacktrace'
492
+ Thread.current[:last_repeated_stacktrace] = CachedLog.new(backtrace, time) if @ignore_repeated_log_interval
493
+ else
494
+ r['message'] = backtrace.join("\n")
495
+ Thread.current[:last_repeated_stacktrace] = CachedLog.new(backtrace, time) if @suppress_repeated_stacktrace
496
+ end
497
+
498
+ puts Yajl.dump(r)
499
+ end
500
+
501
+ nil
502
+ end
503
+
504
+ def get_worker_id(type)
505
+ if type == :default && (@process_type == :worker0 || @process_type == :workers)
506
+ @worker_id
507
+ else
508
+ nil
509
+ end
510
+ end
511
+
512
+ def event(level, args)
513
+ time = Time.now
514
+ message = @optional_header ? @optional_header.dup : ''
515
+ map = @optional_attrs ? @optional_attrs.dup : {}
516
+ args.each {|a|
517
+ if a.is_a?(Hash)
518
+ a.each_pair {|k,v|
519
+ map[k.to_s] = v
520
+ }
521
+ else
522
+ message << a.to_s
523
+ end
524
+ }
525
+
526
+ map.each_pair {|k,v|
527
+ if k == "error".freeze && v.is_a?(Exception) && !map.has_key?("error_class")
528
+ message << " error_class=#{v.class.to_s} error=#{v.to_s.inspect}"
529
+ else
530
+ message << " #{k}=#{v.inspect}"
531
+ end
532
+ }
533
+
534
+ if @ignore_same_log_interval
535
+ if ignore_same_log?(time, message)
536
+ return nil, nil
537
+ end
538
+ elsif @ignore_repeated_log_interval
539
+ if ignore_repeated_log?(:last_repeated_log, time, message)
540
+ return nil, nil
541
+ else
542
+ Thread.current[:last_repeated_log] = CachedLog.new(message, time)
543
+ end
544
+ end
545
+
546
+ if @log_event_enabled && !@threads_exclude_events.include?(Thread.current)
547
+ record = map.dup
548
+ record.keys.each {|key|
549
+ record[key] = record[key].inspect unless record[key].respond_to?(:to_msgpack)
550
+ }
551
+ record['message'] = message.dup
552
+ @engine.push_log_event("#{LOG_EVENT_TAG_PREFIX}.#{level}", Fluent::EventTime.from_time(time), record)
553
+ end
554
+
555
+ return time, message
556
+ end
557
+
558
+ def caller_line(type, time, depth, level)
559
+ worker_id_part = if type == :default && (@process_type == :worker0 || @process_type == :workers)
560
+ @worker_id_part
561
+ else
562
+ "".freeze
563
+ end
564
+ log_msg = "#{format_time(time)} [#{LEVEL_TEXT[level]}]: #{worker_id_part}"
565
+ if @debug_mode
566
+ line = caller(depth+1)[0]
567
+ if match = /^(.+?):(\d+)(?::in `(.*)')?/.match(line)
568
+ file = match[1].split('/')[-2,2].join('/')
569
+ line = match[2]
570
+ method = match[3]
571
+ return "#{log_msg}#{file}:#{line}:#{method}: "
572
+ end
573
+ end
574
+ return log_msg
575
+ end
576
+
577
+ def format_time(time)
578
+ @time_formatter ? @time_formatter.exec(time) : time.strftime(@time_format)
579
+ end
580
+ end
581
+
582
+
583
+ # PluginLogger has own log level separated from global $log object.
584
+ # This class enables log_level option in each plugin.
585
+ #
586
+ # PluginLogger has same functionality as Log but some methods are forwarded to internal logger
587
+ # for keeping logging action consistency in the process, e.g. color, event, etc.
588
+ class PluginLogger < Log
589
+ def initialize(logger)
590
+ @logger = logger
591
+ @level = @logger.level
592
+ @format = nil
593
+ @depth_offset = 2
594
+ if logger.instance_variable_defined?(:@suppress_repeated_stacktrace)
595
+ @suppress_repeated_stacktrace = logger.instance_variable_get(:@suppress_repeated_stacktrace)
596
+ end
597
+ if logger.instance_variable_defined?(:@ignore_repeated_log_interval)
598
+ @ignore_repeated_log_interval = logger.instance_variable_get(:@ignore_repeated_log_interval)
599
+ end
600
+ if logger.instance_variable_defined?(:@ignore_same_log_interval)
601
+ @ignore_same_log_interval = logger.instance_variable_get(:@ignore_same_log_interval)
602
+ end
603
+
604
+ self.format = @logger.format
605
+ self.time_format = @logger.time_format
606
+ enable_color @logger.enable_color?
607
+ end
608
+
609
+ def level=(log_level_str)
610
+ @level = Log.str_to_level(log_level_str)
611
+ end
612
+
613
+ alias orig_format= format=
614
+ alias orig_time_format= time_format=
615
+ alias orig_enable_color enable_color
616
+
617
+ def format=(fmt)
618
+ self.orig_format = fmt
619
+ @logger.format = fmt
620
+ end
621
+
622
+ def time_format=(fmt)
623
+ self.orig_time_format = fmt
624
+ @logger.time_format = fmt
625
+ end
626
+
627
+ def enable_color(b = true)
628
+ orig_enable_color b
629
+ @logger.enable_color b
630
+ end
631
+
632
+ extend Forwardable
633
+ def_delegators '@logger', :get_worker_id, :enable_color?, :enable_debug, :enable_event,
634
+ :disable_events, :log_event_enabled, :log_event_enabled=, :event, :caller_line, :puts, :write,
635
+ :<<, :flush, :reset, :out, :out=, :optional_header, :optional_header=, :optional_attrs,
636
+ :optional_attrs=
637
+ end
638
+
639
+
640
+ module PluginLoggerMixin
641
+ def self.included(klass)
642
+ klass.instance_eval {
643
+ desc 'Allows the user to set different levels of logging for each plugin.'
644
+ config_param :@log_level, :string, default: nil, alias: :log_level # 'log_level' will be warned as deprecated
645
+ }
646
+ end
647
+
648
+ def initialize
649
+ super
650
+
651
+ @log = $log # Use $log object directly by default
652
+ end
653
+
654
+ attr_accessor :log
655
+
656
+ def configure(conf)
657
+ super
658
+
659
+ if plugin_id_configured? || conf['@log_level']
660
+ @log = PluginLogger.new($log.dup) unless @log.is_a?(PluginLogger)
661
+ @log.optional_attrs = {}
662
+
663
+ if level = conf['@log_level']
664
+ @log.level = level
665
+ end
666
+
667
+ if plugin_id_configured?
668
+ @log.optional_header = "[#{@id}] "
669
+ end
670
+ end
671
+ end
672
+
673
+ def terminate
674
+ super
675
+ @log.reset
676
+ end
677
+ end
678
+
679
+ # This class delegates some methods which are used in `Fluent::Logger` to a instance variable(`dev`) in `Logger::LogDevice` class
680
+ # https://github.com/ruby/ruby/blob/7b2d47132ff8ee950b0f978ab772dee868d9f1b0/lib/logger.rb#L661
681
+ class LogDeviceIO < ::Logger::LogDevice
682
+ def flush
683
+ if @dev.respond_to?(:flush)
684
+ @dev.flush
685
+ else
686
+ super
687
+ end
688
+ end
689
+
690
+ def tty?
691
+ if @dev.respond_to?(:tty?)
692
+ @dev.tty?
693
+ else
694
+ super
695
+ end
696
+ end
697
+
698
+ def sync=(v)
699
+ if @dev.respond_to?(:sync=)
700
+ @dev.sync = v
701
+ else
702
+ super
703
+ end
704
+ end
705
+
706
+ def reopen(path, mode)
707
+ if mode != 'a'
708
+ raise "Unsupported mode: #{mode}"
709
+ end
710
+ super(path)
711
+ end
712
+ end
713
+ end