fluentd 0.12.40 → 1.6.2
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of fluentd might be problematic. Click here for more details.
- checksums.yaml +5 -5
- data/.github/ISSUE_TEMPLATE/bug_report.md +39 -0
- data/.github/ISSUE_TEMPLATE/feature_request.md +23 -0
- data/.github/ISSUE_TEMPLATE.md +17 -0
- data/.github/PULL_REQUEST_TEMPLATE.md +13 -0
- data/.gitignore +5 -0
- data/.gitlab/cicd-template.yaml +10 -0
- data/.gitlab-ci.yml +147 -0
- data/.travis.yml +56 -20
- data/ADOPTERS.md +5 -0
- data/CHANGELOG.md +1369 -0
- data/CONTRIBUTING.md +16 -5
- data/GOVERNANCE.md +55 -0
- data/Gemfile +5 -0
- data/GithubWorkflow.md +78 -0
- data/LICENSE +202 -0
- data/MAINTAINERS.md +7 -0
- data/README.md +23 -11
- data/Rakefile +48 -2
- data/Vagrantfile +17 -0
- data/appveyor.yml +37 -0
- data/bin/fluent-binlog-reader +7 -0
- data/bin/fluent-ca-generate +6 -0
- data/bin/fluent-plugin-config-format +5 -0
- data/bin/fluent-plugin-generate +5 -0
- data/bin/fluentd +3 -0
- data/code-of-conduct.md +3 -0
- data/example/copy_roundrobin.conf +39 -0
- data/example/counter.conf +18 -0
- data/example/in_dummy_blocks.conf +17 -0
- data/example/in_dummy_with_compression.conf +23 -0
- data/example/in_forward.conf +7 -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 +3 -1
- data/example/in_out_forward.conf +17 -0
- data/example/logevents.conf +25 -0
- data/example/multi_filters.conf +61 -0
- data/example/out_exec_filter.conf +42 -0
- data/example/out_forward.conf +13 -13
- 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_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/secondary_file.conf +42 -0
- data/example/suppress_config_dump.conf +7 -0
- data/example/worker_section.conf +36 -0
- data/fluent.conf +29 -0
- data/fluentd.gemspec +21 -11
- data/lib/fluent/agent.rb +67 -90
- data/lib/fluent/clock.rb +62 -0
- data/lib/fluent/command/binlog_reader.rb +244 -0
- data/lib/fluent/command/ca_generate.rb +181 -0
- data/lib/fluent/command/cat.rb +42 -18
- data/lib/fluent/command/debug.rb +12 -10
- data/lib/fluent/command/fluentd.rb +153 -5
- data/lib/fluent/command/plugin_config_formatter.rb +292 -0
- data/lib/fluent/command/plugin_generator.rb +324 -0
- data/lib/fluent/compat/call_super_mixin.rb +67 -0
- data/lib/fluent/compat/detach_process_mixin.rb +33 -0
- data/lib/fluent/compat/exec_util.rb +129 -0
- data/lib/fluent/compat/file_util.rb +54 -0
- data/lib/fluent/compat/filter.rb +68 -0
- data/lib/fluent/compat/formatter.rb +111 -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 +718 -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/configure_proxy.rb +210 -62
- data/lib/fluent/config/dsl.rb +12 -5
- data/lib/fluent/config/element.rb +107 -9
- data/lib/fluent/config/literal_parser.rb +9 -3
- data/lib/fluent/config/parser.rb +4 -4
- data/lib/fluent/config/section.rb +51 -14
- data/lib/fluent/config/types.rb +28 -13
- data/lib/fluent/config/v1_parser.rb +3 -5
- data/lib/fluent/config.rb +23 -20
- data/lib/fluent/configurable.rb +79 -21
- data/lib/fluent/counter/base_socket.rb +46 -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 +15 -0
- data/lib/fluent/engine.rb +102 -65
- data/lib/fluent/env.rb +7 -3
- data/lib/fluent/error.rb +30 -0
- data/lib/fluent/event.rb +197 -21
- data/lib/fluent/event_router.rb +93 -10
- data/lib/fluent/filter.rb +2 -50
- data/lib/fluent/formatter.rb +4 -293
- data/lib/fluent/input.rb +2 -32
- data/lib/fluent/label.rb +10 -2
- data/lib/fluent/load.rb +3 -3
- data/lib/fluent/log.rb +348 -81
- data/lib/fluent/match.rb +37 -36
- data/lib/fluent/mixin.rb +12 -176
- data/lib/fluent/msgpack_factory.rb +62 -0
- data/lib/fluent/output.rb +10 -612
- data/lib/fluent/output_chain.rb +23 -0
- data/lib/fluent/parser.rb +4 -800
- data/lib/fluent/plugin/bare_output.rb +63 -0
- data/lib/fluent/plugin/base.rb +192 -0
- data/lib/fluent/plugin/buf_file.rb +128 -174
- data/lib/fluent/plugin/buf_memory.rb +9 -92
- data/lib/fluent/plugin/buffer/chunk.rb +221 -0
- data/lib/fluent/plugin/buffer/file_chunk.rb +383 -0
- data/lib/fluent/plugin/buffer/memory_chunk.rb +90 -0
- data/lib/fluent/plugin/buffer.rb +779 -0
- data/lib/fluent/plugin/compressable.rb +92 -0
- data/lib/fluent/plugin/exec_util.rb +3 -108
- data/lib/fluent/plugin/file_util.rb +4 -34
- data/lib/fluent/plugin/file_wrapper.rb +120 -0
- data/lib/fluent/plugin/filter.rb +93 -0
- data/lib/fluent/plugin/filter_grep.rb +117 -34
- data/lib/fluent/plugin/filter_parser.rb +85 -62
- data/lib/fluent/plugin/filter_record_transformer.rb +27 -39
- data/lib/fluent/plugin/filter_stdout.rb +15 -12
- data/lib/fluent/plugin/formatter.rb +50 -0
- data/lib/fluent/plugin/formatter_csv.rb +52 -0
- data/lib/fluent/plugin/formatter_hash.rb +33 -0
- data/lib/fluent/plugin/formatter_json.rb +55 -0
- data/lib/fluent/plugin/formatter_ltsv.rb +42 -0
- data/lib/fluent/plugin/formatter_msgpack.rb +33 -0
- data/lib/fluent/plugin/formatter_out_file.rb +51 -0
- data/lib/fluent/plugin/formatter_single_value.rb +34 -0
- data/lib/fluent/plugin/formatter_stdout.rb +76 -0
- data/lib/fluent/plugin/formatter_tsv.rb +38 -0
- data/lib/fluent/plugin/in_debug_agent.rb +17 -6
- data/lib/fluent/plugin/in_dummy.rb +47 -20
- data/lib/fluent/plugin/in_exec.rb +55 -123
- data/lib/fluent/plugin/in_forward.rb +299 -216
- data/lib/fluent/plugin/in_gc_stat.rb +14 -36
- data/lib/fluent/plugin/in_http.rb +204 -91
- data/lib/fluent/plugin/in_monitor_agent.rb +186 -258
- data/lib/fluent/plugin/in_object_space.rb +13 -41
- data/lib/fluent/plugin/in_syslog.rb +112 -134
- data/lib/fluent/plugin/in_tail.rb +408 -745
- data/lib/fluent/plugin/in_tcp.rb +66 -9
- data/lib/fluent/plugin/in_udp.rb +60 -11
- data/lib/fluent/plugin/{in_stream.rb → in_unix.rb} +8 -4
- data/lib/fluent/plugin/input.rb +37 -0
- data/lib/fluent/plugin/multi_output.rb +158 -0
- data/lib/fluent/plugin/out_copy.rb +23 -35
- data/lib/fluent/plugin/out_exec.rb +67 -70
- data/lib/fluent/plugin/out_exec_filter.rb +204 -271
- data/lib/fluent/plugin/out_file.rb +267 -73
- data/lib/fluent/plugin/out_forward.rb +854 -325
- data/lib/fluent/plugin/out_null.rb +42 -9
- data/lib/fluent/plugin/out_relabel.rb +9 -5
- data/lib/fluent/plugin/out_roundrobin.rb +18 -37
- data/lib/fluent/plugin/out_secondary_file.rb +133 -0
- data/lib/fluent/plugin/out_stdout.rb +43 -10
- data/lib/fluent/plugin/out_stream.rb +7 -2
- data/lib/fluent/plugin/output.rb +1498 -0
- data/lib/fluent/plugin/owned_by_mixin.rb +42 -0
- data/lib/fluent/plugin/parser.rb +191 -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 +39 -0
- data/lib/fluent/plugin/parser_json.rb +94 -0
- data/lib/fluent/plugin/parser_ltsv.rb +49 -0
- data/lib/fluent/plugin/parser_msgpack.rb +50 -0
- data/lib/fluent/plugin/parser_multiline.rb +106 -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 +142 -0
- data/lib/fluent/plugin/parser_tsv.rb +42 -0
- data/lib/fluent/plugin/socket_util.rb +3 -143
- data/lib/fluent/plugin/storage.rb +84 -0
- data/lib/fluent/plugin/storage_local.rb +164 -0
- data/lib/fluent/plugin/string_util.rb +3 -15
- data/lib/fluent/plugin.rb +122 -121
- data/lib/fluent/plugin_helper/cert_option.rb +178 -0
- data/lib/fluent/plugin_helper/child_process.rb +364 -0
- data/lib/fluent/plugin_helper/compat_parameters.rb +333 -0
- data/lib/fluent/plugin_helper/counter.rb +51 -0
- data/lib/fluent/plugin_helper/event_emitter.rb +93 -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 +79 -0
- data/lib/fluent/plugin_helper/http_server/compat/server.rb +81 -0
- data/lib/fluent/plugin_helper/http_server/compat/webrick_handler.rb +58 -0
- data/lib/fluent/plugin_helper/http_server/methods.rb +35 -0
- data/lib/fluent/plugin_helper/http_server/request.rb +42 -0
- data/lib/fluent/plugin_helper/http_server/router.rb +54 -0
- data/lib/fluent/plugin_helper/http_server/server.rb +87 -0
- data/lib/fluent/plugin_helper/http_server.rb +76 -0
- data/lib/fluent/plugin_helper/inject.rb +151 -0
- data/lib/fluent/plugin_helper/parser.rb +147 -0
- data/lib/fluent/plugin_helper/record_accessor.rb +210 -0
- data/lib/fluent/plugin_helper/retry_state.rb +205 -0
- data/lib/fluent/plugin_helper/server.rb +807 -0
- data/lib/fluent/plugin_helper/socket.rb +250 -0
- data/lib/fluent/plugin_helper/socket_option.rb +80 -0
- data/lib/fluent/plugin_helper/storage.rb +349 -0
- data/lib/fluent/plugin_helper/thread.rb +179 -0
- data/lib/fluent/plugin_helper/timer.rb +92 -0
- data/lib/fluent/plugin_helper.rb +73 -0
- data/lib/fluent/plugin_id.rb +80 -0
- data/lib/fluent/process.rb +3 -489
- data/lib/fluent/registry.rb +52 -10
- data/lib/fluent/root_agent.rb +204 -42
- data/lib/fluent/supervisor.rb +597 -359
- data/lib/fluent/system_config.rb +131 -42
- data/lib/fluent/test/base.rb +6 -54
- data/lib/fluent/test/driver/base.rb +224 -0
- data/lib/fluent/test/driver/base_owned.rb +70 -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 +57 -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/test_event_router.rb +45 -0
- data/lib/fluent/test/filter_test.rb +0 -1
- data/lib/fluent/test/formatter_test.rb +4 -1
- data/lib/fluent/test/helpers.rb +58 -10
- data/lib/fluent/test/input_test.rb +27 -19
- data/lib/fluent/test/log.rb +79 -0
- data/lib/fluent/test/output_test.rb +28 -39
- data/lib/fluent/test/parser_test.rb +3 -1
- data/lib/fluent/test/startup_shutdown.rb +46 -0
- data/lib/fluent/test.rb +33 -1
- data/lib/fluent/time.rb +450 -1
- data/lib/fluent/timezone.rb +27 -3
- data/lib/fluent/{status.rb → unique_id.rb} +15 -24
- data/lib/fluent/version.rb +1 -1
- data/lib/fluent/winsvc.rb +85 -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 +27 -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/test/helper.rb.erb +8 -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/plugin_config_formatter/param.md-compact.erb +25 -0
- data/templates/plugin_config_formatter/param.md.erb +34 -0
- data/templates/plugin_config_formatter/section.md.erb +12 -0
- data/test/command/test_binlog_reader.rb +346 -0
- data/test/command/test_ca_generate.rb +70 -0
- data/test/command/test_fluentd.rb +901 -0
- data/test/command/test_plugin_config_formatter.rb +276 -0
- data/test/command/test_plugin_generator.rb +92 -0
- data/test/compat/test_calls_super.rb +166 -0
- data/test/compat/test_parser.rb +92 -0
- data/test/config/test_config_parser.rb +126 -2
- data/test/config/test_configurable.rb +946 -187
- data/test/config/test_configure_proxy.rb +424 -74
- data/test/config/test_dsl.rb +11 -11
- data/test/config/test_element.rb +500 -0
- data/test/config/test_literal_parser.rb +8 -0
- data/test/config/test_plugin_configuration.rb +56 -0
- data/test/config/test_section.rb +79 -7
- data/test/config/test_system_config.rb +122 -35
- data/test/config/test_types.rb +38 -0
- data/test/counter/test_client.rb +559 -0
- data/test/counter/test_error.rb +44 -0
- data/test/counter/test_mutex_hash.rb +179 -0
- data/test/counter/test_server.rb +589 -0
- data/test/counter/test_store.rb +258 -0
- data/test/counter/test_validator.rb +137 -0
- data/test/helper.rb +89 -6
- data/test/helpers/fuzzy_assert.rb +89 -0
- data/test/plugin/test_bare_output.rb +118 -0
- data/test/plugin/test_base.rb +115 -0
- data/test/plugin/test_buf_file.rb +823 -460
- data/test/plugin/test_buf_memory.rb +32 -194
- data/test/plugin/test_buffer.rb +1233 -0
- data/test/plugin/test_buffer_chunk.rb +198 -0
- data/test/plugin/test_buffer_file_chunk.rb +844 -0
- data/test/plugin/test_buffer_memory_chunk.rb +338 -0
- data/test/plugin/test_compressable.rb +84 -0
- data/test/plugin/test_filter.rb +357 -0
- data/test/plugin/test_filter_grep.rb +540 -29
- data/test/plugin/test_filter_parser.rb +439 -452
- data/test/plugin/test_filter_record_transformer.rb +123 -166
- data/test/plugin/test_filter_stdout.rb +160 -72
- data/test/plugin/test_formatter_csv.rb +111 -0
- data/test/plugin/test_formatter_hash.rb +35 -0
- data/test/plugin/test_formatter_json.rb +51 -0
- data/test/plugin/test_formatter_ltsv.rb +62 -0
- data/test/plugin/test_formatter_msgpack.rb +28 -0
- data/test/plugin/test_formatter_out_file.rb +95 -0
- data/test/plugin/test_formatter_single_value.rb +38 -0
- data/test/plugin/test_formatter_tsv.rb +68 -0
- data/test/plugin/test_in_debug_agent.rb +24 -1
- data/test/plugin/test_in_dummy.rb +111 -18
- data/test/plugin/test_in_exec.rb +200 -113
- data/test/plugin/test_in_forward.rb +990 -387
- data/test/plugin/test_in_gc_stat.rb +10 -8
- data/test/plugin/test_in_http.rb +600 -224
- data/test/plugin/test_in_monitor_agent.rb +690 -0
- data/test/plugin/test_in_object_space.rb +24 -8
- data/test/plugin/test_in_syslog.rb +154 -215
- data/test/plugin/test_in_tail.rb +1006 -707
- data/test/plugin/test_in_tcp.rb +125 -48
- data/test/plugin/test_in_udp.rb +204 -63
- data/test/plugin/{test_in_stream.rb → test_in_unix.rb} +14 -13
- data/test/plugin/test_input.rb +126 -0
- data/test/plugin/test_metadata.rb +89 -0
- data/test/plugin/test_multi_output.rb +180 -0
- data/test/plugin/test_out_copy.rb +117 -112
- data/test/plugin/test_out_exec.rb +258 -53
- data/test/plugin/test_out_exec_filter.rb +538 -115
- data/test/plugin/test_out_file.rb +865 -178
- data/test/plugin/test_out_forward.rb +998 -210
- data/test/plugin/test_out_null.rb +105 -0
- data/test/plugin/test_out_relabel.rb +28 -0
- data/test/plugin/test_out_roundrobin.rb +36 -29
- data/test/plugin/test_out_secondary_file.rb +458 -0
- data/test/plugin/test_out_stdout.rb +135 -37
- data/test/plugin/test_out_stream.rb +18 -0
- data/test/plugin/test_output.rb +984 -0
- data/test/plugin/test_output_as_buffered.rb +2021 -0
- data/test/plugin/test_output_as_buffered_backup.rb +312 -0
- data/test/plugin/test_output_as_buffered_compress.rb +165 -0
- data/test/plugin/test_output_as_buffered_overflow.rb +250 -0
- data/test/plugin/test_output_as_buffered_retries.rb +911 -0
- data/test/plugin/test_output_as_buffered_secondary.rb +874 -0
- data/test/plugin/test_output_as_standard.rb +374 -0
- data/test/plugin/test_owned_by.rb +35 -0
- data/test/plugin/test_parser.rb +359 -0
- data/test/plugin/test_parser_apache.rb +42 -0
- data/test/plugin/test_parser_apache2.rb +47 -0
- data/test/plugin/test_parser_apache_error.rb +45 -0
- data/test/plugin/test_parser_csv.rb +103 -0
- data/test/plugin/test_parser_json.rb +138 -0
- data/test/plugin/test_parser_labeled_tsv.rb +145 -0
- data/test/plugin/test_parser_multiline.rb +100 -0
- data/test/plugin/test_parser_nginx.rb +88 -0
- data/test/plugin/test_parser_none.rb +52 -0
- data/test/plugin/test_parser_regexp.rb +289 -0
- data/test/plugin/test_parser_syslog.rb +441 -0
- data/test/plugin/test_parser_tsv.rb +122 -0
- data/test/plugin/test_storage.rb +167 -0
- data/test/plugin/test_storage_local.rb +335 -0
- data/test/plugin_helper/data/cert/cert-key.pem +27 -0
- data/test/plugin_helper/data/cert/cert-with-no-newline.pem +19 -0
- data/test/plugin_helper/data/cert/cert.pem +19 -0
- data/test/plugin_helper/http_server/test_app.rb +65 -0
- data/test/plugin_helper/http_server/test_route.rb +32 -0
- data/test/plugin_helper/test_cert_option.rb +16 -0
- data/test/plugin_helper/test_child_process.rb +794 -0
- data/test/plugin_helper/test_compat_parameters.rb +353 -0
- data/test/plugin_helper/test_event_emitter.rb +51 -0
- data/test/plugin_helper/test_event_loop.rb +52 -0
- data/test/plugin_helper/test_extract.rb +194 -0
- data/test/plugin_helper/test_formatter.rb +255 -0
- data/test/plugin_helper/test_http_server_helper.rb +205 -0
- data/test/plugin_helper/test_inject.rb +519 -0
- data/test/plugin_helper/test_parser.rb +264 -0
- data/test/plugin_helper/test_record_accessor.rb +197 -0
- data/test/plugin_helper/test_retry_state.rb +442 -0
- data/test/plugin_helper/test_server.rb +1714 -0
- data/test/plugin_helper/test_storage.rb +542 -0
- data/test/plugin_helper/test_thread.rb +164 -0
- data/test/plugin_helper/test_timer.rb +132 -0
- data/test/scripts/exec_script.rb +0 -6
- data/test/scripts/fluent/plugin/formatter1/formatter_test1.rb +7 -0
- data/test/scripts/fluent/plugin/formatter2/formatter_test2.rb +7 -0
- data/test/scripts/fluent/plugin/out_test.rb +23 -15
- data/test/scripts/fluent/plugin/out_test2.rb +80 -0
- data/test/test_clock.rb +164 -0
- data/test/test_config.rb +16 -7
- data/test/test_configdsl.rb +2 -2
- data/test/test_event.rb +360 -13
- data/test/test_event_router.rb +108 -11
- data/test/test_event_time.rb +199 -0
- data/test/test_filter.rb +48 -6
- data/test/test_formatter.rb +11 -391
- data/test/test_input.rb +1 -1
- data/test/test_log.rb +591 -31
- data/test/test_mixin.rb +1 -1
- data/test/test_output.rb +121 -185
- data/test/test_plugin.rb +251 -0
- data/test/test_plugin_classes.rb +177 -10
- data/test/test_plugin_helper.rb +81 -0
- data/test/test_plugin_id.rb +101 -0
- data/test/test_process.rb +8 -42
- data/test/test_root_agent.rb +766 -21
- data/test/test_supervisor.rb +481 -0
- data/test/test_test_drivers.rb +135 -0
- data/test/test_time_formatter.rb +282 -0
- data/test/test_time_parser.rb +231 -0
- data/test/test_unique_id.rb +47 -0
- metadata +454 -60
- data/COPYING +0 -14
- data/ChangeLog +0 -666
- data/lib/fluent/buffer.rb +0 -365
- data/lib/fluent/plugin/in_status.rb +0 -76
- data/test/plugin/test_in_status.rb +0 -38
- data/test/test_buffer.rb +0 -624
- data/test/test_parser.rb +0 -1305
@@ -0,0 +1,92 @@
|
|
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 'stringio'
|
18
|
+
require 'zlib'
|
19
|
+
|
20
|
+
module Fluent
|
21
|
+
module Plugin
|
22
|
+
module Compressable
|
23
|
+
def compress(data, **kwargs)
|
24
|
+
output_io = kwargs[:output_io]
|
25
|
+
io = output_io || StringIO.new
|
26
|
+
Zlib::GzipWriter.wrap(io) do |gz|
|
27
|
+
gz.write data
|
28
|
+
end
|
29
|
+
|
30
|
+
output_io || io.string
|
31
|
+
end
|
32
|
+
|
33
|
+
# compressed_data is String like `compress(data1) + compress(data2) + ... + compress(dataN)`
|
34
|
+
# https://www.ruby-forum.com/topic/971591#979503
|
35
|
+
def decompress(compressed_data = nil, output_io: nil, input_io: nil)
|
36
|
+
case
|
37
|
+
when input_io && output_io
|
38
|
+
io_decompress(input_io, output_io)
|
39
|
+
when input_io
|
40
|
+
output_io = StringIO.new
|
41
|
+
io = io_decompress(input_io, output_io)
|
42
|
+
io.string
|
43
|
+
when compressed_data.nil? || compressed_data.empty?
|
44
|
+
# check compressed_data(String) is 0 length
|
45
|
+
compressed_data
|
46
|
+
when output_io
|
47
|
+
# execute after checking compressed_data is empty or not
|
48
|
+
io = StringIO.new(compressed_data)
|
49
|
+
io_decompress(io, output_io)
|
50
|
+
else
|
51
|
+
string_decompress(compressed_data)
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|
55
|
+
private
|
56
|
+
|
57
|
+
def string_decompress(compressed_data)
|
58
|
+
io = StringIO.new(compressed_data)
|
59
|
+
|
60
|
+
out = ''
|
61
|
+
loop do
|
62
|
+
gz = Zlib::GzipReader.new(io)
|
63
|
+
out << gz.read
|
64
|
+
unused = gz.unused
|
65
|
+
gz.finish
|
66
|
+
|
67
|
+
break if unused.nil?
|
68
|
+
adjust = unused.length
|
69
|
+
io.pos -= adjust
|
70
|
+
end
|
71
|
+
|
72
|
+
out
|
73
|
+
end
|
74
|
+
|
75
|
+
def io_decompress(input, output)
|
76
|
+
loop do
|
77
|
+
gz = Zlib::GzipReader.new(input)
|
78
|
+
v = gz.read
|
79
|
+
output.write(v)
|
80
|
+
unused = gz.unused
|
81
|
+
gz.finish
|
82
|
+
|
83
|
+
break if unused.nil?
|
84
|
+
adjust = unused.length
|
85
|
+
input.pos -= adjust
|
86
|
+
end
|
87
|
+
|
88
|
+
output
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
@@ -14,114 +14,9 @@
|
|
14
14
|
# limitations under the License.
|
15
15
|
#
|
16
16
|
|
17
|
-
require '
|
18
|
-
require 'yajl'
|
19
|
-
|
20
|
-
require 'fluent/engine'
|
21
|
-
require 'fluent/plugin'
|
22
|
-
require 'fluent/parser'
|
17
|
+
require 'fluent/compat/exec_util'
|
23
18
|
|
24
19
|
module Fluent
|
25
|
-
|
26
|
-
|
27
|
-
'tsv' => :tsv,
|
28
|
-
'json' => :json,
|
29
|
-
'msgpack' => :msgpack,
|
30
|
-
}
|
31
|
-
|
32
|
-
class Parser
|
33
|
-
def initialize(on_message)
|
34
|
-
@on_message = on_message
|
35
|
-
end
|
36
|
-
end
|
37
|
-
|
38
|
-
class TextParserWrapperParser < Parser
|
39
|
-
def initialize(conf, on_message)
|
40
|
-
@parser = Plugin.new_parser(conf['format'])
|
41
|
-
@parser.configure(conf)
|
42
|
-
super(on_message)
|
43
|
-
end
|
44
|
-
|
45
|
-
def call(io)
|
46
|
-
io.each_line(&method(:each_line))
|
47
|
-
end
|
48
|
-
|
49
|
-
def each_line(line)
|
50
|
-
line.chomp!
|
51
|
-
@parser.parse(line) { |time, record|
|
52
|
-
@on_message.call(record, time)
|
53
|
-
}
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
class TSVParser < Parser
|
58
|
-
def initialize(keys, on_message)
|
59
|
-
@keys = keys
|
60
|
-
super(on_message)
|
61
|
-
end
|
62
|
-
|
63
|
-
def call(io)
|
64
|
-
io.each_line(&method(:each_line))
|
65
|
-
end
|
66
|
-
|
67
|
-
def each_line(line)
|
68
|
-
line.chomp!
|
69
|
-
vals = line.split("\t")
|
70
|
-
|
71
|
-
record = Hash[@keys.zip(vals)]
|
72
|
-
|
73
|
-
@on_message.call(record)
|
74
|
-
end
|
75
|
-
end
|
76
|
-
|
77
|
-
class JSONParser < Parser
|
78
|
-
def call(io)
|
79
|
-
y = Yajl::Parser.new
|
80
|
-
y.on_parse_complete = @on_message
|
81
|
-
y.parse(io)
|
82
|
-
end
|
83
|
-
end
|
84
|
-
|
85
|
-
class MessagePackParser < Parser
|
86
|
-
def call(io)
|
87
|
-
@u = Fluent::Engine.msgpack_factory.unpacker(io)
|
88
|
-
begin
|
89
|
-
@u.each(&@on_message)
|
90
|
-
rescue EOFError
|
91
|
-
end
|
92
|
-
end
|
93
|
-
end
|
94
|
-
|
95
|
-
class Formatter
|
96
|
-
end
|
97
|
-
|
98
|
-
class TSVFormatter < Formatter
|
99
|
-
def initialize(in_keys)
|
100
|
-
@in_keys = in_keys
|
101
|
-
super()
|
102
|
-
end
|
103
|
-
|
104
|
-
def call(record, out)
|
105
|
-
last = @in_keys.length-1
|
106
|
-
for i in 0..last
|
107
|
-
key = @in_keys[i]
|
108
|
-
out << record[key].to_s
|
109
|
-
out << "\t" if i != last
|
110
|
-
end
|
111
|
-
out << "\n"
|
112
|
-
end
|
113
|
-
end
|
114
|
-
|
115
|
-
class JSONFormatter < Formatter
|
116
|
-
def call(record, out)
|
117
|
-
out << Yajl.dump(record) << "\n"
|
118
|
-
end
|
119
|
-
end
|
120
|
-
|
121
|
-
class MessagePackFormatter < Formatter
|
122
|
-
def call(record, out)
|
123
|
-
record.to_msgpack(out)
|
124
|
-
end
|
125
|
-
end
|
126
|
-
end
|
20
|
+
# obsolete
|
21
|
+
ExecUtil = Fluent::Compat::ExecUtil
|
127
22
|
end
|
@@ -14,39 +14,9 @@
|
|
14
14
|
# limitations under the License.
|
15
15
|
#
|
16
16
|
|
17
|
-
|
18
|
-
module FileUtil
|
19
|
-
# Check file is writable if file exists
|
20
|
-
# Check directory is writable if file does not exist
|
21
|
-
#
|
22
|
-
# @param [String] path File path
|
23
|
-
# @return [Boolean] file is writable or not
|
24
|
-
def writable?(path)
|
25
|
-
return false if File.directory?(path)
|
26
|
-
return File.writable?(path) if File.exist?(path)
|
27
|
-
|
28
|
-
dirname = File.dirname(path)
|
29
|
-
return false if !File.directory?(dirname)
|
30
|
-
File.writable?(dirname)
|
31
|
-
end
|
32
|
-
module_function :writable?
|
33
|
-
|
34
|
-
# Check file is writable in conjunction wtih mkdir_p(dirname(path))
|
35
|
-
#
|
36
|
-
# @param [String] path File path
|
37
|
-
# @return [Boolean] file writable or not
|
38
|
-
def writable_p?(path)
|
39
|
-
return false if File.directory?(path)
|
40
|
-
return File.writable?(path) if File.exist?(path)
|
17
|
+
require 'fluent/compat/file_util'
|
41
18
|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
end
|
46
|
-
|
47
|
-
return false if !File.directory?(dirname)
|
48
|
-
File.writable?(dirname)
|
49
|
-
end
|
50
|
-
module_function :writable_p?
|
51
|
-
end
|
19
|
+
module Fluent
|
20
|
+
# obsolete
|
21
|
+
FileUtil = Fluent::Compat::FileUtil
|
52
22
|
end
|
@@ -0,0 +1,120 @@
|
|
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
|
+
module Fluent
|
18
|
+
module FileWrapper
|
19
|
+
def self.open(*args)
|
20
|
+
io = WindowsFile.new(*args).io
|
21
|
+
if block_given?
|
22
|
+
v = yield io
|
23
|
+
io.close
|
24
|
+
v
|
25
|
+
else
|
26
|
+
io
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def self.stat(path)
|
31
|
+
f = WindowsFile.new(path)
|
32
|
+
s = f.stat
|
33
|
+
f.close
|
34
|
+
s
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
module WindowsFileExtension
|
39
|
+
attr_reader :path
|
40
|
+
|
41
|
+
def stat
|
42
|
+
s = super
|
43
|
+
s.instance_variable_set :@ino, @ino
|
44
|
+
def s.ino; @ino; end
|
45
|
+
s
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
# To open and get stat with setting FILE_SHARE_DELETE
|
50
|
+
class WindowsFile
|
51
|
+
require 'windows/file'
|
52
|
+
require 'windows/error'
|
53
|
+
require 'windows/handle'
|
54
|
+
require 'windows/nio'
|
55
|
+
|
56
|
+
include Windows::Error
|
57
|
+
include Windows::File
|
58
|
+
include Windows::Handle
|
59
|
+
include Windows::NIO
|
60
|
+
|
61
|
+
def initialize(path, mode='r', sharemode=FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE)
|
62
|
+
@path = path
|
63
|
+
@file_handle = INVALID_HANDLE_VALUE
|
64
|
+
@mode = mode
|
65
|
+
|
66
|
+
|
67
|
+
access, creationdisposition, seektoend = case mode.delete('b')
|
68
|
+
when "r" ; [FILE_GENERIC_READ , OPEN_EXISTING, false]
|
69
|
+
when "r+"; [FILE_GENERIC_READ | FILE_GENERIC_WRITE, OPEN_ALWAYS , false]
|
70
|
+
when "w" ; [FILE_GENERIC_WRITE , CREATE_ALWAYS, false]
|
71
|
+
when "w+"; [FILE_GENERIC_READ | FILE_GENERIC_WRITE, CREATE_ALWAYS, false]
|
72
|
+
when "a" ; [FILE_GENERIC_WRITE , OPEN_ALWAYS , true]
|
73
|
+
when "a+"; [FILE_GENERIC_READ | FILE_GENERIC_WRITE, OPEN_ALWAYS , true]
|
74
|
+
else raise "unknown mode '#{mode}'"
|
75
|
+
end
|
76
|
+
|
77
|
+
@file_handle = CreateFile.call(@path, access, sharemode,
|
78
|
+
0, creationdisposition, FILE_ATTRIBUTE_NORMAL, 0)
|
79
|
+
if @file_handle == INVALID_HANDLE_VALUE
|
80
|
+
err = GetLastError.call
|
81
|
+
if err == ERROR_FILE_NOT_FOUND || err == ERROR_PATH_NOT_FOUND || err == ERROR_ACCESS_DENIED
|
82
|
+
raise SystemCallError.new(2)
|
83
|
+
end
|
84
|
+
raise SystemCallError.new(err)
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
def close
|
89
|
+
CloseHandle.call(@file_handle)
|
90
|
+
@file_handle = INVALID_HANDLE_VALUE
|
91
|
+
end
|
92
|
+
|
93
|
+
def io
|
94
|
+
fd = _open_osfhandle(@file_handle, 0)
|
95
|
+
raise Errno::ENOENT if fd == -1
|
96
|
+
io = File.for_fd(fd, @mode)
|
97
|
+
io.instance_variable_set :@ino, self.ino
|
98
|
+
io.instance_variable_set :@path, @path
|
99
|
+
io.extend WindowsFileExtension
|
100
|
+
io
|
101
|
+
end
|
102
|
+
|
103
|
+
def ino
|
104
|
+
by_handle_file_information = '\0'*(4+8+8+8+4+4+4+4+4+4) #72bytes
|
105
|
+
|
106
|
+
unless GetFileInformationByHandle.call(@file_handle, by_handle_file_information)
|
107
|
+
return 0
|
108
|
+
end
|
109
|
+
|
110
|
+
by_handle_file_information.unpack("I11Q1")[11] # fileindex
|
111
|
+
end
|
112
|
+
|
113
|
+
def stat
|
114
|
+
s = File.stat(@path)
|
115
|
+
s.instance_variable_set :@ino, self.ino
|
116
|
+
def s.ino; @ino; end
|
117
|
+
s
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end if Fluent.windows?
|
@@ -0,0 +1,93 @@
|
|
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/base'
|
18
|
+
|
19
|
+
require 'fluent/event'
|
20
|
+
require 'fluent/log'
|
21
|
+
require 'fluent/plugin_id'
|
22
|
+
require 'fluent/plugin_helper'
|
23
|
+
|
24
|
+
module Fluent
|
25
|
+
module Plugin
|
26
|
+
class Filter < Base
|
27
|
+
include PluginId
|
28
|
+
include PluginLoggerMixin
|
29
|
+
include PluginHelper::Mixin
|
30
|
+
|
31
|
+
helpers_internal :event_emitter
|
32
|
+
|
33
|
+
attr_reader :has_filter_with_time
|
34
|
+
|
35
|
+
def initialize
|
36
|
+
super
|
37
|
+
@has_filter_with_time = has_filter_with_time?
|
38
|
+
end
|
39
|
+
|
40
|
+
def filter(tag, time, record)
|
41
|
+
raise NotImplementedError, "BUG: filter plugins MUST implement this method"
|
42
|
+
end
|
43
|
+
|
44
|
+
def filter_with_time(tag, time, record)
|
45
|
+
raise NotImplementedError, "BUG: filter plugins MUST implement this method"
|
46
|
+
end
|
47
|
+
|
48
|
+
def filter_stream(tag, es)
|
49
|
+
new_es = MultiEventStream.new
|
50
|
+
if @has_filter_with_time
|
51
|
+
es.each do |time, record|
|
52
|
+
begin
|
53
|
+
filtered_time, filtered_record = filter_with_time(tag, time, record)
|
54
|
+
new_es.add(filtered_time, filtered_record) if filtered_time && filtered_record
|
55
|
+
rescue => e
|
56
|
+
router.emit_error_event(tag, time, record, e)
|
57
|
+
end
|
58
|
+
end
|
59
|
+
else
|
60
|
+
es.each do |time, record|
|
61
|
+
begin
|
62
|
+
filtered_record = filter(tag, time, record)
|
63
|
+
new_es.add(time, filtered_record) if filtered_record
|
64
|
+
rescue => e
|
65
|
+
router.emit_error_event(tag, time, record, e)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
new_es
|
70
|
+
end
|
71
|
+
|
72
|
+
private
|
73
|
+
|
74
|
+
def has_filter_with_time?
|
75
|
+
implmented_methods = self.class.instance_methods(false)
|
76
|
+
# Plugins that override `filter_stream` don't need check,
|
77
|
+
# because they may not call `filter` or `filter_with_time`
|
78
|
+
# for example fluentd/lib/fluent/plugin/filter_record_transformer.rb
|
79
|
+
return nil if implmented_methods.include?(:filter_stream)
|
80
|
+
case
|
81
|
+
when [:filter, :filter_with_time].all? { |e| implmented_methods.include?(e) }
|
82
|
+
raise "BUG: Filter plugins MUST implement either `filter` or `filter_with_time`"
|
83
|
+
when implmented_methods.include?(:filter)
|
84
|
+
false
|
85
|
+
when implmented_methods.include?(:filter_with_time)
|
86
|
+
true
|
87
|
+
else
|
88
|
+
raise NotImplementedError, "BUG: Filter plugins MUST implement either `filter` or `filter_with_time`"
|
89
|
+
end
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
end
|
@@ -14,18 +14,28 @@
|
|
14
14
|
# limitations under the License.
|
15
15
|
#
|
16
16
|
|
17
|
-
require 'fluent/filter'
|
17
|
+
require 'fluent/plugin/filter'
|
18
18
|
require 'fluent/config/error'
|
19
|
+
require 'fluent/plugin/string_util'
|
19
20
|
|
20
|
-
module Fluent
|
21
|
+
module Fluent::Plugin
|
21
22
|
class GrepFilter < Filter
|
22
23
|
Fluent::Plugin.register_filter('grep', self)
|
23
24
|
|
24
25
|
def initialize
|
25
26
|
super
|
26
|
-
|
27
|
+
|
28
|
+
@_regexp_and_conditions = nil
|
29
|
+
@_exclude_and_conditions = nil
|
30
|
+
@_regexp_or_conditions = nil
|
31
|
+
@_exclude_or_conditions = nil
|
27
32
|
end
|
28
33
|
|
34
|
+
# for test
|
35
|
+
attr_reader :_regexp_and_conditions, :_exclude_and_conditions, :_regexp_or_conditions, :_exclude_or_conditions
|
36
|
+
|
37
|
+
helpers :record_accessor
|
38
|
+
|
29
39
|
REGEXP_MAX_NUM = 20
|
30
40
|
|
31
41
|
(1..REGEXP_MAX_NUM).each {|i| config_param :"regexp#{i}", :string, default: nil, deprecated: "Use <regexp> section" }
|
@@ -35,72 +45,145 @@ module Fluent
|
|
35
45
|
desc "The field name to which the regular expression is applied."
|
36
46
|
config_param :key, :string
|
37
47
|
desc "The regular expression."
|
38
|
-
config_param :pattern
|
39
|
-
Regexp.compile(value)
|
40
|
-
end
|
48
|
+
config_param :pattern, :regexp
|
41
49
|
end
|
42
50
|
|
43
51
|
config_section :exclude, param_name: :excludes, multi: true do
|
44
52
|
desc "The field name to which the regular expression is applied."
|
45
53
|
config_param :key, :string
|
46
54
|
desc "The regular expression."
|
47
|
-
config_param :pattern
|
48
|
-
|
55
|
+
config_param :pattern, :regexp
|
56
|
+
end
|
57
|
+
|
58
|
+
config_section :and, param_name: :and_conditions, multi: true do
|
59
|
+
config_section :regexp, param_name: :regexps, multi: true do
|
60
|
+
desc "The field name to which the regular expression is applied."
|
61
|
+
config_param :key, :string
|
62
|
+
desc "The regular expression."
|
63
|
+
config_param :pattern, :regexp
|
64
|
+
end
|
65
|
+
config_section :exclude, param_name: :excludes, multi: true do
|
66
|
+
desc "The field name to which the regular expression is applied."
|
67
|
+
config_param :key, :string
|
68
|
+
desc "The regular expression."
|
69
|
+
config_param :pattern, :regexp
|
49
70
|
end
|
50
71
|
end
|
51
72
|
|
52
|
-
|
53
|
-
|
54
|
-
|
73
|
+
config_section :or, param_name: :or_conditions, multi: true do
|
74
|
+
config_section :regexp, param_name: :regexps, multi: true do
|
75
|
+
desc "The field name to which the regular expression is applied."
|
76
|
+
config_param :key, :string
|
77
|
+
desc "The regular expression."
|
78
|
+
config_param :pattern, :regexp
|
79
|
+
end
|
80
|
+
config_section :exclude, param_name: :excludes, multi: true do
|
81
|
+
desc "The field name to which the regular expression is applied."
|
82
|
+
config_param :key, :string
|
83
|
+
desc "The regular expression."
|
84
|
+
config_param :pattern, :regexp
|
85
|
+
end
|
86
|
+
end
|
55
87
|
|
56
88
|
def configure(conf)
|
57
89
|
super
|
58
90
|
|
59
|
-
|
91
|
+
regexp_and_conditions = {}
|
92
|
+
regexp_or_conditions = {}
|
93
|
+
exclude_and_conditions = {}
|
94
|
+
exclude_or_conditions = {}
|
95
|
+
|
60
96
|
(1..REGEXP_MAX_NUM).each do |i|
|
61
97
|
next unless conf["regexp#{i}"]
|
62
98
|
key, regexp = conf["regexp#{i}"].split(/ /, 2)
|
63
|
-
raise ConfigError, "regexp#{i} does not contain 2 parameters" unless regexp
|
64
|
-
raise ConfigError, "regexp#{i} contains a duplicated key, #{key}" if
|
65
|
-
|
99
|
+
raise Fluent::ConfigError, "regexp#{i} does not contain 2 parameters" unless regexp
|
100
|
+
raise Fluent::ConfigError, "regexp#{i} contains a duplicated key, #{key}" if regexp_and_conditions[key]
|
101
|
+
regexp_and_conditions[key] = Expression.new(record_accessor_create(key), Regexp.compile(regexp))
|
66
102
|
end
|
67
103
|
|
68
|
-
@_excludes = {}
|
69
104
|
(1..REGEXP_MAX_NUM).each do |i|
|
70
105
|
next unless conf["exclude#{i}"]
|
71
106
|
key, exclude = conf["exclude#{i}"].split(/ /, 2)
|
72
|
-
raise ConfigError, "exclude#{i} does not contain 2 parameters" unless exclude
|
73
|
-
raise ConfigError, "exclude#{i} contains a duplicated key, #{key}" if
|
74
|
-
|
107
|
+
raise Fluent::ConfigError, "exclude#{i} does not contain 2 parameters" unless exclude
|
108
|
+
raise Fluent::ConfigError, "exclude#{i} contains a duplicated key, #{key}" if exclude_or_conditions[key]
|
109
|
+
exclude_or_conditions[key] = Expression.new(record_accessor_create(key), Regexp.compile(exclude))
|
75
110
|
end
|
76
111
|
|
112
|
+
if @regexps.size > 1
|
113
|
+
log.info "Top level multiple <regexp> is intepreted as 'and' condition"
|
114
|
+
end
|
77
115
|
@regexps.each do |e|
|
78
|
-
raise Fluent::ConfigError, "Duplicate key: #{e.key}" if
|
79
|
-
|
116
|
+
raise Fluent::ConfigError, "Duplicate key: #{e.key}" if regexp_and_conditions.key?(e.key)
|
117
|
+
regexp_and_conditions[e.key] = Expression.new(record_accessor_create(e.key), e.pattern)
|
118
|
+
end
|
119
|
+
|
120
|
+
if @excludes.size > 1
|
121
|
+
log.info "Top level multiple <exclude> is intepreted as 'or' condition"
|
80
122
|
end
|
81
123
|
@excludes.each do |e|
|
82
|
-
raise Fluent::ConfigError, "Duplicate key: #{e.key}" if
|
83
|
-
|
124
|
+
raise Fluent::ConfigError, "Duplicate key: #{e.key}" if exclude_or_conditions.key?(e.key)
|
125
|
+
exclude_or_conditions[e.key] = Expression.new(record_accessor_create(e.key), e.pattern)
|
84
126
|
end
|
127
|
+
|
128
|
+
@and_conditions.each do |and_condition|
|
129
|
+
if !and_condition.regexps.empty? && !and_condition.excludes.empty?
|
130
|
+
raise Fluent::ConfigError, "Do not specify both <regexp> and <exclude> in <and>"
|
131
|
+
end
|
132
|
+
and_condition.regexps.each do |e|
|
133
|
+
raise Fluent::ConfigError, "Duplicate key in <and>: #{e.key}" if regexp_and_conditions.key?(e.key)
|
134
|
+
regexp_and_conditions[e.key] = Expression.new(record_accessor_create(e.key), e.pattern)
|
135
|
+
end
|
136
|
+
and_condition.excludes.each do |e|
|
137
|
+
raise Fluent::ConfigError, "Duplicate key in <and>: #{e.key}" if exclude_and_conditions.key?(e.key)
|
138
|
+
exclude_and_conditions[e.key] = Expression.new(record_accessor_create(e.key), e.pattern)
|
139
|
+
end
|
140
|
+
end
|
141
|
+
|
142
|
+
@or_conditions.each do |or_condition|
|
143
|
+
if !or_condition.regexps.empty? && !or_condition.excludes.empty?
|
144
|
+
raise Fluent::ConfigError, "Do not specify both <regexp> and <exclude> in <or>"
|
145
|
+
end
|
146
|
+
or_condition.regexps.each do |e|
|
147
|
+
raise Fluent::ConfigError, "Duplicate key in <or>: #{e.key}" if regexp_or_conditions.key?(e.key)
|
148
|
+
regexp_or_conditions[e.key] = Expression.new(record_accessor_create(e.key), e.pattern)
|
149
|
+
end
|
150
|
+
or_condition.excludes.each do |e|
|
151
|
+
raise Fluent::ConfigError, "Duplicate key in <or>: #{e.key}" if exclude_or_conditions.key?(e.key)
|
152
|
+
exclude_or_conditions[e.key] = Expression.new(record_accessor_create(e.key), e.pattern)
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
156
|
+
@_regexp_and_conditions = regexp_and_conditions.values unless regexp_and_conditions.empty?
|
157
|
+
@_exclude_and_conditions = exclude_and_conditions.values unless exclude_and_conditions.empty?
|
158
|
+
@_regexp_or_conditions = regexp_or_conditions.values unless regexp_or_conditions.empty?
|
159
|
+
@_exclude_or_conditions = exclude_or_conditions.values unless exclude_or_conditions.empty?
|
85
160
|
end
|
86
161
|
|
87
162
|
def filter(tag, time, record)
|
88
|
-
result = nil
|
89
163
|
begin
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
164
|
+
if @_regexp_and_conditions && @_regexp_and_conditions.any? { |expression| !expression.match?(record) }
|
165
|
+
return nil
|
166
|
+
end
|
167
|
+
if @_regexp_or_conditions && @_regexp_or_conditions.none? { |expression| expression.match?(record) }
|
168
|
+
return nil
|
169
|
+
end
|
170
|
+
if @_exclude_and_conditions && @_exclude_and_conditions.all? { |expression| expression.match?(record) }
|
171
|
+
return nil
|
172
|
+
end
|
173
|
+
if @_exclude_or_conditions && @_exclude_or_conditions.any? { |expression| expression.match?(record) }
|
174
|
+
return nil
|
98
175
|
end
|
99
176
|
rescue => e
|
100
|
-
log.warn "failed to grep events",
|
177
|
+
log.warn "failed to grep events", error: e
|
101
178
|
log.warn_backtrace
|
102
179
|
end
|
103
|
-
|
180
|
+
record
|
181
|
+
end
|
182
|
+
|
183
|
+
Expression = Struct.new(:key, :pattern) do
|
184
|
+
def match?(record)
|
185
|
+
::Fluent::StringUtil.match_regexp(pattern, key.call(record).to_s)
|
186
|
+
end
|
104
187
|
end
|
105
188
|
end
|
106
189
|
end
|