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,543 @@
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/parser'
18
+
19
+ require 'fluent/time'
20
+
21
+ module Fluent
22
+ module Plugin
23
+ class SyslogParser < Parser
24
+ Plugin.register_parser('syslog', self)
25
+
26
+ # TODO: Remove them since these regexps are no longer needed. but keep them for compatibility for now
27
+ # From existence TextParser pattern
28
+ REGEXP = /^(?<time>[^ ]*\s*[^ ]* [^ ]*) (?<host>[^ ]*) (?<ident>[^ :\[]*)(?:\[(?<pid>[0-9]+)\])?(?:[^\:]*\:)? *(?<message>.*)$/
29
+ # From in_syslog default pattern
30
+ REGEXP_WITH_PRI = /^\<(?<pri>[0-9]+)\>(?<time>[^ ]* {1,2}[^ ]* [^ ]*) (?<host>[^ ]*) (?<ident>[^ :\[]*)(?:\[(?<pid>[0-9]+)\])?(?:[^\:]*\:)? *(?<message>.*)$/
31
+ REGEXP_RFC5424 = <<~'EOS'.chomp
32
+ (?<time>[^ ]+) (?<host>[!-~]{1,255}) (?<ident>[!-~]{1,48}) (?<pid>[!-~]{1,128}) (?<msgid>[!-~]{1,32}) (?<extradata>(?:\-|(?:\[.*?(?<!\\)\])+))(?: (?<message>.+))?
33
+ EOS
34
+ REGEXP_RFC5424_NO_PRI = Regexp.new(<<~'EOS'.chomp % REGEXP_RFC5424, Regexp::MULTILINE)
35
+ \A%s\z
36
+ EOS
37
+ REGEXP_RFC5424_WITH_PRI = Regexp.new(<<~'EOS'.chomp % REGEXP_RFC5424, Regexp::MULTILINE)
38
+ \A<(?<pri>[0-9]{1,3})\>[1-9]\d{0,2} %s\z
39
+ EOS
40
+
41
+ REGEXP_DETECT_RFC5424 = /^\<[0-9]{1,3}\>[1-9]\d{0,2}/
42
+
43
+ RFC3164_WITHOUT_TIME_AND_PRI_REGEXP = /(?<host>[^ ]*) (?<ident>[^ :\[]*)(?:\[(?<pid>[0-9]+)\])?(?:[^\:]*\:)? *(?<message>.*)$/
44
+ RFC3164_CAPTURES = RFC3164_WITHOUT_TIME_AND_PRI_REGEXP.names.freeze
45
+ RFC3164_PRI_REGEXP = /^<(?<pri>[0-9]{1,3})>/
46
+
47
+ RFC5424_WITHOUT_TIME_AND_PRI_REGEXP = /(?<host>[!-~]{1,255}) (?<ident>[!-~]{1,48}) (?<pid>[!-~]{1,128}) (?<msgid>[!-~]{1,32}) (?<extradata>(?:\-|(?:\[.*?(?<!\\)\])))(?: (?<message>.+))?\z/m
48
+ RFC5424_CAPTURES = RFC5424_WITHOUT_TIME_AND_PRI_REGEXP.names.freeze
49
+ RFC5424_PRI_REGEXP = /^<(?<pri>\d{1,3})>\d\d{0,2}\s/
50
+
51
+ config_set_default :time_format, "%b %d %H:%M:%S"
52
+ desc 'If the incoming logs have priority prefix, e.g. <9>, set true'
53
+ config_param :with_priority, :bool, default: false
54
+ desc 'Specify protocol format'
55
+ config_param :message_format, :enum, list: [:rfc3164, :rfc5424, :auto], default: :rfc3164
56
+ desc 'Specify time format for event time for rfc5424 protocol'
57
+ config_param :rfc5424_time_format, :string, default: "%Y-%m-%dT%H:%M:%S.%L%z"
58
+ desc 'The parser type used to parse syslog message'
59
+ config_param :parser_engine, :enum, list: [:regexp, :string], default: :regexp, alias: :parser_type
60
+ desc 'support colonless ident in string parser'
61
+ config_param :support_colonless_ident, :bool, default: true
62
+
63
+ def initialize
64
+ super
65
+ @mutex = Mutex.new
66
+ @regexp = nil
67
+ @regexp3164 = nil
68
+ @regexp5424 = nil
69
+ @regexp_parser = nil
70
+ @time_parser_rfc3164 = nil
71
+ @time_parser_rfc5424 = nil
72
+ @space_count_rfc3164 = nil
73
+ @space_count_rfc5424 = nil
74
+ @time_format_starts_with_space_rfc3164 = false
75
+ @skip_space_count_rfc3164 = false
76
+ @skip_space_count_rfc5424 = false
77
+ @time_parser_rfc5424_without_subseconds = nil
78
+ end
79
+
80
+ def configure(conf)
81
+ super
82
+
83
+ @regexp_parser = @parser_engine == :regexp
84
+ @regexp = case @message_format
85
+ when :rfc3164
86
+ if @regexp_parser
87
+ class << self
88
+ alias_method :parse, :parse_rfc3164_regex
89
+ end
90
+ else
91
+ class << self
92
+ alias_method :parse, :parse_rfc3164
93
+ end
94
+ end
95
+ setup_time_parser_3164(@time_format)
96
+ RFC3164_WITHOUT_TIME_AND_PRI_REGEXP
97
+ when :rfc5424
98
+ if @regexp_parser
99
+ class << self
100
+ alias_method :parse, :parse_rfc5424_regex
101
+ end
102
+ else
103
+ class << self
104
+ alias_method :parse, :parse_rfc5424
105
+ end
106
+ end
107
+ @time_format = @rfc5424_time_format unless conf.has_key?('time_format')
108
+ setup_time_parser_5424(@time_format)
109
+ RFC5424_WITHOUT_TIME_AND_PRI_REGEXP
110
+ when :auto
111
+ class << self
112
+ alias_method :parse, :parse_auto
113
+ end
114
+ setup_time_parser_3164(@time_format)
115
+ setup_time_parser_5424(@rfc5424_time_format)
116
+ nil
117
+ end
118
+
119
+ if @regexp_parser
120
+ @regexp3164 = RFC3164_WITHOUT_TIME_AND_PRI_REGEXP
121
+ @regexp5424 = RFC5424_WITHOUT_TIME_AND_PRI_REGEXP
122
+ end
123
+ end
124
+
125
+ def setup_time_parser_3164(time_fmt)
126
+ @time_parser_rfc3164 = time_parser_create(format: time_fmt)
127
+ @time_format_starts_with_space_rfc3164 = time_fmt.start_with?(SPLIT_CHAR)
128
+ if ['%b %d %H:%M:%S', '%b %d %H:%M:%S.%N'].include?(time_fmt)
129
+ @skip_space_count_rfc3164 = true
130
+ end
131
+ @space_count_rfc3164 = time_fmt.squeeze(' ').count(' ') + 1
132
+ @space_count_rfc3164 -= 1 if @time_format_starts_with_space_rfc3164
133
+ end
134
+
135
+ def setup_time_parser_5424(time_fmt)
136
+ @time_parser_rfc5424 = time_parser_create(format: time_fmt)
137
+ @time_parser_rfc5424_without_subseconds = time_parser_create(format: "%Y-%m-%dT%H:%M:%S%z")
138
+ @skip_space_count_rfc5424 = time_fmt.count(' ').zero?
139
+ @space_count_rfc5424 = time_fmt.squeeze(' ').count(' ') + 1
140
+ end
141
+
142
+ # this method is for tests
143
+ def patterns
144
+ {'format' => @regexp, 'time_format' => @time_format}
145
+ end
146
+
147
+ def parse(text)
148
+ # This is overwritten in configure
149
+ end
150
+
151
+ def parse_auto(text, &block)
152
+ if REGEXP_DETECT_RFC5424.match?(text)
153
+ if @regexp_parser
154
+ parse_rfc5424_regex(text, &block)
155
+ else
156
+ parse_rfc5424(text, &block)
157
+ end
158
+ else
159
+ if @regexp_parser
160
+ parse_rfc3164_regex(text, &block)
161
+ else
162
+ parse_rfc3164(text, &block)
163
+ end
164
+ end
165
+ end
166
+
167
+ SPLIT_CHAR = ' '.freeze
168
+ DOT_CHAR = '.'.freeze
169
+ RFC3164_PRI_DIGITS_REGEXP = /\A[0-9]{1,3}\z/
170
+
171
+ def parse_rfc3164_regex(text, &block)
172
+ idx = 0
173
+ record = {}
174
+
175
+ if @with_priority
176
+ if RFC3164_PRI_REGEXP.match?(text)
177
+ v = text.index('>')
178
+ record['pri'] = text[1..v].to_i # trim `<` and ``>
179
+ idx = v + 1
180
+ else
181
+ yield(nil, nil)
182
+ return
183
+ end
184
+ end
185
+
186
+ i = idx - 1
187
+ sq = false
188
+ first_time_field = true
189
+ @space_count_rfc3164.times do
190
+ while text[i + 1] == SPLIT_CHAR
191
+ if first_time_field
192
+ unless @time_format_starts_with_space_rfc3164
193
+ idx += 1
194
+ i += 1
195
+ break
196
+ end
197
+ end
198
+ sq = true
199
+ i += 1
200
+ end
201
+
202
+ first_time_field = false
203
+ i = text.index(SPLIT_CHAR, i + 1)
204
+ unless i
205
+ yield nil, nil
206
+ return
207
+ end
208
+ end
209
+
210
+ time_str = sq ? text.slice(idx, i - idx).squeeze(SPLIT_CHAR) : text.slice(idx, i - idx)
211
+ time = @mutex.synchronize { @time_parser_rfc3164.parse(time_str) }
212
+ if @keep_time_key
213
+ record['time'] = time_str
214
+ end
215
+
216
+ parse_plain(@regexp3164, time, text, i + 1, record, RFC3164_CAPTURES, &block)
217
+ end
218
+
219
+ def parse_rfc5424_regex(text, &block)
220
+ idx = 0
221
+ record = {}
222
+
223
+ if @with_priority
224
+ if (m = RFC5424_PRI_REGEXP.match(text))
225
+ record['pri'] = m['pri'].to_i
226
+ idx = m.end(0)
227
+ else
228
+ yield(nil, nil)
229
+ return
230
+ end
231
+ end
232
+
233
+ i = idx - 1
234
+ sq = false
235
+ @space_count_rfc5424.times {
236
+ while text[i + 1] == SPLIT_CHAR
237
+ sq = true
238
+ i += 1
239
+ end
240
+
241
+ i = text.index(SPLIT_CHAR, i + 1)
242
+ }
243
+
244
+ time_str = sq ? text.slice(idx, i - idx).squeeze(SPLIT_CHAR) : text.slice(idx, i - idx)
245
+ time = @mutex.synchronize do
246
+ begin
247
+ @time_parser_rfc5424.parse(time_str)
248
+ rescue Fluent::TimeParser::TimeParseError => e
249
+ log.trace(e)
250
+ @time_parser_rfc5424_without_subseconds.parse(time_str)
251
+ end
252
+ end
253
+
254
+ if @keep_time_key
255
+ record['time'] = time_str
256
+ end
257
+ parse_plain(@regexp5424, time, text, i + 1, record, RFC5424_CAPTURES, &block)
258
+ end
259
+
260
+ # @param time [EventTime]
261
+ # @param idx [Integer] note: this argument is needed to avoid string creation
262
+ # @param record [Hash]
263
+ # @param capture_list [Array] for performance
264
+ def parse_plain(re, time, text, idx, record, capture_list, &block)
265
+ m = re.match(text, idx)
266
+ if m.nil?
267
+ yield nil, nil
268
+ return
269
+ end
270
+
271
+ capture_list.each { |name|
272
+ if value = (m[name] rescue nil)
273
+ case name
274
+ when "message"
275
+ value.chomp!
276
+ record[name] = value
277
+ else
278
+ record[name] = value
279
+ end
280
+ end
281
+ }
282
+
283
+ if @estimate_current_event
284
+ time ||= Fluent::EventTime.now
285
+ end
286
+
287
+ yield time, record
288
+ end
289
+
290
+ def parse_rfc3164(text, &block)
291
+ pri = nil
292
+ cursor = 0
293
+ if @with_priority
294
+ if text.start_with?('<'.freeze)
295
+ i = text.index('>'.freeze, 1)
296
+ if i < 2
297
+ yield nil, nil
298
+ return
299
+ end
300
+ pri = text.slice(1, i - 1).to_i
301
+ cursor = i + 1
302
+ else
303
+ yield nil, nil
304
+ return
305
+ end
306
+ end
307
+
308
+ if text[cursor] == SPLIT_CHAR
309
+ cursor = rfc3164_space_cursor(text, cursor)
310
+ unless cursor
311
+ yield nil, nil
312
+ return
313
+ end
314
+ end
315
+
316
+ if @skip_space_count_rfc3164
317
+ # header part
318
+ time_size = 15 # skip Mmm dd hh:mm:ss
319
+ time_end_index = cursor + time_size
320
+ time_end = text[time_end_index]
321
+
322
+ if time_end == SPLIT_CHAR
323
+ time_str = text.slice(cursor, time_size)
324
+ cursor += 16 # time + ' '
325
+ elsif time_end == DOT_CHAR
326
+ # support subsecond time
327
+ i = text.index(SPLIT_CHAR, time_end_index)
328
+ unless i
329
+ yield nil, nil
330
+ return
331
+ end
332
+ time_str = text.slice(cursor, i - cursor)
333
+ cursor = i + 1
334
+ else
335
+ yield nil, nil
336
+ return
337
+ end
338
+ else
339
+ i = cursor - 1
340
+ sq = false
341
+ @space_count_rfc3164.times do
342
+ while text[i + 1] == SPLIT_CHAR
343
+ sq = true
344
+ i += 1
345
+ end
346
+ i = text.index(SPLIT_CHAR, i + 1)
347
+ unless i
348
+ yield nil, nil
349
+ return
350
+ end
351
+ end
352
+
353
+ time_str = sq ? text.slice(cursor, i - cursor).squeeze(SPLIT_CHAR) : text.slice(cursor, i - cursor)
354
+ cursor = i + 1
355
+ end
356
+
357
+ i = text.index(SPLIT_CHAR, cursor)
358
+ unless i
359
+ yield nil, nil
360
+ return
361
+ end
362
+ host_size = i - cursor
363
+ host = text.slice(cursor, host_size)
364
+ cursor += host_size + 1
365
+
366
+ record = {'host' => host}
367
+ record['pri'] = pri if pri
368
+
369
+ i = text.index(SPLIT_CHAR, cursor)
370
+
371
+ # message part
372
+ msg = if i.nil? # for 'only non-space content case'
373
+ text.slice(cursor, text.bytesize)
374
+ else
375
+ if text[i - 1] == ':'.freeze
376
+ if text[i - 2] == ']'.freeze
377
+ left_braket_pos = text.index('['.freeze, cursor)
378
+ record['ident'] = text.slice(cursor, left_braket_pos - cursor)
379
+ record['pid'] = text.slice(left_braket_pos + 1, i - left_braket_pos - 3) # remove '[' / ']:'
380
+ else
381
+ record['ident'] = text.slice(cursor, i - cursor - 1)
382
+ end
383
+ text.slice(i + 1, text.bytesize)
384
+ else
385
+ if @support_colonless_ident
386
+ if text[i - 1] == ']'.freeze
387
+ left_braket_pos = text.index('['.freeze, cursor)
388
+ record['ident'] = text.slice(cursor, left_braket_pos - cursor)
389
+ record['pid'] = text.slice(left_braket_pos + 1, i - left_braket_pos - 2) # remove '[' / ']'
390
+ else
391
+ record['ident'] = text.slice(cursor, i - cursor)
392
+ end
393
+ text.slice(i + 1, text.bytesize)
394
+ else
395
+ text.slice(cursor, text.bytesize)
396
+ end
397
+ end
398
+ end
399
+ msg.chomp!
400
+ record['message'] = msg
401
+
402
+ begin
403
+ time = @time_parser_rfc3164.parse(time_str)
404
+ rescue Fluent::TimeParser::TimeParseError
405
+ yield nil, nil
406
+ return
407
+ end
408
+ record['time'] = time_str if @keep_time_key
409
+
410
+ yield time, record
411
+ end
412
+
413
+ def rfc3164_space_cursor(text, cursor)
414
+ return if @with_priority && !RFC3164_PRI_DIGITS_REGEXP.match?(text.slice(1, cursor - 2))
415
+
416
+ @time_format_starts_with_space_rfc3164 ? cursor : cursor + 1
417
+ end
418
+
419
+ NILVALUE = '-'.freeze
420
+
421
+ def parse_rfc5424(text, &block)
422
+ pri = nil
423
+ cursor = 0
424
+ if @with_priority
425
+ if text.start_with?('<'.freeze)
426
+ i = text.index('>'.freeze, 1)
427
+ if i < 2
428
+ yield nil, nil
429
+ return
430
+ end
431
+ pri = text.slice(1, i - 1).to_i
432
+ i = text.index(SPLIT_CHAR, i)
433
+ cursor = i + 1
434
+ else
435
+ yield nil, nil
436
+ return
437
+ end
438
+ end
439
+
440
+ # timestamp part
441
+ if @skip_space_count_rfc5424
442
+ i = text.index(SPLIT_CHAR, cursor)
443
+ time_str = text.slice(cursor, i - cursor)
444
+ cursor = i + 1
445
+ else
446
+ i = cursor - 1
447
+ sq = false
448
+ @space_count_rfc5424.times do
449
+ while text[i + 1] == SPLIT_CHAR
450
+ sq = true
451
+ i += 1
452
+ end
453
+ i = text.index(SPLIT_CHAR, i + 1)
454
+ end
455
+
456
+ time_str = sq ? text.slice(cursor, i - cursor).squeeze(SPLIT_CHAR) : text.slice(cursor, i - cursor)
457
+ cursor = i + 1
458
+ end
459
+
460
+ # Repeat same code for the performance
461
+
462
+ # host part
463
+ i = text.index(SPLIT_CHAR, cursor)
464
+ unless i
465
+ yield nil, nil
466
+ return
467
+ end
468
+ slice_size = i - cursor
469
+ host = text.slice(cursor, slice_size)
470
+ cursor += slice_size + 1
471
+
472
+ # ident part
473
+ i = text.index(SPLIT_CHAR, cursor)
474
+ unless i
475
+ yield nil, nil
476
+ return
477
+ end
478
+ slice_size = i - cursor
479
+ ident = text.slice(cursor, slice_size)
480
+ cursor += slice_size + 1
481
+
482
+ # pid part
483
+ i = text.index(SPLIT_CHAR, cursor)
484
+ unless i
485
+ yield nil, nil
486
+ return
487
+ end
488
+ slice_size = i - cursor
489
+ pid = text.slice(cursor, slice_size)
490
+ cursor += slice_size + 1
491
+
492
+ # msgid part
493
+ i = text.index(SPLIT_CHAR, cursor)
494
+ unless i
495
+ yield nil, nil
496
+ return
497
+ end
498
+ slice_size = i - cursor
499
+ msgid = text.slice(cursor, slice_size)
500
+ cursor += slice_size + 1
501
+
502
+ record = {'host' => host, 'ident' => ident, 'pid' => pid, 'msgid' => msgid}
503
+ record['pri'] = pri if pri
504
+
505
+ # extradata part
506
+ ed_start = text[cursor]
507
+ if ed_start == NILVALUE
508
+ record['extradata'] = NILVALUE
509
+ cursor += 1
510
+ else
511
+ start = cursor
512
+ i = text.index('] '.freeze, cursor)
513
+ extradata = if i
514
+ diff = i + 1 - start # calculate ']' position
515
+ cursor += diff
516
+ text.slice(start, diff)
517
+ else # No message part case
518
+ cursor = text.bytesize
519
+ text.slice(start, cursor)
520
+ end
521
+ extradata.tr!("\\".freeze, ''.freeze)
522
+ record['extradata'] = extradata
523
+ end
524
+
525
+ # message part
526
+ if cursor != text.bytesize
527
+ msg = text.slice(cursor + 1, text.bytesize)
528
+ msg.chomp!
529
+ record['message'] = msg
530
+ end
531
+
532
+ time = begin
533
+ @time_parser_rfc5424.parse(time_str)
534
+ rescue Fluent::TimeParser::TimeParseError
535
+ @time_parser_rfc5424_without_subseconds.parse(time_str)
536
+ end
537
+ record['time'] = time_str if @keep_time_key
538
+
539
+ yield time, record
540
+ end
541
+ end
542
+ end
543
+ end
@@ -0,0 +1,47 @@
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/parser'
18
+
19
+ module Fluent
20
+ module Plugin
21
+ class TSVParser < Parser
22
+ Plugin.register_parser('tsv', self)
23
+
24
+ desc 'Names of fields included in each lines'
25
+ config_param :keys, :array, value_type: :string
26
+ desc 'The delimiter character (or string) of TSV values'
27
+ config_param :delimiter, :string, default: "\t"
28
+
29
+ def configure(conf)
30
+ super
31
+ @key_num = @keys.length
32
+ end
33
+
34
+ def parse(text)
35
+ r = {}
36
+ i = 0
37
+ values = text.split(@delimiter, @key_num)
38
+ while i < @key_num
39
+ r[@keys[i]] = values[i]
40
+ i += 1
41
+ end
42
+ time, record = convert_values(parse_time(r), r)
43
+ yield time, record
44
+ end
45
+ end
46
+ end
47
+ end