fluentd222 1.16.2-x86_64-linux

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