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.
- checksums.yaml +7 -0
- data/.rubocop.yml +116 -0
- data/ADOPTERS.md +5 -0
- data/AGENTS.md +46 -0
- data/AUTHORS +2 -0
- data/CHANGELOG.md +3324 -0
- data/CONTRIBUTING.md +45 -0
- data/GOVERNANCE.md +55 -0
- data/GithubWorkflow.md +78 -0
- data/LICENSE +202 -0
- data/MAINTAINERS.md +19 -0
- data/README.md +73 -0
- data/Rakefile +89 -0
- data/SECURITY.md +47 -0
- data/bin/fluent-binlog-reader +7 -0
- data/bin/fluent-ca-generate +6 -0
- data/bin/fluent-cap-ctl +7 -0
- data/bin/fluent-cat +5 -0
- data/bin/fluent-ctl +7 -0
- data/bin/fluent-debug +5 -0
- data/bin/fluent-gem +9 -0
- data/bin/fluent-plugin-config-format +5 -0
- data/bin/fluent-plugin-generate +5 -0
- data/bin/fluentd +15 -0
- data/code-of-conduct.md +3 -0
- data/docs/SECURITY_AUDIT.pdf +0 -0
- data/example/copy_roundrobin.conf +39 -0
- data/example/counter.conf +18 -0
- data/example/filter_stdout.conf +22 -0
- data/example/in_forward.conf +14 -0
- data/example/in_forward_client.conf +37 -0
- data/example/in_forward_shared_key.conf +15 -0
- data/example/in_forward_tls.conf +14 -0
- data/example/in_forward_users.conf +24 -0
- data/example/in_forward_workers.conf +21 -0
- data/example/in_http.conf +16 -0
- data/example/in_out_forward.conf +17 -0
- data/example/in_sample_blocks.conf +17 -0
- data/example/in_sample_with_compression.conf +23 -0
- data/example/in_syslog.conf +15 -0
- data/example/in_tail.conf +14 -0
- data/example/in_tcp.conf +13 -0
- data/example/in_udp.conf +13 -0
- data/example/logevents.conf +25 -0
- data/example/multi_filters.conf +61 -0
- data/example/out_copy.conf +20 -0
- data/example/out_exec_filter.conf +42 -0
- data/example/out_file.conf +13 -0
- data/example/out_forward.conf +35 -0
- data/example/out_forward_buf_file.conf +23 -0
- data/example/out_forward_client.conf +109 -0
- data/example/out_forward_heartbeat_none.conf +16 -0
- data/example/out_forward_sd.conf +17 -0
- data/example/out_forward_shared_key.conf +36 -0
- data/example/out_forward_tls.conf +18 -0
- data/example/out_forward_users.conf +65 -0
- data/example/out_null.conf +36 -0
- data/example/sd.yaml +8 -0
- data/example/secondary_file.conf +42 -0
- data/example/suppress_config_dump.conf +7 -0
- data/example/v0_12_filter.conf +78 -0
- data/example/v1_literal_example.conf +36 -0
- data/example/worker_section.conf +36 -0
- data/fluent.conf +139 -0
- data/lib/fluent/agent.rb +168 -0
- data/lib/fluent/capability.rb +87 -0
- data/lib/fluent/clock.rb +66 -0
- data/lib/fluent/command/binlog_reader.rb +244 -0
- data/lib/fluent/command/bundler_injection.rb +45 -0
- data/lib/fluent/command/ca_generate.rb +184 -0
- data/lib/fluent/command/cap_ctl.rb +174 -0
- data/lib/fluent/command/cat.rb +365 -0
- data/lib/fluent/command/ctl.rb +180 -0
- data/lib/fluent/command/debug.rb +103 -0
- data/lib/fluent/command/fluentd.rb +385 -0
- data/lib/fluent/command/plugin_config_formatter.rb +308 -0
- data/lib/fluent/command/plugin_generator.rb +365 -0
- data/lib/fluent/compat/call_super_mixin.rb +76 -0
- data/lib/fluent/compat/detach_process_mixin.rb +33 -0
- data/lib/fluent/compat/exec_util.rb +144 -0
- data/lib/fluent/compat/file_util.rb +54 -0
- data/lib/fluent/compat/filter.rb +68 -0
- data/lib/fluent/compat/formatter.rb +117 -0
- data/lib/fluent/compat/formatter_utils.rb +85 -0
- data/lib/fluent/compat/handle_tag_and_time_mixin.rb +62 -0
- data/lib/fluent/compat/handle_tag_name_mixin.rb +53 -0
- data/lib/fluent/compat/input.rb +49 -0
- data/lib/fluent/compat/output.rb +721 -0
- data/lib/fluent/compat/output_chain.rb +60 -0
- data/lib/fluent/compat/parser.rb +310 -0
- data/lib/fluent/compat/parser_utils.rb +40 -0
- data/lib/fluent/compat/propagate_default.rb +62 -0
- data/lib/fluent/compat/record_filter_mixin.rb +34 -0
- data/lib/fluent/compat/set_tag_key_mixin.rb +50 -0
- data/lib/fluent/compat/set_time_key_mixin.rb +69 -0
- data/lib/fluent/compat/socket_util.rb +165 -0
- data/lib/fluent/compat/string_util.rb +34 -0
- data/lib/fluent/compat/structured_format_mixin.rb +26 -0
- data/lib/fluent/compat/type_converter.rb +90 -0
- data/lib/fluent/config/basic_parser.rb +122 -0
- data/lib/fluent/config/configure_proxy.rb +424 -0
- data/lib/fluent/config/dsl.rb +152 -0
- data/lib/fluent/config/element.rb +265 -0
- data/lib/fluent/config/error.rb +44 -0
- data/lib/fluent/config/literal_parser.rb +305 -0
- data/lib/fluent/config/parser.rb +119 -0
- data/lib/fluent/config/section.rb +272 -0
- data/lib/fluent/config/types.rb +257 -0
- data/lib/fluent/config/v1_parser.rb +200 -0
- data/lib/fluent/config/yaml_parser/fluent_value.rb +47 -0
- data/lib/fluent/config/yaml_parser/loader.rb +124 -0
- data/lib/fluent/config/yaml_parser/parser.rb +179 -0
- data/lib/fluent/config/yaml_parser/section_builder.rb +107 -0
- data/lib/fluent/config/yaml_parser.rb +56 -0
- data/lib/fluent/config.rb +89 -0
- data/lib/fluent/configurable.rb +202 -0
- data/lib/fluent/counter/base_socket.rb +44 -0
- data/lib/fluent/counter/client.rb +297 -0
- data/lib/fluent/counter/error.rb +86 -0
- data/lib/fluent/counter/mutex_hash.rb +163 -0
- data/lib/fluent/counter/server.rb +273 -0
- data/lib/fluent/counter/store.rb +205 -0
- data/lib/fluent/counter/validator.rb +145 -0
- data/lib/fluent/counter.rb +23 -0
- data/lib/fluent/daemon.rb +14 -0
- data/lib/fluent/daemonizer.rb +88 -0
- data/lib/fluent/engine.rb +269 -0
- data/lib/fluent/env.rb +45 -0
- data/lib/fluent/error.rb +37 -0
- data/lib/fluent/event.rb +369 -0
- data/lib/fluent/event_router.rb +315 -0
- data/lib/fluent/ext_monitor_require.rb +28 -0
- data/lib/fluent/file_wrapper.rb +137 -0
- data/lib/fluent/filter.rb +21 -0
- data/lib/fluent/fluent_log_event_router.rb +139 -0
- data/lib/fluent/formatter.rb +23 -0
- data/lib/fluent/input.rb +21 -0
- data/lib/fluent/label.rb +46 -0
- data/lib/fluent/load.rb +33 -0
- data/lib/fluent/log/console_adapter.rb +66 -0
- data/lib/fluent/log.rb +775 -0
- data/lib/fluent/match.rb +187 -0
- data/lib/fluent/mixin.rb +31 -0
- data/lib/fluent/msgpack_factory.rb +111 -0
- data/lib/fluent/oj_options.rb +61 -0
- data/lib/fluent/output.rb +29 -0
- data/lib/fluent/output_chain.rb +23 -0
- data/lib/fluent/parser.rb +23 -0
- data/lib/fluent/plugin/bare_output.rb +88 -0
- data/lib/fluent/plugin/base.rb +219 -0
- data/lib/fluent/plugin/buf_file.rb +256 -0
- data/lib/fluent/plugin/buf_file_single.rb +272 -0
- data/lib/fluent/plugin/buf_memory.rb +34 -0
- data/lib/fluent/plugin/buffer/chunk.rb +313 -0
- data/lib/fluent/plugin/buffer/file_chunk.rb +432 -0
- data/lib/fluent/plugin/buffer/file_single_chunk.rb +325 -0
- data/lib/fluent/plugin/buffer/memory_chunk.rb +91 -0
- data/lib/fluent/plugin/buffer.rb +1063 -0
- data/lib/fluent/plugin/compressable.rb +87 -0
- data/lib/fluent/plugin/exec_util.rb +22 -0
- data/lib/fluent/plugin/extractor.rb +132 -0
- data/lib/fluent/plugin/file_util.rb +22 -0
- data/lib/fluent/plugin/filter.rb +119 -0
- data/lib/fluent/plugin/filter_grep.rb +189 -0
- data/lib/fluent/plugin/filter_parser.rb +124 -0
- data/lib/fluent/plugin/filter_record_transformer.rb +325 -0
- data/lib/fluent/plugin/filter_stdout.rb +53 -0
- data/lib/fluent/plugin/formatter.rb +75 -0
- data/lib/fluent/plugin/formatter_csv.rb +92 -0
- data/lib/fluent/plugin/formatter_hash.rb +35 -0
- data/lib/fluent/plugin/formatter_json.rb +62 -0
- data/lib/fluent/plugin/formatter_ltsv.rb +44 -0
- data/lib/fluent/plugin/formatter_msgpack.rb +33 -0
- data/lib/fluent/plugin/formatter_out_file.rb +55 -0
- data/lib/fluent/plugin/formatter_single_value.rb +36 -0
- data/lib/fluent/plugin/formatter_stdout.rb +76 -0
- data/lib/fluent/plugin/formatter_tsv.rb +40 -0
- data/lib/fluent/plugin/in_debug_agent.rb +71 -0
- data/lib/fluent/plugin/in_dummy.rb +18 -0
- data/lib/fluent/plugin/in_exec.rb +124 -0
- data/lib/fluent/plugin/in_forward.rb +489 -0
- data/lib/fluent/plugin/in_gc_stat.rb +72 -0
- data/lib/fluent/plugin/in_http.rb +737 -0
- data/lib/fluent/plugin/in_monitor_agent.rb +406 -0
- data/lib/fluent/plugin/in_object_space.rb +93 -0
- data/lib/fluent/plugin/in_sample.rb +148 -0
- data/lib/fluent/plugin/in_syslog.rb +346 -0
- data/lib/fluent/plugin/in_tail/compatibility.rb +111 -0
- data/lib/fluent/plugin/in_tail/dir_watcher.rb +713 -0
- data/lib/fluent/plugin/in_tail/group_watch.rb +204 -0
- data/lib/fluent/plugin/in_tail/io_handler.rb +391 -0
- data/lib/fluent/plugin/in_tail/line_feeder.rb +230 -0
- data/lib/fluent/plugin/in_tail/position_file.rb +269 -0
- data/lib/fluent/plugin/in_tail/stat_watcher.rb +52 -0
- data/lib/fluent/plugin/in_tail/tail_watcher.rb +276 -0
- data/lib/fluent/plugin/in_tail/worker_pool.rb +298 -0
- data/lib/fluent/plugin/in_tail.rb +917 -0
- data/lib/fluent/plugin/in_tcp.rb +230 -0
- data/lib/fluent/plugin/in_udp.rb +101 -0
- data/lib/fluent/plugin/in_unix.rb +197 -0
- data/lib/fluent/plugin/input.rb +71 -0
- data/lib/fluent/plugin/metrics.rb +119 -0
- data/lib/fluent/plugin/metrics_local.rb +96 -0
- data/lib/fluent/plugin/multi_output.rb +179 -0
- data/lib/fluent/plugin/out_buffer.rb +40 -0
- data/lib/fluent/plugin/out_copy.rb +120 -0
- data/lib/fluent/plugin/out_exec.rb +105 -0
- data/lib/fluent/plugin/out_exec_filter.rb +319 -0
- data/lib/fluent/plugin/out_file.rb +371 -0
- data/lib/fluent/plugin/out_forward/ack_handler.rb +176 -0
- data/lib/fluent/plugin/out_forward/connection_manager.rb +131 -0
- data/lib/fluent/plugin/out_forward/error.rb +28 -0
- data/lib/fluent/plugin/out_forward/failure_detector.rb +84 -0
- data/lib/fluent/plugin/out_forward/handshake_protocol.rb +125 -0
- data/lib/fluent/plugin/out_forward/load_balancer.rb +114 -0
- data/lib/fluent/plugin/out_forward/socket_cache.rb +177 -0
- data/lib/fluent/plugin/out_forward.rb +865 -0
- data/lib/fluent/plugin/out_http.rb +419 -0
- data/lib/fluent/plugin/out_null.rb +74 -0
- data/lib/fluent/plugin/out_relabel.rb +32 -0
- data/lib/fluent/plugin/out_roundrobin.rb +84 -0
- data/lib/fluent/plugin/out_secondary_file.rb +148 -0
- data/lib/fluent/plugin/out_stdout.rb +81 -0
- data/lib/fluent/plugin/out_stream.rb +130 -0
- data/lib/fluent/plugin/output.rb +1688 -0
- data/lib/fluent/plugin/owned_by_mixin.rb +41 -0
- data/lib/fluent/plugin/parser.rb +274 -0
- data/lib/fluent/plugin/parser_apache.rb +28 -0
- data/lib/fluent/plugin/parser_apache2.rb +88 -0
- data/lib/fluent/plugin/parser_apache_error.rb +26 -0
- data/lib/fluent/plugin/parser_csv.rb +124 -0
- data/lib/fluent/plugin/parser_json.rb +118 -0
- data/lib/fluent/plugin/parser_ltsv.rb +49 -0
- data/lib/fluent/plugin/parser_msgpack.rb +72 -0
- data/lib/fluent/plugin/parser_multiline.rb +152 -0
- data/lib/fluent/plugin/parser_nginx.rb +28 -0
- data/lib/fluent/plugin/parser_none.rb +36 -0
- data/lib/fluent/plugin/parser_regexp.rb +68 -0
- data/lib/fluent/plugin/parser_syslog.rb +543 -0
- data/lib/fluent/plugin/parser_tsv.rb +47 -0
- data/lib/fluent/plugin/sd_file.rb +157 -0
- data/lib/fluent/plugin/sd_srv.rb +135 -0
- data/lib/fluent/plugin/sd_static.rb +58 -0
- data/lib/fluent/plugin/service_discovery.rb +65 -0
- data/lib/fluent/plugin/socket_util.rb +22 -0
- data/lib/fluent/plugin/storage.rb +84 -0
- data/lib/fluent/plugin/storage_local.rb +166 -0
- data/lib/fluent/plugin/string_util.rb +22 -0
- data/lib/fluent/plugin.rb +206 -0
- data/lib/fluent/plugin_helper/cert_option.rb +199 -0
- data/lib/fluent/plugin_helper/child_process.rb +369 -0
- data/lib/fluent/plugin_helper/compat_parameters.rb +343 -0
- data/lib/fluent/plugin_helper/counter.rb +51 -0
- data/lib/fluent/plugin_helper/event_emitter.rb +112 -0
- data/lib/fluent/plugin_helper/event_loop.rb +170 -0
- data/lib/fluent/plugin_helper/extract.rb +104 -0
- data/lib/fluent/plugin_helper/formatter.rb +147 -0
- data/lib/fluent/plugin_helper/http_server/app.rb +81 -0
- data/lib/fluent/plugin_helper/http_server/methods.rb +35 -0
- data/lib/fluent/plugin_helper/http_server/request.rb +53 -0
- data/lib/fluent/plugin_helper/http_server/router.rb +54 -0
- data/lib/fluent/plugin_helper/http_server/server.rb +116 -0
- data/lib/fluent/plugin_helper/http_server/ssl_context_builder.rb +41 -0
- data/lib/fluent/plugin_helper/http_server.rb +129 -0
- data/lib/fluent/plugin_helper/inject.rb +154 -0
- data/lib/fluent/plugin_helper/metrics.rb +136 -0
- data/lib/fluent/plugin_helper/parser.rb +147 -0
- data/lib/fluent/plugin_helper/record_accessor.rb +207 -0
- data/lib/fluent/plugin_helper/retry_state.rb +219 -0
- data/lib/fluent/plugin_helper/server.rb +840 -0
- data/lib/fluent/plugin_helper/service_discovery/manager.rb +146 -0
- data/lib/fluent/plugin_helper/service_discovery/round_robin_balancer.rb +43 -0
- data/lib/fluent/plugin_helper/service_discovery.rb +125 -0
- data/lib/fluent/plugin_helper/socket.rb +288 -0
- data/lib/fluent/plugin_helper/socket_option.rb +98 -0
- data/lib/fluent/plugin_helper/storage.rb +349 -0
- data/lib/fluent/plugin_helper/thread.rb +180 -0
- data/lib/fluent/plugin_helper/timer.rb +92 -0
- data/lib/fluent/plugin_helper.rb +75 -0
- data/lib/fluent/plugin_id.rb +93 -0
- data/lib/fluent/process.rb +22 -0
- data/lib/fluent/registry.rb +117 -0
- data/lib/fluent/root_agent.rb +468 -0
- data/lib/fluent/rpc.rb +95 -0
- data/lib/fluent/source_only_buffer_agent.rb +102 -0
- data/lib/fluent/static_config_analysis.rb +195 -0
- data/lib/fluent/supervisor.rb +1347 -0
- data/lib/fluent/system_config.rb +213 -0
- data/lib/fluent/test/base.rb +83 -0
- data/lib/fluent/test/driver/base.rb +231 -0
- data/lib/fluent/test/driver/base_owned.rb +83 -0
- data/lib/fluent/test/driver/base_owner.rb +135 -0
- data/lib/fluent/test/driver/event_feeder.rb +98 -0
- data/lib/fluent/test/driver/filter.rb +61 -0
- data/lib/fluent/test/driver/formatter.rb +30 -0
- data/lib/fluent/test/driver/input.rb +31 -0
- data/lib/fluent/test/driver/multi_output.rb +53 -0
- data/lib/fluent/test/driver/output.rb +102 -0
- data/lib/fluent/test/driver/parser.rb +30 -0
- data/lib/fluent/test/driver/storage.rb +30 -0
- data/lib/fluent/test/driver/test_event_router.rb +45 -0
- data/lib/fluent/test/filter_test.rb +77 -0
- data/lib/fluent/test/formatter_test.rb +65 -0
- data/lib/fluent/test/helpers.rb +138 -0
- data/lib/fluent/test/input_test.rb +174 -0
- data/lib/fluent/test/log.rb +79 -0
- data/lib/fluent/test/output_test.rb +156 -0
- data/lib/fluent/test/parser_test.rb +70 -0
- data/lib/fluent/test/startup_shutdown.rb +44 -0
- data/lib/fluent/test.rb +61 -0
- data/lib/fluent/time.rb +513 -0
- data/lib/fluent/timezone.rb +171 -0
- data/lib/fluent/tls.rb +105 -0
- data/lib/fluent/unique_id.rb +39 -0
- data/lib/fluent/variable_store.rb +40 -0
- data/lib/fluent/version.rb +21 -0
- data/lib/fluent/win32api.rb +38 -0
- data/lib/fluent/winsvc.rb +130 -0
- data/templates/new_gem/.gitignore +8 -0
- data/templates/new_gem/Gemfile +3 -0
- data/templates/new_gem/README.md.erb +43 -0
- data/templates/new_gem/Rakefile +13 -0
- data/templates/new_gem/fluent-plugin.gemspec.erb +28 -0
- data/templates/new_gem/lib/fluent/plugin/filter.rb.erb +14 -0
- data/templates/new_gem/lib/fluent/plugin/formatter.rb.erb +14 -0
- data/templates/new_gem/lib/fluent/plugin/input.rb.erb +11 -0
- data/templates/new_gem/lib/fluent/plugin/output.rb.erb +11 -0
- data/templates/new_gem/lib/fluent/plugin/parser.rb.erb +15 -0
- data/templates/new_gem/lib/fluent/plugin/storage.rb.erb +40 -0
- data/templates/new_gem/test/helper.rb.erb +7 -0
- data/templates/new_gem/test/plugin/test_filter.rb.erb +18 -0
- data/templates/new_gem/test/plugin/test_formatter.rb.erb +18 -0
- data/templates/new_gem/test/plugin/test_input.rb.erb +18 -0
- data/templates/new_gem/test/plugin/test_output.rb.erb +18 -0
- data/templates/new_gem/test/plugin/test_parser.rb.erb +18 -0
- data/templates/new_gem/test/plugin/test_storage.rb.erb +18 -0
- data/templates/plugin_config_formatter/param.md-compact.erb +25 -0
- data/templates/plugin_config_formatter/param.md-table.erb +10 -0
- data/templates/plugin_config_formatter/param.md.erb +34 -0
- data/templates/plugin_config_formatter/section.md.erb +12 -0
- 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
|