fluentd 1.20.0-aarch64-mingw-ucrt

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 (341) hide show
  1. checksums.yaml +7 -0
  2. data/.rubocop.yml +116 -0
  3. data/ADOPTERS.md +5 -0
  4. data/AGENTS.md +46 -0
  5. data/AUTHORS +2 -0
  6. data/CHANGELOG.md +3324 -0
  7. data/CONTRIBUTING.md +45 -0
  8. data/GOVERNANCE.md +55 -0
  9. data/GithubWorkflow.md +78 -0
  10. data/LICENSE +202 -0
  11. data/MAINTAINERS.md +19 -0
  12. data/README.md +73 -0
  13. data/Rakefile +89 -0
  14. data/SECURITY.md +47 -0
  15. data/bin/fluent-binlog-reader +7 -0
  16. data/bin/fluent-ca-generate +6 -0
  17. data/bin/fluent-cap-ctl +7 -0
  18. data/bin/fluent-cat +5 -0
  19. data/bin/fluent-ctl +7 -0
  20. data/bin/fluent-debug +5 -0
  21. data/bin/fluent-gem +9 -0
  22. data/bin/fluent-plugin-config-format +5 -0
  23. data/bin/fluent-plugin-generate +5 -0
  24. data/bin/fluentd +15 -0
  25. data/code-of-conduct.md +3 -0
  26. data/docs/SECURITY_AUDIT.pdf +0 -0
  27. data/example/copy_roundrobin.conf +39 -0
  28. data/example/counter.conf +18 -0
  29. data/example/filter_stdout.conf +22 -0
  30. data/example/in_forward.conf +14 -0
  31. data/example/in_forward_client.conf +37 -0
  32. data/example/in_forward_shared_key.conf +15 -0
  33. data/example/in_forward_tls.conf +14 -0
  34. data/example/in_forward_users.conf +24 -0
  35. data/example/in_forward_workers.conf +21 -0
  36. data/example/in_http.conf +16 -0
  37. data/example/in_out_forward.conf +17 -0
  38. data/example/in_sample_blocks.conf +17 -0
  39. data/example/in_sample_with_compression.conf +23 -0
  40. data/example/in_syslog.conf +15 -0
  41. data/example/in_tail.conf +14 -0
  42. data/example/in_tcp.conf +13 -0
  43. data/example/in_udp.conf +13 -0
  44. data/example/logevents.conf +25 -0
  45. data/example/multi_filters.conf +61 -0
  46. data/example/out_copy.conf +20 -0
  47. data/example/out_exec_filter.conf +42 -0
  48. data/example/out_file.conf +13 -0
  49. data/example/out_forward.conf +35 -0
  50. data/example/out_forward_buf_file.conf +23 -0
  51. data/example/out_forward_client.conf +109 -0
  52. data/example/out_forward_heartbeat_none.conf +16 -0
  53. data/example/out_forward_sd.conf +17 -0
  54. data/example/out_forward_shared_key.conf +36 -0
  55. data/example/out_forward_tls.conf +18 -0
  56. data/example/out_forward_users.conf +65 -0
  57. data/example/out_null.conf +36 -0
  58. data/example/sd.yaml +8 -0
  59. data/example/secondary_file.conf +42 -0
  60. data/example/suppress_config_dump.conf +7 -0
  61. data/example/v0_12_filter.conf +78 -0
  62. data/example/v1_literal_example.conf +36 -0
  63. data/example/worker_section.conf +36 -0
  64. data/fluent.conf +139 -0
  65. data/lib/fluent/agent.rb +168 -0
  66. data/lib/fluent/capability.rb +87 -0
  67. data/lib/fluent/clock.rb +66 -0
  68. data/lib/fluent/command/binlog_reader.rb +244 -0
  69. data/lib/fluent/command/bundler_injection.rb +45 -0
  70. data/lib/fluent/command/ca_generate.rb +184 -0
  71. data/lib/fluent/command/cap_ctl.rb +174 -0
  72. data/lib/fluent/command/cat.rb +365 -0
  73. data/lib/fluent/command/ctl.rb +180 -0
  74. data/lib/fluent/command/debug.rb +103 -0
  75. data/lib/fluent/command/fluentd.rb +385 -0
  76. data/lib/fluent/command/plugin_config_formatter.rb +308 -0
  77. data/lib/fluent/command/plugin_generator.rb +365 -0
  78. data/lib/fluent/compat/call_super_mixin.rb +76 -0
  79. data/lib/fluent/compat/detach_process_mixin.rb +33 -0
  80. data/lib/fluent/compat/exec_util.rb +144 -0
  81. data/lib/fluent/compat/file_util.rb +54 -0
  82. data/lib/fluent/compat/filter.rb +68 -0
  83. data/lib/fluent/compat/formatter.rb +117 -0
  84. data/lib/fluent/compat/formatter_utils.rb +85 -0
  85. data/lib/fluent/compat/handle_tag_and_time_mixin.rb +62 -0
  86. data/lib/fluent/compat/handle_tag_name_mixin.rb +53 -0
  87. data/lib/fluent/compat/input.rb +49 -0
  88. data/lib/fluent/compat/output.rb +721 -0
  89. data/lib/fluent/compat/output_chain.rb +60 -0
  90. data/lib/fluent/compat/parser.rb +310 -0
  91. data/lib/fluent/compat/parser_utils.rb +40 -0
  92. data/lib/fluent/compat/propagate_default.rb +62 -0
  93. data/lib/fluent/compat/record_filter_mixin.rb +34 -0
  94. data/lib/fluent/compat/set_tag_key_mixin.rb +50 -0
  95. data/lib/fluent/compat/set_time_key_mixin.rb +69 -0
  96. data/lib/fluent/compat/socket_util.rb +165 -0
  97. data/lib/fluent/compat/string_util.rb +34 -0
  98. data/lib/fluent/compat/structured_format_mixin.rb +26 -0
  99. data/lib/fluent/compat/type_converter.rb +90 -0
  100. data/lib/fluent/config/basic_parser.rb +122 -0
  101. data/lib/fluent/config/configure_proxy.rb +424 -0
  102. data/lib/fluent/config/dsl.rb +152 -0
  103. data/lib/fluent/config/element.rb +265 -0
  104. data/lib/fluent/config/error.rb +44 -0
  105. data/lib/fluent/config/literal_parser.rb +305 -0
  106. data/lib/fluent/config/parser.rb +119 -0
  107. data/lib/fluent/config/section.rb +272 -0
  108. data/lib/fluent/config/types.rb +257 -0
  109. data/lib/fluent/config/v1_parser.rb +200 -0
  110. data/lib/fluent/config/yaml_parser/fluent_value.rb +47 -0
  111. data/lib/fluent/config/yaml_parser/loader.rb +124 -0
  112. data/lib/fluent/config/yaml_parser/parser.rb +179 -0
  113. data/lib/fluent/config/yaml_parser/section_builder.rb +107 -0
  114. data/lib/fluent/config/yaml_parser.rb +56 -0
  115. data/lib/fluent/config.rb +89 -0
  116. data/lib/fluent/configurable.rb +202 -0
  117. data/lib/fluent/counter/base_socket.rb +44 -0
  118. data/lib/fluent/counter/client.rb +297 -0
  119. data/lib/fluent/counter/error.rb +86 -0
  120. data/lib/fluent/counter/mutex_hash.rb +163 -0
  121. data/lib/fluent/counter/server.rb +273 -0
  122. data/lib/fluent/counter/store.rb +205 -0
  123. data/lib/fluent/counter/validator.rb +145 -0
  124. data/lib/fluent/counter.rb +23 -0
  125. data/lib/fluent/daemon.rb +14 -0
  126. data/lib/fluent/daemonizer.rb +88 -0
  127. data/lib/fluent/engine.rb +269 -0
  128. data/lib/fluent/env.rb +45 -0
  129. data/lib/fluent/error.rb +37 -0
  130. data/lib/fluent/event.rb +369 -0
  131. data/lib/fluent/event_router.rb +315 -0
  132. data/lib/fluent/ext_monitor_require.rb +28 -0
  133. data/lib/fluent/file_wrapper.rb +137 -0
  134. data/lib/fluent/filter.rb +21 -0
  135. data/lib/fluent/fluent_log_event_router.rb +139 -0
  136. data/lib/fluent/formatter.rb +23 -0
  137. data/lib/fluent/input.rb +21 -0
  138. data/lib/fluent/label.rb +46 -0
  139. data/lib/fluent/load.rb +33 -0
  140. data/lib/fluent/log/console_adapter.rb +66 -0
  141. data/lib/fluent/log.rb +775 -0
  142. data/lib/fluent/match.rb +187 -0
  143. data/lib/fluent/mixin.rb +31 -0
  144. data/lib/fluent/msgpack_factory.rb +111 -0
  145. data/lib/fluent/oj_options.rb +61 -0
  146. data/lib/fluent/output.rb +29 -0
  147. data/lib/fluent/output_chain.rb +23 -0
  148. data/lib/fluent/parser.rb +23 -0
  149. data/lib/fluent/plugin/bare_output.rb +88 -0
  150. data/lib/fluent/plugin/base.rb +219 -0
  151. data/lib/fluent/plugin/buf_file.rb +256 -0
  152. data/lib/fluent/plugin/buf_file_single.rb +272 -0
  153. data/lib/fluent/plugin/buf_memory.rb +34 -0
  154. data/lib/fluent/plugin/buffer/chunk.rb +313 -0
  155. data/lib/fluent/plugin/buffer/file_chunk.rb +432 -0
  156. data/lib/fluent/plugin/buffer/file_single_chunk.rb +325 -0
  157. data/lib/fluent/plugin/buffer/memory_chunk.rb +91 -0
  158. data/lib/fluent/plugin/buffer.rb +1063 -0
  159. data/lib/fluent/plugin/compressable.rb +87 -0
  160. data/lib/fluent/plugin/exec_util.rb +22 -0
  161. data/lib/fluent/plugin/extractor.rb +132 -0
  162. data/lib/fluent/plugin/file_util.rb +22 -0
  163. data/lib/fluent/plugin/filter.rb +119 -0
  164. data/lib/fluent/plugin/filter_grep.rb +189 -0
  165. data/lib/fluent/plugin/filter_parser.rb +124 -0
  166. data/lib/fluent/plugin/filter_record_transformer.rb +325 -0
  167. data/lib/fluent/plugin/filter_stdout.rb +53 -0
  168. data/lib/fluent/plugin/formatter.rb +75 -0
  169. data/lib/fluent/plugin/formatter_csv.rb +92 -0
  170. data/lib/fluent/plugin/formatter_hash.rb +35 -0
  171. data/lib/fluent/plugin/formatter_json.rb +62 -0
  172. data/lib/fluent/plugin/formatter_ltsv.rb +44 -0
  173. data/lib/fluent/plugin/formatter_msgpack.rb +33 -0
  174. data/lib/fluent/plugin/formatter_out_file.rb +55 -0
  175. data/lib/fluent/plugin/formatter_single_value.rb +36 -0
  176. data/lib/fluent/plugin/formatter_stdout.rb +76 -0
  177. data/lib/fluent/plugin/formatter_tsv.rb +40 -0
  178. data/lib/fluent/plugin/in_debug_agent.rb +71 -0
  179. data/lib/fluent/plugin/in_dummy.rb +18 -0
  180. data/lib/fluent/plugin/in_exec.rb +124 -0
  181. data/lib/fluent/plugin/in_forward.rb +489 -0
  182. data/lib/fluent/plugin/in_gc_stat.rb +72 -0
  183. data/lib/fluent/plugin/in_http.rb +737 -0
  184. data/lib/fluent/plugin/in_monitor_agent.rb +406 -0
  185. data/lib/fluent/plugin/in_object_space.rb +93 -0
  186. data/lib/fluent/plugin/in_sample.rb +148 -0
  187. data/lib/fluent/plugin/in_syslog.rb +346 -0
  188. data/lib/fluent/plugin/in_tail/compatibility.rb +111 -0
  189. data/lib/fluent/plugin/in_tail/dir_watcher.rb +713 -0
  190. data/lib/fluent/plugin/in_tail/group_watch.rb +204 -0
  191. data/lib/fluent/plugin/in_tail/io_handler.rb +391 -0
  192. data/lib/fluent/plugin/in_tail/line_feeder.rb +230 -0
  193. data/lib/fluent/plugin/in_tail/position_file.rb +269 -0
  194. data/lib/fluent/plugin/in_tail/stat_watcher.rb +52 -0
  195. data/lib/fluent/plugin/in_tail/tail_watcher.rb +276 -0
  196. data/lib/fluent/plugin/in_tail/worker_pool.rb +298 -0
  197. data/lib/fluent/plugin/in_tail.rb +917 -0
  198. data/lib/fluent/plugin/in_tcp.rb +230 -0
  199. data/lib/fluent/plugin/in_udp.rb +101 -0
  200. data/lib/fluent/plugin/in_unix.rb +197 -0
  201. data/lib/fluent/plugin/input.rb +71 -0
  202. data/lib/fluent/plugin/metrics.rb +119 -0
  203. data/lib/fluent/plugin/metrics_local.rb +96 -0
  204. data/lib/fluent/plugin/multi_output.rb +179 -0
  205. data/lib/fluent/plugin/out_buffer.rb +40 -0
  206. data/lib/fluent/plugin/out_copy.rb +120 -0
  207. data/lib/fluent/plugin/out_exec.rb +105 -0
  208. data/lib/fluent/plugin/out_exec_filter.rb +319 -0
  209. data/lib/fluent/plugin/out_file.rb +371 -0
  210. data/lib/fluent/plugin/out_forward/ack_handler.rb +176 -0
  211. data/lib/fluent/plugin/out_forward/connection_manager.rb +131 -0
  212. data/lib/fluent/plugin/out_forward/error.rb +28 -0
  213. data/lib/fluent/plugin/out_forward/failure_detector.rb +84 -0
  214. data/lib/fluent/plugin/out_forward/handshake_protocol.rb +125 -0
  215. data/lib/fluent/plugin/out_forward/load_balancer.rb +114 -0
  216. data/lib/fluent/plugin/out_forward/socket_cache.rb +177 -0
  217. data/lib/fluent/plugin/out_forward.rb +865 -0
  218. data/lib/fluent/plugin/out_http.rb +419 -0
  219. data/lib/fluent/plugin/out_null.rb +74 -0
  220. data/lib/fluent/plugin/out_relabel.rb +32 -0
  221. data/lib/fluent/plugin/out_roundrobin.rb +84 -0
  222. data/lib/fluent/plugin/out_secondary_file.rb +148 -0
  223. data/lib/fluent/plugin/out_stdout.rb +81 -0
  224. data/lib/fluent/plugin/out_stream.rb +130 -0
  225. data/lib/fluent/plugin/output.rb +1688 -0
  226. data/lib/fluent/plugin/owned_by_mixin.rb +41 -0
  227. data/lib/fluent/plugin/parser.rb +274 -0
  228. data/lib/fluent/plugin/parser_apache.rb +28 -0
  229. data/lib/fluent/plugin/parser_apache2.rb +88 -0
  230. data/lib/fluent/plugin/parser_apache_error.rb +26 -0
  231. data/lib/fluent/plugin/parser_csv.rb +124 -0
  232. data/lib/fluent/plugin/parser_json.rb +118 -0
  233. data/lib/fluent/plugin/parser_ltsv.rb +49 -0
  234. data/lib/fluent/plugin/parser_msgpack.rb +72 -0
  235. data/lib/fluent/plugin/parser_multiline.rb +152 -0
  236. data/lib/fluent/plugin/parser_nginx.rb +28 -0
  237. data/lib/fluent/plugin/parser_none.rb +36 -0
  238. data/lib/fluent/plugin/parser_regexp.rb +68 -0
  239. data/lib/fluent/plugin/parser_syslog.rb +543 -0
  240. data/lib/fluent/plugin/parser_tsv.rb +47 -0
  241. data/lib/fluent/plugin/sd_file.rb +157 -0
  242. data/lib/fluent/plugin/sd_srv.rb +135 -0
  243. data/lib/fluent/plugin/sd_static.rb +58 -0
  244. data/lib/fluent/plugin/service_discovery.rb +65 -0
  245. data/lib/fluent/plugin/socket_util.rb +22 -0
  246. data/lib/fluent/plugin/storage.rb +84 -0
  247. data/lib/fluent/plugin/storage_local.rb +166 -0
  248. data/lib/fluent/plugin/string_util.rb +22 -0
  249. data/lib/fluent/plugin.rb +206 -0
  250. data/lib/fluent/plugin_helper/cert_option.rb +199 -0
  251. data/lib/fluent/plugin_helper/child_process.rb +369 -0
  252. data/lib/fluent/plugin_helper/compat_parameters.rb +343 -0
  253. data/lib/fluent/plugin_helper/counter.rb +51 -0
  254. data/lib/fluent/plugin_helper/event_emitter.rb +112 -0
  255. data/lib/fluent/plugin_helper/event_loop.rb +170 -0
  256. data/lib/fluent/plugin_helper/extract.rb +104 -0
  257. data/lib/fluent/plugin_helper/formatter.rb +147 -0
  258. data/lib/fluent/plugin_helper/http_server/app.rb +81 -0
  259. data/lib/fluent/plugin_helper/http_server/methods.rb +35 -0
  260. data/lib/fluent/plugin_helper/http_server/request.rb +53 -0
  261. data/lib/fluent/plugin_helper/http_server/router.rb +54 -0
  262. data/lib/fluent/plugin_helper/http_server/server.rb +116 -0
  263. data/lib/fluent/plugin_helper/http_server/ssl_context_builder.rb +41 -0
  264. data/lib/fluent/plugin_helper/http_server.rb +129 -0
  265. data/lib/fluent/plugin_helper/inject.rb +154 -0
  266. data/lib/fluent/plugin_helper/metrics.rb +136 -0
  267. data/lib/fluent/plugin_helper/parser.rb +147 -0
  268. data/lib/fluent/plugin_helper/record_accessor.rb +207 -0
  269. data/lib/fluent/plugin_helper/retry_state.rb +219 -0
  270. data/lib/fluent/plugin_helper/server.rb +840 -0
  271. data/lib/fluent/plugin_helper/service_discovery/manager.rb +146 -0
  272. data/lib/fluent/plugin_helper/service_discovery/round_robin_balancer.rb +43 -0
  273. data/lib/fluent/plugin_helper/service_discovery.rb +125 -0
  274. data/lib/fluent/plugin_helper/socket.rb +288 -0
  275. data/lib/fluent/plugin_helper/socket_option.rb +98 -0
  276. data/lib/fluent/plugin_helper/storage.rb +349 -0
  277. data/lib/fluent/plugin_helper/thread.rb +180 -0
  278. data/lib/fluent/plugin_helper/timer.rb +92 -0
  279. data/lib/fluent/plugin_helper.rb +75 -0
  280. data/lib/fluent/plugin_id.rb +93 -0
  281. data/lib/fluent/process.rb +22 -0
  282. data/lib/fluent/registry.rb +117 -0
  283. data/lib/fluent/root_agent.rb +468 -0
  284. data/lib/fluent/rpc.rb +95 -0
  285. data/lib/fluent/source_only_buffer_agent.rb +102 -0
  286. data/lib/fluent/static_config_analysis.rb +195 -0
  287. data/lib/fluent/supervisor.rb +1347 -0
  288. data/lib/fluent/system_config.rb +213 -0
  289. data/lib/fluent/test/base.rb +83 -0
  290. data/lib/fluent/test/driver/base.rb +231 -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 +61 -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 +138 -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 +44 -0
  310. data/lib/fluent/test.rb +61 -0
  311. data/lib/fluent/time.rb +513 -0
  312. data/lib/fluent/timezone.rb +171 -0
  313. data/lib/fluent/tls.rb +105 -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/win32api.rb +38 -0
  318. data/lib/fluent/winsvc.rb +130 -0
  319. data/templates/new_gem/.gitignore +8 -0
  320. data/templates/new_gem/Gemfile +3 -0
  321. data/templates/new_gem/README.md.erb +43 -0
  322. data/templates/new_gem/Rakefile +13 -0
  323. data/templates/new_gem/fluent-plugin.gemspec.erb +28 -0
  324. data/templates/new_gem/lib/fluent/plugin/filter.rb.erb +14 -0
  325. data/templates/new_gem/lib/fluent/plugin/formatter.rb.erb +14 -0
  326. data/templates/new_gem/lib/fluent/plugin/input.rb.erb +11 -0
  327. data/templates/new_gem/lib/fluent/plugin/output.rb.erb +11 -0
  328. data/templates/new_gem/lib/fluent/plugin/parser.rb.erb +15 -0
  329. data/templates/new_gem/lib/fluent/plugin/storage.rb.erb +40 -0
  330. data/templates/new_gem/test/helper.rb.erb +7 -0
  331. data/templates/new_gem/test/plugin/test_filter.rb.erb +18 -0
  332. data/templates/new_gem/test/plugin/test_formatter.rb.erb +18 -0
  333. data/templates/new_gem/test/plugin/test_input.rb.erb +18 -0
  334. data/templates/new_gem/test/plugin/test_output.rb.erb +18 -0
  335. data/templates/new_gem/test/plugin/test_parser.rb.erb +18 -0
  336. data/templates/new_gem/test/plugin/test_storage.rb.erb +18 -0
  337. data/templates/plugin_config_formatter/param.md-compact.erb +25 -0
  338. data/templates/plugin_config_formatter/param.md-table.erb +10 -0
  339. data/templates/plugin_config_formatter/param.md.erb +34 -0
  340. data/templates/plugin_config_formatter/section.md.erb +12 -0
  341. metadata +996 -0
@@ -0,0 +1,230 @@
1
+ #
2
+ # Fluentd
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #
16
+
17
+ require 'fluent/plugin/input'
18
+ require 'fluent/event'
19
+ require 'fluent/plugin/buffer'
20
+ require 'fluent/clock'
21
+
22
+ module Fluent::Plugin
23
+ class TailInput < Fluent::Plugin::Input
24
+ # LineFeeder provides the built-in line parsing and emitting for TailInput.
25
+ # To preserve compatibility with TailInput subclasses, TailInput passes its
26
+ # line-processing methods as handlers. This keeps subclass overrides in the
27
+ # call path, and super reaches this built-in implementation.
28
+ class LineFeeder
29
+ def initialize(parser:, router_provider:, log:, tag:, tag_prefix:, tag_suffix:, path_key:, emit_unmatched_lines:, multiline_mode:, parse_handler: nil, convert_handler: nil, flush_handler: nil)
30
+ @parser = parser
31
+ @router_provider = router_provider
32
+ @log = log
33
+ @tag = tag
34
+ @tag_prefix = tag_prefix
35
+ @tag_suffix = tag_suffix
36
+ @path_key = path_key
37
+ @emit_unmatched_lines = emit_unmatched_lines
38
+ @multiline_mode = multiline_mode
39
+ @parse_handler = parse_handler || if multiline_mode
40
+ method(:parse_multilines)
41
+ else
42
+ method(:parse_singleline)
43
+ end
44
+ @convert_handler = convert_handler || method(:convert_line_to_event)
45
+ @flush_handler = flush_handler || method(:flush_buffer)
46
+ end
47
+
48
+ # Builds a per-file feed. The flush interval applies only to multiline
49
+ # parsers with a firstline.
50
+ def new_file_feed(flush_interval: nil)
51
+ timer_flush_interval = (@multiline_mode && @parser.has_firstline?) ? flush_interval : nil
52
+ FileFeed.new(self, flush_interval: timer_flush_interval, flush_handler: @flush_handler)
53
+ end
54
+
55
+ # Parses and emits a batch for FileFeed and legacy watchers.
56
+ # The flush deadline is started by #parse_multilines for compatibility.
57
+ # @return true if no error or unrecoverable error happens in emit action. false if got BufferOverflowError
58
+ def feed_lines(lines, tail_watcher)
59
+ emit(parse(lines, tail_watcher), tail_watcher)
60
+ end
61
+
62
+ def parse(lines, tail_watcher)
63
+ @parse_handler.call(lines, tail_watcher)
64
+ end
65
+
66
+ # Emits the events returned by #parse, with the tag of the file of the
67
+ # watcher which the lines were read from.
68
+ # @return true if no error or unrecoverable error happens in emit action. false if got BufferOverflowError
69
+ def emit(es, tail_watcher)
70
+ return true if es.empty?
71
+
72
+ begin
73
+ @router_provider.call.emit_stream(tag_for(tail_watcher), es)
74
+ rescue Fluent::Plugin::Buffer::BufferOverflowError
75
+ return false
76
+ rescue
77
+ # ignore non BufferQueueLimitError errors because in_tail can't recover. Engine shows logs and backtraces.
78
+ return true
79
+ end
80
+
81
+ return true
82
+ end
83
+
84
+ def flush_buffer(tw, buf)
85
+ buf.chomp!
86
+ @parser.parse(buf) { |time, record|
87
+ if time && record
88
+ record[@path_key] ||= tw.path unless @path_key.nil?
89
+ @router_provider.call.emit(tag_for(tw), time, record)
90
+ else
91
+ if @emit_unmatched_lines
92
+ record = { 'unmatched_line' => buf }
93
+ record[@path_key] ||= tw.path unless @path_key.nil?
94
+ @router_provider.call.emit(tag_for(tw), Fluent::EventTime.now, record)
95
+ end
96
+ @log.warn "got incomplete line at shutdown from #{tw.path}: #{buf.inspect}"
97
+ end
98
+ }
99
+ end
100
+
101
+ # Per-file state replacing TailWatcher::LineBufferTimerFlusher.
102
+ class FileFeed
103
+ attr_accessor :line_buffer
104
+
105
+ def initialize(line_feeder, flush_interval:, flush_handler:)
106
+ @line_feeder = line_feeder
107
+ @flush_interval = flush_interval
108
+ @flush_handler = flush_handler
109
+ @line_buffer = nil
110
+ @start = nil
111
+ end
112
+
113
+ # @return true if no error or unrecoverable error happens in emit action. false if got BufferOverflowError
114
+ def feed_lines(lines, tail_watcher)
115
+ @line_feeder.feed_lines(lines, tail_watcher)
116
+ end
117
+
118
+ def on_notify(tail_watcher)
119
+ return unless @start
120
+
121
+ if Fluent::Clock.now - @start >= @flush_interval
122
+ flush_buffer(@line_buffer, tail_watcher) if @line_buffer
123
+ @line_buffer = nil
124
+ @start = nil
125
+ end
126
+ end
127
+
128
+ def close(tail_watcher)
129
+ return unless @line_buffer
130
+
131
+ flush_buffer(@line_buffer, tail_watcher)
132
+ @line_buffer = nil
133
+ end
134
+
135
+ def flush_buffer(buf, tail_watcher)
136
+ @flush_handler.call(tail_watcher, buf)
137
+ end
138
+
139
+ # Starts the flush deadline. Overrides that do not call super may call
140
+ # this method to preserve the old timer behavior.
141
+ def reset_timer
142
+ return unless @flush_interval
143
+
144
+ @start = Fluent::Clock.now
145
+ end
146
+ end
147
+
148
+ def convert_line_to_event(line, es, tail_watcher)
149
+ begin
150
+ line.chomp! # remove \n
151
+ @parser.parse(line) { |time, record|
152
+ if time && record
153
+ record[@path_key] ||= tail_watcher.path unless @path_key.nil?
154
+ es.add(time, record)
155
+ else
156
+ if @emit_unmatched_lines
157
+ record = {'unmatched_line' => line}
158
+ record[@path_key] ||= tail_watcher.path unless @path_key.nil?
159
+ es.add(Fluent::EventTime.now, record)
160
+ end
161
+ @log.warn { "pattern not matched: #{line.inspect}" }
162
+ end
163
+ }
164
+ rescue => e
165
+ @log.warn 'invalid line found', file: tail_watcher.path, line: line, error: e.to_s
166
+ @log.debug_backtrace(e.backtrace)
167
+ end
168
+ end
169
+
170
+ def parse_singleline(lines, tail_watcher)
171
+ es = Fluent::MultiEventStream.new
172
+ lines.each { |line|
173
+ @convert_handler.call(line, es, tail_watcher)
174
+ }
175
+ es
176
+ end
177
+
178
+ # Parses multiline input and starts the flush deadline before parsing, as
179
+ # TailInput#parse_multilines did before LineFeeder was extracted.
180
+ def parse_multilines(lines, tail_watcher)
181
+ file_feed = tail_watcher.file_feed
182
+ lb = file_feed.line_buffer
183
+ es = Fluent::MultiEventStream.new
184
+ if @parser.has_firstline?
185
+ file_feed.reset_timer
186
+ lines.each { |line|
187
+ if @parser.firstline?(line)
188
+ if lb
189
+ @convert_handler.call(lb, es, tail_watcher)
190
+ end
191
+ lb = line
192
+ else
193
+ if lb.nil?
194
+ if @emit_unmatched_lines
195
+ @convert_handler.call(line, es, tail_watcher)
196
+ end
197
+ @log.warn "got incomplete line before first line from #{tail_watcher.path}: #{line.inspect}"
198
+ else
199
+ lb << line
200
+ end
201
+ end
202
+ }
203
+ else
204
+ lb ||= ''
205
+ lines.each do |line|
206
+ lb << line
207
+ @parser.parse(lb) { |time, record|
208
+ if time && record
209
+ @convert_handler.call(lb, es, tail_watcher)
210
+ lb = ''
211
+ end
212
+ }
213
+ end
214
+ end
215
+ file_feed.line_buffer = lb
216
+ es
217
+ end
218
+
219
+ private
220
+
221
+ def tag_for(tw)
222
+ if @tag_prefix || @tag_suffix
223
+ @tag_prefix + tw.tag + @tag_suffix
224
+ else
225
+ @tag
226
+ end
227
+ end
228
+ end
229
+ end
230
+ end
@@ -0,0 +1,269 @@
1
+ #
2
+ # Fluentd
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #
16
+
17
+ require 'fluent/plugin/input'
18
+
19
+ module Fluent::Plugin
20
+ class TailInput < Fluent::Plugin::Input
21
+ class PositionFile
22
+ UNWATCHED_POSITION = 0xffffffffffffffff
23
+ POSITION_FILE_ENTRY_REGEX = /^([^\t]+)\t([0-9a-fA-F]+)\t([0-9a-fA-F]+)/.freeze
24
+
25
+ def self.load(file, follow_inodes, existing_targets, logger:)
26
+ pf = new(file, follow_inodes, logger: logger)
27
+ pf.load(existing_targets)
28
+ pf
29
+ end
30
+
31
+ def initialize(file, follow_inodes, logger: nil)
32
+ @file = file
33
+ @logger = logger
34
+ @file_mutex = Mutex.new
35
+ @map = {}
36
+ @follow_inodes = follow_inodes
37
+ end
38
+
39
+ def [](target_info)
40
+ if m = @map[@follow_inodes ? target_info.ino : target_info.path]
41
+ return m
42
+ end
43
+
44
+ @file_mutex.synchronize {
45
+ @file.seek(0, IO::SEEK_END)
46
+ seek = @file.pos + target_info.path.bytesize + 1
47
+ @file.write "#{target_info.path}\t0000000000000000\t0000000000000000\n"
48
+ if @follow_inodes
49
+ @map[target_info.ino] = FilePositionEntry.new(@file, @file_mutex, seek, 0, 0)
50
+ else
51
+ @map[target_info.path] = FilePositionEntry.new(@file, @file_mutex, seek, 0, 0)
52
+ end
53
+ }
54
+ end
55
+
56
+ def unwatch_removed_targets(existing_targets)
57
+ @map.reject { |key, entry|
58
+ existing_targets.key?(key)
59
+ }.each_key { |key|
60
+ unwatch_key(key)
61
+ }
62
+ end
63
+
64
+ def unwatch(target_info)
65
+ unwatch_key(@follow_inodes ? target_info.ino : target_info.path)
66
+ end
67
+
68
+ def load(existing_targets = nil)
69
+ compact(existing_targets)
70
+
71
+ map = {}
72
+ @file_mutex.synchronize do
73
+ @file.pos = 0
74
+
75
+ @file.each_line do |line|
76
+ m = POSITION_FILE_ENTRY_REGEX.match(line)
77
+ next if m.nil?
78
+
79
+ path = m[1]
80
+ pos = m[2].to_i(16)
81
+ ino = m[3].to_i(16)
82
+ seek = @file.pos - line.bytesize + path.bytesize + 1
83
+ if @follow_inodes
84
+ map[ino] = FilePositionEntry.new(@file, @file_mutex, seek, pos, ino)
85
+ else
86
+ map[path] = FilePositionEntry.new(@file, @file_mutex, seek, pos, ino)
87
+ end
88
+ end
89
+ end
90
+
91
+ @map = map
92
+ end
93
+
94
+ # This method is similar to #compact but it tries to get less lock to avoid a lock contention
95
+ def try_compact
96
+ last_modified = nil
97
+ size = nil
98
+
99
+ @file_mutex.synchronize do
100
+ size = @file.size
101
+ last_modified = @file.mtime
102
+ end
103
+
104
+ entries = fetch_compacted_entries
105
+ @logger&.debug "Compacted entries: ", entries.keys
106
+
107
+ @file_mutex.synchronize do
108
+ if last_modified == @file.mtime && size == @file.size
109
+ @file.pos = 0
110
+ @file.truncate(0)
111
+ @file.write(entries.values.map(&:to_entry_fmt).join)
112
+
113
+ # entry contains path/ino key and value.
114
+ entries.each do |key, val|
115
+ if (m = @map[key])
116
+ m.seek = val.seek
117
+ end
118
+ end
119
+ else
120
+ # skip
121
+ end
122
+ end
123
+ end
124
+
125
+ private
126
+
127
+ def unwatch_key(key)
128
+ if (entry = @map.delete(key))
129
+ entry.update_pos(UNWATCHED_POSITION)
130
+ end
131
+ end
132
+
133
+ def compact(existing_targets = nil)
134
+ @file_mutex.synchronize do
135
+ entries = fetch_compacted_entries
136
+ @logger&.debug "Compacted entries: ", entries.keys
137
+
138
+ if existing_targets
139
+ entries = remove_deleted_files_entries(entries, existing_targets)
140
+ @logger&.debug "Remove missing entries.",
141
+ existing_targets: existing_targets.keys,
142
+ entries_after_removing: entries.keys
143
+ end
144
+
145
+ @file.pos = 0
146
+ @file.truncate(0)
147
+ @file.write(entries.values.map(&:to_entry_fmt).join)
148
+ end
149
+ end
150
+
151
+ def fetch_compacted_entries
152
+ entries = {}
153
+
154
+ @file.pos = 0
155
+ file_pos = 0
156
+ @file.each_line do |line|
157
+ m = POSITION_FILE_ENTRY_REGEX.match(line)
158
+ if m.nil?
159
+ @logger.warn "Unparsable line in pos_file: #{line}" if @logger
160
+ next
161
+ end
162
+
163
+ path = m[1]
164
+ pos = m[2].to_i(16)
165
+ ino = m[3].to_i(16)
166
+ if pos == UNWATCHED_POSITION
167
+ @logger.debug "Remove unwatched line from pos_file: #{line}" if @logger
168
+ else
169
+ if @follow_inodes
170
+ @logger&.warn("#{path} (inode: #{ino}) already exists. use latest one: deleted #{entries[ino]}") if entries.include?(ino)
171
+ entries[ino] = Entry.new(path, pos, ino, file_pos + path.bytesize + 1)
172
+ else
173
+ @logger&.warn("#{path} already exists. use latest one: deleted #{entries[path]}") if entries.include?(path)
174
+ entries[path] = Entry.new(path, pos, ino, file_pos + path.bytesize + 1)
175
+ end
176
+ file_pos += line.size
177
+ end
178
+ end
179
+
180
+ entries
181
+ end
182
+
183
+ def remove_deleted_files_entries(existent_entries, existing_targets)
184
+ existent_entries.select { |path_or_ino|
185
+ existing_targets.key?(path_or_ino)
186
+ }
187
+ end
188
+ end
189
+
190
+ Entry = Struct.new(:path, :pos, :ino, :seek) do
191
+ POSITION_FILE_ENTRY_FORMAT = "%s\t%016x\t%016x\n".freeze
192
+
193
+ def to_entry_fmt
194
+ POSITION_FILE_ENTRY_FORMAT % [path, pos, ino]
195
+ end
196
+ end
197
+
198
+ # pos inode
199
+ # ffffffffffffffff\tffffffffffffffff\n
200
+ class FilePositionEntry
201
+ POS_SIZE = 16
202
+ INO_OFFSET = 17
203
+ INO_SIZE = 16
204
+ LN_OFFSET = 33
205
+ SIZE = 34
206
+
207
+ def initialize(file, file_mutex, seek, pos, inode)
208
+ @file = file
209
+ @file_mutex = file_mutex
210
+ @seek = seek
211
+ @pos = pos
212
+ @inode = inode
213
+ end
214
+
215
+ attr_writer :seek
216
+
217
+ def update(ino, pos)
218
+ @file_mutex.synchronize {
219
+ @file.pos = @seek
220
+ @file.write "%016x\t%016x" % [pos, ino]
221
+ }
222
+ @pos = pos
223
+ @inode = ino
224
+ end
225
+
226
+ def update_pos(pos)
227
+ @file_mutex.synchronize {
228
+ @file.pos = @seek
229
+ @file.write "%016x" % pos
230
+ }
231
+ @pos = pos
232
+ end
233
+
234
+ def read_inode
235
+ @inode
236
+ end
237
+
238
+ def read_pos
239
+ @pos
240
+ end
241
+ end
242
+
243
+ class MemoryPositionEntry
244
+ def initialize
245
+ @pos = 0
246
+ @inode = 0
247
+ end
248
+
249
+ def update(ino, pos)
250
+ @inode = ino
251
+ @pos = pos
252
+ end
253
+
254
+ def update_pos(pos)
255
+ @pos = pos
256
+ end
257
+
258
+ def read_pos
259
+ @pos
260
+ end
261
+
262
+ def read_inode
263
+ @inode
264
+ end
265
+ end
266
+
267
+ TargetInfo = Struct.new(:path, :ino)
268
+ end
269
+ end
@@ -0,0 +1,52 @@
1
+ #
2
+ # Fluentd
3
+ #
4
+ # Licensed under the Apache License, Version 2.0 (the "License");
5
+ # you may not use this file except in compliance with the License.
6
+ # You may obtain a copy of the License at
7
+ #
8
+ # http://www.apache.org/licenses/LICENSE-2.0
9
+ #
10
+ # Unless required by applicable law or agreed to in writing, software
11
+ # distributed under the License is distributed on an "AS IS" BASIS,
12
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ # See the License for the specific language governing permissions and
14
+ # limitations under the License.
15
+ #
16
+
17
+ require 'fluent/plugin/input'
18
+ require 'cool.io'
19
+
20
+ module Fluent::Plugin
21
+ class TailInput < Fluent::Plugin::Input
22
+ class StatWatcher < Coolio::StatWatcher
23
+ def initialize(path, log, &callback)
24
+ @callback = callback
25
+ @log = log
26
+ super(path)
27
+ end
28
+
29
+ def on_change(prev, cur)
30
+ @callback.call
31
+ rescue
32
+ @log.error $!.to_s
33
+ @log.error_backtrace
34
+ end
35
+ end
36
+
37
+ class TimerTrigger < Coolio::TimerWatcher
38
+ def initialize(interval, log, repeat: true, &callback)
39
+ @log = log
40
+ @callback = callback
41
+ super(interval, repeat)
42
+ end
43
+
44
+ def on_timer
45
+ @callback.call
46
+ rescue => e
47
+ @log.error e.to_s
48
+ @log.error_backtrace
49
+ end
50
+ end
51
+ end
52
+ end