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,346 @@
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/config/error'
19
+ require 'fluent/plugin/parser'
20
+
21
+ require 'json'
22
+
23
+ module Fluent::Plugin
24
+ class SyslogInput < Input
25
+ Fluent::Plugin.register_input('syslog', self)
26
+
27
+ helpers :parser, :compat_parameters, :server
28
+
29
+ DEFAULT_PARSER = 'syslog'
30
+ SYSLOG_REGEXP = /^\<([0-9]+)\>(.*)/
31
+
32
+ FACILITY_MAP = {
33
+ 0 => 'kern',
34
+ 1 => 'user',
35
+ 2 => 'mail',
36
+ 3 => 'daemon',
37
+ 4 => 'auth',
38
+ 5 => 'syslog',
39
+ 6 => 'lpr',
40
+ 7 => 'news',
41
+ 8 => 'uucp',
42
+ 9 => 'cron',
43
+ 10 => 'authpriv',
44
+ 11 => 'ftp',
45
+ 12 => 'ntp',
46
+ 13 => 'audit',
47
+ 14 => 'alert',
48
+ 15 => 'at',
49
+ 16 => 'local0',
50
+ 17 => 'local1',
51
+ 18 => 'local2',
52
+ 19 => 'local3',
53
+ 20 => 'local4',
54
+ 21 => 'local5',
55
+ 22 => 'local6',
56
+ 23 => 'local7'
57
+ }
58
+
59
+ SEVERITY_MAP = {
60
+ 0 => 'emerg',
61
+ 1 => 'alert',
62
+ 2 => 'crit',
63
+ 3 => 'err',
64
+ 4 => 'warn',
65
+ 5 => 'notice',
66
+ 6 => 'info',
67
+ 7 => 'debug'
68
+ }
69
+
70
+ desc 'The port to listen to.'
71
+ config_param :port, :integer, default: 5140
72
+ desc 'The bind address to listen to.'
73
+ config_param :bind, :string, default: '0.0.0.0'
74
+ desc 'The prefix of the tag. The tag itself is generated by the tag prefix, facility level, and priority.'
75
+ config_param :tag, :string
76
+ desc 'The transport protocol used to receive logs.(udp, tcp)'
77
+ config_param :protocol_type, :enum, list: [:tcp, :udp], default: nil, deprecated: "use transport directive"
78
+ desc 'The message frame type.(traditional, octet_count)'
79
+ config_param :frame_type, :enum, list: [:traditional, :octet_count], default: :traditional
80
+
81
+ desc 'If true, add source host to event record.'
82
+ config_param :include_source_host, :bool, default: false, deprecated: 'use "source_hostname_key" or "source_address_key" instead.'
83
+ desc 'Specify key of source host when include_source_host is true.'
84
+ config_param :source_host_key, :string, default: 'source_host'.freeze
85
+ desc 'Enable the option to emit unmatched lines.'
86
+ config_param :emit_unmatched_lines, :bool, default: false
87
+
88
+ desc 'The field name of hostname of sender.'
89
+ config_param :source_hostname_key, :string, default: nil
90
+ desc 'Try to resolve hostname from IP addresses or not.'
91
+ config_param :resolve_hostname, :bool, default: nil
92
+ desc 'Check the remote connection is still available by sending a keepalive packet if this value is true.'
93
+ config_param :send_keepalive_packet, :bool, default: false
94
+ desc 'The field name of source address of sender.'
95
+ config_param :source_address_key, :string, default: nil
96
+ desc 'The field name of the severity.'
97
+ config_param :severity_key, :string, default: nil, alias: :priority_key
98
+ desc 'The field name of the facility.'
99
+ config_param :facility_key, :string, default: nil
100
+
101
+ desc "The max bytes of message. The messages exceeding this limit are dropped (UDP, TCP/TLS with traditional frame_type) or the connection is closed (TCP/TLS with octet_count frame_type)."
102
+ config_param :message_length_limit, :size, default: 8192
103
+
104
+ config_param :blocking_timeout, :time, default: 0.5
105
+
106
+ desc 'The delimiter value "\n"'
107
+ config_param :delimiter, :string, default: "\n" # syslog family add "\n" to each message
108
+
109
+ config_section :parse do
110
+ config_set_default :@type, DEFAULT_PARSER
111
+ config_param :with_priority, :bool, default: true
112
+ end
113
+
114
+ # overwrite server plugin to change default to :udp
115
+ config_section :transport, required: false, multi: false, init: true, param_name: :transport_config do
116
+ config_argument :protocol, :enum, list: [:tcp, :udp, :tls], default: :udp
117
+ end
118
+
119
+ def configure(conf)
120
+ compat_parameters_convert(conf, :parser)
121
+
122
+ super
123
+
124
+ if conf.has_key?('priority_key')
125
+ log.warn "priority_key is deprecated. Use severity_key instead"
126
+ end
127
+
128
+ @use_default = false
129
+
130
+ @parser = parser_create
131
+ @parser_parse_priority = @parser.respond_to?(:with_priority) && @parser.with_priority
132
+
133
+ if @include_source_host
134
+ if @source_address_key
135
+ raise Fluent::ConfigError, "specify either source_address_key or include_source_host"
136
+ end
137
+ @source_address_key = @source_host_key
138
+ end
139
+ if @source_hostname_key
140
+ if @resolve_hostname.nil?
141
+ @resolve_hostname = true
142
+ elsif !@resolve_hostname # user specifies "false" in config
143
+ raise Fluent::ConfigError, "resolve_hostname must be true with source_hostname_key"
144
+ end
145
+ end
146
+
147
+ @_event_loop_run_timeout = @blocking_timeout
148
+
149
+ protocol = @protocol_type || @transport_config.protocol
150
+ if @send_keepalive_packet && protocol == :udp
151
+ raise Fluent::ConfigError, "send_keepalive_packet is available for tcp/tls"
152
+ end
153
+ end
154
+
155
+ def multi_workers_ready?
156
+ true
157
+ end
158
+
159
+ def zero_downtime_restart_ready?
160
+ true
161
+ end
162
+
163
+ def start
164
+ super
165
+
166
+ log.info "listening syslog socket on #{@bind}:#{@port} with #{@protocol_type || @transport_config.protocol}"
167
+ case @protocol_type || @transport_config.protocol
168
+ when :udp then start_udp_server
169
+ when :tcp then start_tcp_server
170
+ when :tls then start_tcp_server(tls: true)
171
+ else
172
+ raise "BUG: invalid transport value: #{@protocol_type || @transport_config.protocol}"
173
+ end
174
+ end
175
+
176
+ def start_udp_server
177
+ server_create_udp(:in_syslog_udp_server, @port, bind: @bind, max_bytes: @message_length_limit, resolve_name: @resolve_hostname) do |data, sock|
178
+ message_handler(data.chomp, sock)
179
+ end
180
+ end
181
+
182
+ def start_tcp_server(tls: false)
183
+ octet_count_frame = @frame_type == :octet_count
184
+
185
+ delimiter = octet_count_frame ? " " : @delimiter
186
+ delimiter_size = delimiter.size
187
+ server_create_connection(
188
+ tls ? :in_syslog_tls_server : :in_syslog_tcp_server, @port,
189
+ bind: @bind,
190
+ resolve_name: @resolve_hostname,
191
+ send_keepalive_packet: @send_keepalive_packet
192
+ ) do |conn|
193
+ discard_till_next_delimiter = false
194
+ conn.data do |data|
195
+ buffer = conn.buffer
196
+ buffer << data
197
+ pos = 0
198
+ if octet_count_frame
199
+ # Once an octet-counted stream contains an untrustworthy frame header, the stream
200
+ # can't be resynchronized. So close the connection instead of skipping bytes.
201
+ close_connection = false
202
+ while idx = buffer.index(delimiter, pos)
203
+ begin
204
+ num = Integer(buffer[pos..idx])
205
+ rescue ArgumentError
206
+ log.info "The message length is not a number, closing connection"
207
+ log.on_debug { log.debug "The message length is not a number:", head: buffer[pos, 32].dump }
208
+ close_connection = true
209
+ break
210
+ end
211
+
212
+ if num < 0
213
+ log.info "The message length is negative, closing connection:", size: num
214
+ close_connection = true
215
+ break
216
+ end
217
+
218
+ if num > @message_length_limit
219
+ log.info "The message length exceeds 'message_length_limit', closing connection:", limit: @message_length_limit, size: num
220
+ close_connection = true
221
+ break
222
+ end
223
+
224
+ msg = buffer[idx + delimiter_size, num]
225
+ if msg.size != num
226
+ # The frame is not fully received yet.
227
+ break
228
+ end
229
+
230
+ pos = idx + delimiter_size + num
231
+ message_handler(msg, conn)
232
+ end
233
+ buffer.slice!(0, pos) if pos > 0
234
+
235
+ # If the remaining buffer has no delimiter, no message length can be parsed from it.
236
+ # Since a valid frame header is much shorter than the limit, such a buffer never
237
+ # becomes a valid frame. (Note that a partially received valid frame always has a
238
+ # delimiter after its length, so this doesn't drop it even if it slightly exceeds
239
+ # the limit with its length header.)
240
+ if !close_connection && !buffer.index(delimiter) && buffer.bytesize > @message_length_limit
241
+ log.info "The buffer size exceeds 'message_length_limit', closing connection:", limit: @message_length_limit, size: buffer.bytesize
242
+ log.on_debug { log.debug "The buffer size exceeds 'message_length_limit':", head: buffer[...32] }
243
+ close_connection = true
244
+ end
245
+
246
+ if close_connection
247
+ buffer.clear
248
+ conn.close
249
+ next
250
+ end
251
+ else
252
+ while idx = buffer.index(delimiter, pos)
253
+ msg = buffer[pos...idx]
254
+ pos = idx + delimiter_size
255
+
256
+ if discard_till_next_delimiter
257
+ discard_till_next_delimiter = false
258
+ next
259
+ end
260
+
261
+ if msg.bytesize > @message_length_limit
262
+ log.info "The received data is larger than 'message_length_limit', dropped:", limit: @message_length_limit, size: msg.bytesize
263
+ log.on_debug { log.debug "The received data is larger than 'message_length_limit':", head: msg[...32] }
264
+ next
265
+ end
266
+
267
+ message_handler(msg, conn)
268
+ end
269
+ buffer.slice!(0, pos) if pos > 0
270
+
271
+ # If the buffer size exceeds the limit here, it means that the next message will
272
+ # definitely exceed the limit. So we should clear the buffer here. Otherwise, it will
273
+ # keep storing useless data until the next delimiter comes.
274
+ if buffer.bytesize > @message_length_limit
275
+ log.info "The buffer size exceeds 'message_length_limit', cleared:", limit: @message_length_limit, size: buffer.bytesize
276
+ log.on_debug { log.debug "The buffer size exceeds 'message_length_limit':", head: buffer[...32] }
277
+ buffer.clear
278
+ # We should discard the subsequent data until the next delimiter comes.
279
+ discard_till_next_delimiter = true
280
+ end
281
+ end
282
+ end
283
+ end
284
+ end
285
+
286
+ private
287
+
288
+ def emit_unmatched(data, sock)
289
+ record = {"unmatched_line" => data}
290
+ record[@source_address_key] = sock.remote_addr if @source_address_key
291
+ record[@source_hostname_key] = sock.remote_host if @source_hostname_key
292
+ emit("#{@tag}.unmatched", Fluent::EventTime.now, record)
293
+ end
294
+
295
+ def message_handler(data, sock)
296
+ pri = nil
297
+ text = data
298
+ unless @parser_parse_priority
299
+ m = SYSLOG_REGEXP.match(data)
300
+ unless m
301
+ if @emit_unmatched_lines
302
+ emit_unmatched(data, sock)
303
+ end
304
+ log.warn "invalid syslog message: #{data.dump}"
305
+ return
306
+ end
307
+ pri = m[1].to_i
308
+ text = m[2]
309
+ end
310
+
311
+ @parser.parse(text) do |time, record|
312
+ unless time && record
313
+ if @emit_unmatched_lines
314
+ emit_unmatched(data, sock)
315
+ end
316
+ log.warn "failed to parse message", data: data
317
+ return
318
+ end
319
+
320
+ pri ||= record.delete('pri')
321
+ facility = FACILITY_MAP[pri >> 3]
322
+ severity = SEVERITY_MAP[pri & 0b111]
323
+
324
+ record[@severity_key] = severity if @severity_key
325
+ record[@facility_key] = facility if @facility_key
326
+ record[@source_address_key] = sock.remote_addr if @source_address_key
327
+ record[@source_hostname_key] = sock.remote_host if @source_hostname_key
328
+
329
+ tag = "#{@tag}.#{facility}.#{severity}"
330
+ emit(tag, time, record)
331
+ end
332
+ rescue => e
333
+ if @emit_unmatched_lines
334
+ emit_unmatched(data, sock)
335
+ end
336
+ log.error "invalid input", data: data, error: e
337
+ log.error_backtrace
338
+ end
339
+
340
+ def emit(tag, time, record)
341
+ router.emit(tag, time, record)
342
+ rescue => e
343
+ log.error "syslog failed to emit", error: e, tag: tag, record: JSON.generate(record)
344
+ end
345
+ end
346
+ end
@@ -0,0 +1,111 @@
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/clock'
19
+
20
+ module Fluent::Plugin
21
+ class TailInput < Fluent::Plugin::Input
22
+ module Compatibility
23
+ # Keep these methods as compatibility entry points for plugins which
24
+ # inherit TailInput and override line processing methods. TailInput is a
25
+ # built-in plugin, not a public inheritance API, and these methods may be
26
+ # removed in a future release.
27
+ def flush_buffer(tw, buf)
28
+ @line_feeder.flush_buffer(tw, buf)
29
+ end
30
+
31
+ # Feeds lines through the per-file feed, or through LineFeeder for watchers
32
+ # created by plugins using the deprecated LineBufferTimerFlusher.
33
+ #
34
+ # @return true if no error or unrecoverable error happens in emit action. false if got BufferOverflowError
35
+ def receive_lines(lines, tail_watcher)
36
+ return async_receive_lines(lines, tail_watcher) if @worker_pool
37
+
38
+ file_feed = tail_watcher.file_feed
39
+ return file_feed.feed_lines(lines, tail_watcher) if file_feed.respond_to?(:feed_lines)
40
+
41
+ @line_feeder.feed_lines(lines, tail_watcher)
42
+ end
43
+
44
+ def convert_line_to_event(line, es, tail_watcher)
45
+ @line_feeder.convert_line_to_event(line, es, tail_watcher)
46
+ end
47
+
48
+ def parse_singleline(lines, tail_watcher)
49
+ @line_feeder.parse_singleline(lines, tail_watcher)
50
+ end
51
+
52
+ # TailInput's default #parse_multilines path starts the flush timer before
53
+ # parsing. An override that skips super must call
54
+ # tail_watcher.line_buffer_timer_flusher.reset_timer when needed.
55
+ def parse_multilines(lines, tail_watcher)
56
+ @line_feeder.parse_multilines(lines, tail_watcher)
57
+ end
58
+ end
59
+
60
+ class TailWatcher
61
+ # The object which keeps the line buffer of the multiline mode of the file:
62
+ # the FileFeed built by LineFeeder#new_file_feed, or the deprecated
63
+ # LineBufferTimerFlusher which a plugin overriding TailInput#setup_watcher
64
+ # passes to keep working without changes.
65
+ def line_buffer_timer_flusher
66
+ @file_feed
67
+ end
68
+
69
+ # Kept for compatibility with the plugins which build it by themselves and
70
+ # pass it to TailWatcher in the overridden TailInput#setup_watcher.
71
+ # LineFeeder#feed_lines feeds the lines of a watcher which keeps it, and
72
+ # LineFeeder::FileFeed built by LineFeeder#new_file_feed replaces it.
73
+ class LineBufferTimerFlusher
74
+ attr_accessor :line_buffer
75
+
76
+ def initialize(log, flush_interval, &flush_method)
77
+ @log = log
78
+ @flush_interval = flush_interval
79
+ @flush_method = flush_method
80
+ @start = nil
81
+ @line_buffer = nil
82
+ end
83
+
84
+ def on_notify(tw)
85
+ unless @start && @flush_method
86
+ return
87
+ end
88
+
89
+ if Fluent::Clock.now - @start >= @flush_interval
90
+ @flush_method.call(tw, @line_buffer) if @line_buffer
91
+ @line_buffer = nil
92
+ @start = nil
93
+ end
94
+ end
95
+
96
+ def close(tw)
97
+ return unless @line_buffer
98
+
99
+ @flush_method.call(tw, @line_buffer)
100
+ @line_buffer = nil
101
+ end
102
+
103
+ def reset_timer
104
+ return unless @flush_interval
105
+
106
+ @start = Fluent::Clock.now
107
+ end
108
+ end
109
+ end
110
+ end
111
+ end