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
data/lib/fluent/supervisor.rb
CHANGED
@@ -14,78 +14,389 @@
|
|
14
14
|
# limitations under the License.
|
15
15
|
#
|
16
16
|
|
17
|
-
require '
|
18
|
-
require 'fcntl'
|
19
|
-
|
20
|
-
begin
|
21
|
-
require 'sigdump/setup'
|
22
|
-
rescue Exception
|
23
|
-
# ignore LoadError and others (related with signals): it may raise these errors in Windows
|
24
|
-
end
|
17
|
+
require 'fileutils'
|
25
18
|
|
26
19
|
require 'fluent/config'
|
20
|
+
require 'fluent/counter'
|
27
21
|
require 'fluent/env'
|
28
22
|
require 'fluent/engine'
|
23
|
+
require 'fluent/error'
|
29
24
|
require 'fluent/log'
|
30
25
|
require 'fluent/plugin'
|
31
26
|
require 'fluent/rpc'
|
32
27
|
require 'fluent/system_config'
|
28
|
+
require 'serverengine'
|
29
|
+
|
30
|
+
if Fluent.windows?
|
31
|
+
require 'windows/library'
|
32
|
+
require 'windows/synchronize'
|
33
|
+
require 'windows/system_info'
|
34
|
+
include Windows::Library
|
35
|
+
include Windows::Synchronize
|
36
|
+
include Windows::SystemInfo
|
37
|
+
require 'win32/ipc'
|
38
|
+
require 'win32/event'
|
39
|
+
end
|
33
40
|
|
34
41
|
module Fluent
|
35
|
-
|
36
|
-
def
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
42
|
+
module ServerModule
|
43
|
+
def before_run
|
44
|
+
@start_time = Time.now
|
45
|
+
@rpc_server = nil
|
46
|
+
@counter = nil
|
47
|
+
|
48
|
+
if config[:rpc_endpoint]
|
49
|
+
@rpc_endpoint = config[:rpc_endpoint]
|
50
|
+
@enable_get_dump = config[:enable_get_dump]
|
51
|
+
run_rpc_server
|
41
52
|
end
|
53
|
+
install_supervisor_signal_handlers
|
54
|
+
|
55
|
+
if config[:signame]
|
56
|
+
@signame = config[:signame]
|
57
|
+
install_windows_event_handler
|
58
|
+
end
|
59
|
+
|
60
|
+
if counter = config[:counter_server]
|
61
|
+
run_counter_server(counter)
|
62
|
+
end
|
63
|
+
|
64
|
+
socket_manager_path = ServerEngine::SocketManager::Server.generate_path
|
65
|
+
ServerEngine::SocketManager::Server.open(socket_manager_path)
|
66
|
+
ENV['SERVERENGINE_SOCKETMANAGER_PATH'] = socket_manager_path.to_s
|
42
67
|
end
|
43
68
|
|
44
|
-
def
|
45
|
-
if
|
46
|
-
|
47
|
-
|
48
|
-
|
69
|
+
def after_run
|
70
|
+
stop_rpc_server if @rpc_endpoint
|
71
|
+
stop_counter_server if @counter
|
72
|
+
Fluent::Supervisor.cleanup_resources
|
73
|
+
end
|
74
|
+
|
75
|
+
def run_rpc_server
|
76
|
+
@rpc_server = RPC::Server.new(@rpc_endpoint, $log)
|
77
|
+
|
78
|
+
# built-in RPC for signals
|
79
|
+
@rpc_server.mount_proc('/api/processes.interruptWorkers') { |req, res|
|
80
|
+
$log.debug "fluentd RPC got /api/processes.interruptWorkers request"
|
81
|
+
Process.kill :INT, $$
|
82
|
+
nil
|
83
|
+
}
|
84
|
+
@rpc_server.mount_proc('/api/processes.killWorkers') { |req, res|
|
85
|
+
$log.debug "fluentd RPC got /api/processes.killWorkers request"
|
86
|
+
Process.kill :TERM, $$
|
87
|
+
nil
|
88
|
+
}
|
89
|
+
@rpc_server.mount_proc('/api/processes.flushBuffersAndKillWorkers') { |req, res|
|
90
|
+
$log.debug "fluentd RPC got /api/processes.flushBuffersAndKillWorkers request"
|
91
|
+
if Fluent.windows?
|
92
|
+
$log.warn "operation 'flushBuffersAndKillWorkers' is not supported on Windows now."
|
93
|
+
else
|
94
|
+
Process.kill :USR1, $$
|
95
|
+
Process.kill :TERM, $$
|
96
|
+
end
|
97
|
+
nil
|
98
|
+
}
|
99
|
+
@rpc_server.mount_proc('/api/plugins.flushBuffers') { |req, res|
|
100
|
+
$log.debug "fluentd RPC got /api/plugins.flushBuffers request"
|
101
|
+
unless Fluent.windows?
|
102
|
+
Process.kill :USR1, $$
|
103
|
+
end
|
104
|
+
nil
|
105
|
+
}
|
106
|
+
@rpc_server.mount_proc('/api/config.reload') { |req, res|
|
107
|
+
$log.debug "fluentd RPC got /api/config.reload request"
|
108
|
+
if Fluent.windows?
|
109
|
+
# restart worker with auto restarting by killing
|
110
|
+
kill_worker
|
111
|
+
else
|
112
|
+
Process.kill :HUP, $$
|
113
|
+
end
|
114
|
+
nil
|
115
|
+
}
|
116
|
+
@rpc_server.mount_proc('/api/config.dump') { |req, res|
|
117
|
+
$log.debug "fluentd RPC got /api/config.dump request"
|
118
|
+
$log.info "dump in-memory config"
|
119
|
+
supervisor_dump_config_handler
|
120
|
+
nil
|
121
|
+
}
|
122
|
+
|
123
|
+
@rpc_server.mount_proc('/api/config.getDump') { |req, res|
|
124
|
+
$log.debug "fluentd RPC got /api/config.dump request"
|
125
|
+
$log.info "get dump in-memory config via HTTP"
|
126
|
+
res.body = supervisor_get_dump_config_handler
|
127
|
+
[nil, nil, res]
|
128
|
+
} if @enable_get_dump
|
129
|
+
|
130
|
+
@rpc_server.start
|
131
|
+
end
|
132
|
+
|
133
|
+
def stop_rpc_server
|
134
|
+
@rpc_server.shutdown
|
135
|
+
end
|
136
|
+
|
137
|
+
def run_counter_server(counter_conf)
|
138
|
+
@counter = Fluent::Counter::Server.new(
|
139
|
+
counter_conf.scope,
|
140
|
+
{host: counter_conf.bind, port: counter_conf.port, log: $log, path: counter_conf.backup_path}
|
141
|
+
)
|
142
|
+
@counter.start
|
143
|
+
end
|
144
|
+
|
145
|
+
def stop_counter_server
|
146
|
+
@counter.stop
|
147
|
+
end
|
148
|
+
|
149
|
+
def install_supervisor_signal_handlers
|
150
|
+
trap :HUP do
|
151
|
+
$log.debug "fluentd supervisor process get SIGHUP"
|
152
|
+
supervisor_sighup_handler
|
153
|
+
end unless Fluent.windows?
|
154
|
+
|
155
|
+
trap :USR1 do
|
156
|
+
$log.debug "fluentd supervisor process get SIGUSR1"
|
157
|
+
supervisor_sigusr1_handler
|
158
|
+
end unless Fluent.windows?
|
159
|
+
end
|
160
|
+
|
161
|
+
def install_windows_event_handler
|
162
|
+
Thread.new do
|
163
|
+
ev = Win32::Event.new(@signame)
|
164
|
+
begin
|
165
|
+
ev.reset
|
166
|
+
until WaitForSingleObject(ev.handle, 0) == WAIT_OBJECT_0
|
167
|
+
sleep 1
|
168
|
+
end
|
169
|
+
kill_worker
|
170
|
+
stop(true)
|
171
|
+
ensure
|
172
|
+
ev.close
|
173
|
+
end
|
49
174
|
end
|
50
175
|
end
|
51
176
|
|
177
|
+
def supervisor_sighup_handler
|
178
|
+
kill_worker
|
179
|
+
end
|
180
|
+
|
181
|
+
def supervisor_sigusr1_handler
|
182
|
+
if log = config[:logger_initializer]
|
183
|
+
# Creating new thread due to mutex can't lock
|
184
|
+
# in main thread during trap context
|
185
|
+
Thread.new {
|
186
|
+
log.reopen!
|
187
|
+
}.run
|
188
|
+
end
|
189
|
+
|
190
|
+
if config[:worker_pid]
|
191
|
+
config[:worker_pid].each_value do |pid|
|
192
|
+
Process.kill(:USR1, pid)
|
193
|
+
# don't rescue Errno::ESRCH here (invalid status)
|
194
|
+
end
|
195
|
+
end
|
196
|
+
end
|
197
|
+
|
198
|
+
def kill_worker
|
199
|
+
if config[:worker_pid]
|
200
|
+
pids = config[:worker_pid].clone
|
201
|
+
config[:worker_pid].clear
|
202
|
+
pids.each_value do |pid|
|
203
|
+
if Fluent.windows?
|
204
|
+
Process.kill :KILL, pid
|
205
|
+
else
|
206
|
+
Process.kill :TERM, pid
|
207
|
+
end
|
208
|
+
end
|
209
|
+
end
|
210
|
+
end
|
211
|
+
|
212
|
+
def supervisor_dump_config_handler
|
213
|
+
$log.info config[:fluentd_conf].to_s
|
214
|
+
end
|
215
|
+
|
216
|
+
def supervisor_get_dump_config_handler
|
217
|
+
{conf: config[:fluentd_conf].to_s}
|
218
|
+
end
|
219
|
+
end
|
220
|
+
|
221
|
+
module WorkerModule
|
222
|
+
def spawn(process_manager)
|
223
|
+
main_cmd = config[:main_cmd]
|
224
|
+
env = {
|
225
|
+
'SERVERENGINE_WORKER_ID' => @worker_id.to_i.to_s,
|
226
|
+
}
|
227
|
+
@pm = process_manager.spawn(env, *main_cmd)
|
228
|
+
end
|
229
|
+
|
230
|
+
def after_start
|
231
|
+
(config[:worker_pid] ||= {})[@worker_id] = @pm.pid
|
232
|
+
end
|
233
|
+
end
|
234
|
+
|
235
|
+
class Supervisor
|
236
|
+
def self.load_config(path, params = {})
|
237
|
+
|
238
|
+
pre_loadtime = 0
|
239
|
+
pre_loadtime = params['pre_loadtime'].to_i if params['pre_loadtime']
|
240
|
+
pre_config_mtime = nil
|
241
|
+
pre_config_mtime = params['pre_config_mtime'] if params['pre_config_mtime']
|
242
|
+
config_mtime = File.mtime(path)
|
243
|
+
|
244
|
+
# reuse previous config if last load time is within 5 seconds and mtime of the config file is not changed
|
245
|
+
if Time.now - Time.at(pre_loadtime) < 5 and config_mtime == pre_config_mtime
|
246
|
+
return params['pre_conf']
|
247
|
+
end
|
248
|
+
|
249
|
+
config_fname = File.basename(path)
|
250
|
+
config_basedir = File.dirname(path)
|
251
|
+
# Assume fluent.conf encoding is UTF-8
|
252
|
+
config_data = File.open(path, "r:#{params['conf_encoding']}:utf-8") {|f| f.read }
|
253
|
+
inline_config = params['inline_config']
|
254
|
+
if inline_config == '-'
|
255
|
+
config_data << "\n" << STDIN.read
|
256
|
+
elsif inline_config
|
257
|
+
config_data << "\n" << inline_config.gsub("\\n","\n")
|
258
|
+
end
|
259
|
+
fluentd_conf = Fluent::Config.parse(config_data, config_fname, config_basedir, params['use_v1_config'])
|
260
|
+
system_config = SystemConfig.create(fluentd_conf)
|
261
|
+
|
262
|
+
# these params must NOT be configured via system config here.
|
263
|
+
# these may be overridden by command line params.
|
264
|
+
workers = params['workers']
|
265
|
+
root_dir = params['root_dir']
|
266
|
+
log_level = params['log_level']
|
267
|
+
suppress_repeated_stacktrace = params['suppress_repeated_stacktrace']
|
268
|
+
|
269
|
+
log_path = params['log_path']
|
270
|
+
chuser = params['chuser']
|
271
|
+
chgroup = params['chgroup']
|
272
|
+
log_rotate_age = params['log_rotate_age']
|
273
|
+
log_rotate_size = params['log_rotate_size']
|
274
|
+
rpc_endpoint = system_config.rpc_endpoint
|
275
|
+
enable_get_dump = system_config.enable_get_dump
|
276
|
+
counter_server = system_config.counter_server
|
277
|
+
|
278
|
+
log_opts = {suppress_repeated_stacktrace: suppress_repeated_stacktrace}
|
279
|
+
logger_initializer = Supervisor::LoggerInitializer.new(
|
280
|
+
log_path, log_level, chuser, chgroup, log_opts,
|
281
|
+
log_rotate_age: log_rotate_age,
|
282
|
+
log_rotate_size: log_rotate_size
|
283
|
+
)
|
284
|
+
# this #init sets initialized logger to $log
|
285
|
+
logger_initializer.init(:supervisor, 0)
|
286
|
+
logger = $log
|
287
|
+
|
288
|
+
command_sender = Fluent.windows? ? "pipe" : "signal"
|
289
|
+
|
290
|
+
# ServerEngine's "daemonize" option is boolean, and path of pid file is brought by "pid_path"
|
291
|
+
pid_path = params['daemonize']
|
292
|
+
daemonize = !!params['daemonize']
|
293
|
+
main_cmd = params['main_cmd']
|
294
|
+
signame = params['signame']
|
295
|
+
|
296
|
+
se_config = {
|
297
|
+
worker_type: 'spawn',
|
298
|
+
workers: workers,
|
299
|
+
log_stdin: false,
|
300
|
+
log_stdout: false,
|
301
|
+
log_stderr: false,
|
302
|
+
enable_heartbeat: true,
|
303
|
+
auto_heartbeat: false,
|
304
|
+
unrecoverable_exit_codes: [2],
|
305
|
+
stop_immediately_at_unrecoverable_exit: true,
|
306
|
+
root_dir: root_dir,
|
307
|
+
logger: logger,
|
308
|
+
log: logger.out,
|
309
|
+
log_path: log_path,
|
310
|
+
log_level: log_level,
|
311
|
+
logger_initializer: logger_initializer,
|
312
|
+
chuser: chuser,
|
313
|
+
chgroup: chgroup,
|
314
|
+
chumask: 0,
|
315
|
+
suppress_repeated_stacktrace: suppress_repeated_stacktrace,
|
316
|
+
daemonize: daemonize,
|
317
|
+
rpc_endpoint: rpc_endpoint,
|
318
|
+
counter_server: counter_server,
|
319
|
+
enable_get_dump: enable_get_dump,
|
320
|
+
windows_daemon_cmdline: [ServerEngine.ruby_bin_path,
|
321
|
+
File.join(File.dirname(__FILE__), 'daemon.rb'),
|
322
|
+
ServerModule.name,
|
323
|
+
WorkerModule.name,
|
324
|
+
path,
|
325
|
+
JSON.dump(params)],
|
326
|
+
command_sender: command_sender,
|
327
|
+
fluentd_conf: fluentd_conf,
|
328
|
+
main_cmd: main_cmd,
|
329
|
+
signame: signame,
|
330
|
+
}
|
331
|
+
if daemonize
|
332
|
+
se_config[:pid_path] = pid_path
|
333
|
+
end
|
334
|
+
pre_params = params.dup
|
335
|
+
params['pre_loadtime'] = Time.now.to_i
|
336
|
+
params['pre_config_mtime'] = config_mtime
|
337
|
+
params['pre_conf'] = se_config
|
338
|
+
# prevent pre_conf from being too big by reloading many times.
|
339
|
+
pre_params['pre_conf'] = nil
|
340
|
+
params['pre_conf'][:windows_daemon_cmdline][5] = JSON.dump(pre_params)
|
341
|
+
|
342
|
+
return se_config
|
343
|
+
end
|
344
|
+
|
52
345
|
class LoggerInitializer
|
53
|
-
def initialize(path, level, chuser, chgroup, opts)
|
346
|
+
def initialize(path, level, chuser, chgroup, opts, log_rotate_age: nil, log_rotate_size: nil)
|
54
347
|
@path = path
|
55
348
|
@level = level
|
56
349
|
@chuser = chuser
|
57
350
|
@chgroup = chgroup
|
58
351
|
@opts = opts
|
352
|
+
@log_rotate_age = log_rotate_age
|
353
|
+
@log_rotate_size = log_rotate_size
|
59
354
|
end
|
60
355
|
|
61
|
-
def init
|
356
|
+
def init(process_type, worker_id)
|
357
|
+
@opts[:process_type] = process_type
|
358
|
+
@opts[:worker_id] = worker_id
|
359
|
+
|
62
360
|
if @path && @path != "-"
|
63
|
-
@
|
361
|
+
@logdev = if @log_rotate_age || @log_rotate_size
|
362
|
+
Fluent::LogDeviceIO.new(@path, shift_age: @log_rotate_age, shift_size: @log_rotate_size)
|
363
|
+
else
|
364
|
+
File.open(@path, "a")
|
365
|
+
end
|
64
366
|
if @chuser || @chgroup
|
65
|
-
chuid = @chuser ?
|
66
|
-
chgid = @chgroup ?
|
367
|
+
chuid = @chuser ? ServerEngine::Privilege.get_etc_passwd(@chuser).uid : nil
|
368
|
+
chgid = @chgroup ? ServerEngine::Privilege.get_etc_group(@chgroup).gid : nil
|
67
369
|
File.chown(chuid, chgid, @path)
|
68
370
|
end
|
69
371
|
else
|
70
|
-
@
|
372
|
+
@logdev = STDOUT
|
71
373
|
end
|
72
374
|
|
73
|
-
|
375
|
+
dl_opts = {}
|
376
|
+
# subtract 1 to match serverengine daemon logger side logging severity.
|
377
|
+
dl_opts[:log_level] = @level - 1
|
378
|
+
logger = ServerEngine::DaemonLogger.new(@logdev, dl_opts)
|
379
|
+
$log = Fluent::Log.new(logger, @opts)
|
74
380
|
$log.enable_color(false) if @path
|
75
381
|
$log.enable_debug if @level <= Fluent::Log::LEVEL_DEBUG
|
76
382
|
end
|
77
383
|
|
78
384
|
def stdout?
|
79
|
-
@
|
385
|
+
@logdev == STDOUT
|
80
386
|
end
|
81
387
|
|
82
388
|
def reopen!
|
83
389
|
if @path && @path != "-"
|
84
|
-
@
|
390
|
+
@logdev.reopen(@path, "a")
|
85
391
|
end
|
86
392
|
self
|
87
393
|
end
|
88
394
|
|
395
|
+
def apply_options(opts)
|
396
|
+
$log.format = opts[:format] if opts[:format]
|
397
|
+
$log.time_format = opts[:time_format] if opts[:time_format]
|
398
|
+
end
|
399
|
+
|
89
400
|
def level=(level)
|
90
401
|
@level = level
|
91
402
|
$log.level = level
|
@@ -103,20 +414,34 @@ module Fluent
|
|
103
414
|
setup_path: nil,
|
104
415
|
chuser: nil,
|
105
416
|
chgroup: nil,
|
417
|
+
root_dir: nil,
|
106
418
|
suppress_interval: 0,
|
107
419
|
suppress_repeated_stacktrace: true,
|
108
|
-
without_source:
|
420
|
+
without_source: nil,
|
109
421
|
use_v1_config: true,
|
110
422
|
supervise: true,
|
423
|
+
standalone_worker: false,
|
424
|
+
signame: nil,
|
425
|
+
conf_encoding: 'utf-8'
|
111
426
|
}
|
112
427
|
end
|
113
428
|
|
429
|
+
def self.cleanup_resources
|
430
|
+
unless Fluent.windows?
|
431
|
+
if ENV.has_key?('SERVERENGINE_SOCKETMANAGER_PATH')
|
432
|
+
FileUtils.rm_f(ENV['SERVERENGINE_SOCKETMANAGER_PATH'])
|
433
|
+
end
|
434
|
+
end
|
435
|
+
end
|
436
|
+
|
114
437
|
def initialize(opt)
|
115
438
|
@daemonize = opt[:daemonize]
|
116
439
|
@supervise = opt[:supervise]
|
440
|
+
@standalone_worker= opt[:standalone_worker]
|
117
441
|
@config_path = opt[:config_path]
|
118
442
|
@inline_config = opt[:inline_config]
|
119
443
|
@use_v1_config = opt[:use_v1_config]
|
444
|
+
@conf_encoding = opt[:conf_encoding]
|
120
445
|
@log_path = opt[:log_path]
|
121
446
|
@dry_run = opt[:dry_run]
|
122
447
|
@show_plugin_config = opt[:show_plugin_config]
|
@@ -127,57 +452,56 @@ module Fluent
|
|
127
452
|
@rpc_server = nil
|
128
453
|
@process_name = nil
|
129
454
|
|
455
|
+
@workers = opt[:workers]
|
456
|
+
@root_dir = opt[:root_dir]
|
130
457
|
@log_level = opt[:log_level]
|
458
|
+
@log_rotate_age = opt[:log_rotate_age]
|
459
|
+
@log_rotate_size = opt[:log_rotate_size]
|
131
460
|
@suppress_interval = opt[:suppress_interval]
|
132
461
|
@suppress_config_dump = opt[:suppress_config_dump]
|
462
|
+
@log_event_verbose = opt[:log_event_verbose]
|
133
463
|
@without_source = opt[:without_source]
|
134
|
-
|
135
|
-
|
136
|
-
@
|
464
|
+
@signame = opt[:signame]
|
465
|
+
|
466
|
+
@suppress_repeated_stacktrace = opt[:suppress_repeated_stacktrace]
|
467
|
+
log_opts = {suppress_repeated_stacktrace: @suppress_repeated_stacktrace}
|
468
|
+
@log = LoggerInitializer.new(
|
469
|
+
@log_path, @log_level, @chuser, @chgroup, log_opts,
|
470
|
+
log_rotate_age: @log_rotate_age,
|
471
|
+
log_rotate_size: @log_rotate_size
|
472
|
+
)
|
137
473
|
@finished = false
|
138
|
-
@main_pid = nil
|
139
474
|
end
|
140
475
|
|
141
|
-
def
|
142
|
-
@log.init
|
476
|
+
def run_supervisor
|
477
|
+
@log.init(:supervisor, 0)
|
143
478
|
show_plugin_config if @show_plugin_config
|
144
479
|
read_config
|
145
480
|
set_system_config
|
481
|
+
@log.apply_options(format: @system_config.log.format, time_format: @system_config.log.time_format)
|
482
|
+
|
483
|
+
$log.info :supervisor, "parsing config file is succeeded", path: @config_path
|
146
484
|
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
finish_daemonize if @daemonize
|
162
|
-
run_engine
|
163
|
-
exit 0
|
485
|
+
if @workers < 1
|
486
|
+
raise Fluent::ConfigError, "invalid number of workers (must be > 0):#{@workers}"
|
487
|
+
end
|
488
|
+
|
489
|
+
if @root_dir
|
490
|
+
if File.exist?(@root_dir)
|
491
|
+
unless Dir.exist?(@root_dir)
|
492
|
+
raise Fluent::InvalidRootDirectory, "non directory entry exists:#{@root_dir}"
|
493
|
+
end
|
494
|
+
else
|
495
|
+
begin
|
496
|
+
FileUtils.mkdir_p(@root_dir)
|
497
|
+
rescue => e
|
498
|
+
raise Fluent::InvalidRootDirectory, "failed to create root directory:#{@root_dir}, #{e.inspect}"
|
164
499
|
end
|
165
|
-
$log.error "fluentd main process died unexpectedly. restarting." unless @finished
|
166
|
-
end
|
167
|
-
else
|
168
|
-
$log.info "starting fluentd-#{Fluent::VERSION} without supervision"
|
169
|
-
run_rpc_server if @rpc_endpoint
|
170
|
-
main_process do
|
171
|
-
change_privilege
|
172
|
-
init_engine
|
173
|
-
install_main_process_signal_handlers
|
174
|
-
run_configure
|
175
|
-
finish_daemonize if @daemonize
|
176
|
-
run_engine
|
177
|
-
exit 0
|
178
500
|
end
|
179
501
|
end
|
180
|
-
|
502
|
+
|
503
|
+
dry_run_cmd if @dry_run
|
504
|
+
supervise
|
181
505
|
end
|
182
506
|
|
183
507
|
def options
|
@@ -185,293 +509,264 @@ module Fluent
|
|
185
509
|
'config_path' => @config_path,
|
186
510
|
'pid_file' => @daemonize,
|
187
511
|
'plugin_dirs' => @plugin_dirs,
|
188
|
-
'log_path' => @log_path
|
512
|
+
'log_path' => @log_path,
|
513
|
+
'root_dir' => @root_dir,
|
189
514
|
}
|
190
515
|
end
|
191
516
|
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
change_privilege
|
198
|
-
init_engine
|
199
|
-
install_main_process_signal_handlers
|
200
|
-
run_configure
|
201
|
-
exit 0
|
202
|
-
rescue => e
|
203
|
-
$log.error "dry run failed: #{e}"
|
204
|
-
exit 1
|
205
|
-
end
|
206
|
-
|
207
|
-
def show_plugin_config
|
208
|
-
$log.info "Show config for #{@show_plugin_config}"
|
209
|
-
name, type = @show_plugin_config.split(":")
|
210
|
-
plugin = Plugin.__send__("new_#{name}", type)
|
211
|
-
dumped_config = "\n"
|
212
|
-
level = 0
|
213
|
-
plugin.class.ancestors.reverse_each do |plugin_class|
|
214
|
-
if plugin_class.respond_to?(:dump)
|
215
|
-
$log.on_debug do
|
216
|
-
dumped_config << plugin_class.name
|
217
|
-
dumped_config << "\n"
|
218
|
-
level = 1
|
219
|
-
end
|
220
|
-
dumped_config << plugin_class.dump(level)
|
221
|
-
end
|
222
|
-
end
|
223
|
-
$log.info dumped_config
|
224
|
-
exit 0
|
225
|
-
rescue => e
|
226
|
-
$log.error "show config failed: #{e}"
|
227
|
-
exit 1
|
228
|
-
end
|
229
|
-
|
230
|
-
def start_daemonize
|
231
|
-
@wait_daemonize_pipe_r, @wait_daemonize_pipe_w = IO.pipe
|
232
|
-
|
233
|
-
if fork
|
234
|
-
# console process
|
235
|
-
@wait_daemonize_pipe_w.close
|
236
|
-
@wait_daemonize_pipe_w = nil
|
237
|
-
wait_daemonize
|
238
|
-
exit 0
|
517
|
+
def run_worker
|
518
|
+
begin
|
519
|
+
require 'sigdump/setup'
|
520
|
+
rescue Exception
|
521
|
+
# ignore LoadError and others (related with signals): it may raise these errors in Windows
|
239
522
|
end
|
523
|
+
worker_id = ENV['SERVERENGINE_WORKER_ID'].to_i
|
524
|
+
process_type = case
|
525
|
+
when @standalone_worker then :standalone
|
526
|
+
when worker_id == 0 then :worker0
|
527
|
+
else :workers
|
528
|
+
end
|
529
|
+
@log.init(process_type, worker_id)
|
530
|
+
show_plugin_config if @show_plugin_config
|
531
|
+
read_config
|
532
|
+
set_system_config
|
533
|
+
@log.apply_options(format: @system_config.log.format, time_format: @system_config.log.time_format)
|
240
534
|
|
241
|
-
|
242
|
-
@wait_daemonize_pipe_r.close
|
243
|
-
@wait_daemonize_pipe_r = nil
|
244
|
-
|
245
|
-
# in case the child process forked during run_configure
|
246
|
-
@wait_daemonize_pipe_w.fcntl(Fcntl::F_SETFD, Fcntl::FD_CLOEXEC)
|
247
|
-
|
248
|
-
Process.setsid
|
249
|
-
exit!(0) if fork
|
250
|
-
File.umask(0)
|
251
|
-
|
252
|
-
# supervisor process
|
253
|
-
@supervisor_pid = Process.pid
|
254
|
-
end
|
535
|
+
Process.setproctitle("worker:#{@process_name}") if @process_name
|
255
536
|
|
256
|
-
|
257
|
-
|
258
|
-
if supervisor_pid.empty?
|
259
|
-
# initialization failed
|
260
|
-
exit! 1
|
537
|
+
if @standalone_worker && @workers != 1
|
538
|
+
raise Fluent::ConfigError, "invalid number of workers (must be 1 or unspecified) with --no-supervisor: #{@workers}"
|
261
539
|
end
|
262
540
|
|
263
|
-
|
264
|
-
@wait_daemonize_pipe_r = nil
|
541
|
+
install_main_process_signal_handlers
|
265
542
|
|
266
|
-
#
|
267
|
-
|
268
|
-
f.write supervisor_pid
|
269
|
-
}
|
270
|
-
end
|
543
|
+
# This is the only log messsage for @standalone_worker
|
544
|
+
$log.info "starting fluentd-#{Fluent::VERSION} without supervision", pid: Process.pid, ruby: RUBY_VERSION if @standalone_worker
|
271
545
|
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
@
|
279
|
-
|
546
|
+
main_process do
|
547
|
+
create_socket_manager if @standalone_worker
|
548
|
+
change_privilege if @standalone_worker
|
549
|
+
init_engine
|
550
|
+
run_configure
|
551
|
+
run_engine
|
552
|
+
self.class.cleanup_resources if @standalone_worker
|
553
|
+
exit 0
|
280
554
|
end
|
281
555
|
end
|
282
556
|
|
283
|
-
|
284
|
-
@rpc_server = RPC::Server.new(@rpc_endpoint, $log)
|
557
|
+
private
|
285
558
|
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
nil
|
291
|
-
}
|
292
|
-
@rpc_server.mount_proc('/api/processes.killWorkers') { |req, res|
|
293
|
-
$log.debug "fluentd RPC got /api/processes.killWorkers request"
|
294
|
-
supervisor_sigterm_handler
|
295
|
-
nil
|
296
|
-
}
|
297
|
-
@rpc_server.mount_proc('/api/plugins.flushBuffers') { |req, res|
|
298
|
-
$log.debug "fluentd RPC got /api/plugins.flushBuffers request"
|
299
|
-
supervisor_sigusr1_handler
|
300
|
-
nil
|
301
|
-
}
|
302
|
-
@rpc_server.mount_proc('/api/config.reload') { |req, res|
|
303
|
-
$log.debug "fluentd RPC got /api/config.reload request"
|
304
|
-
$log.info "restarting"
|
305
|
-
supervisor_sighup_handler
|
306
|
-
nil
|
307
|
-
}
|
308
|
-
@rpc_server.mount_proc('/api/config.dump') { |req, res|
|
309
|
-
$log.debug "fluentd RPC got /api/config.dump request"
|
310
|
-
$log.info "dump in-memory config"
|
311
|
-
supervisor_dump_config_handler
|
312
|
-
nil
|
313
|
-
}
|
559
|
+
def create_socket_manager
|
560
|
+
socket_manager_path = ServerEngine::SocketManager::Server.generate_path
|
561
|
+
ServerEngine::SocketManager::Server.open(socket_manager_path)
|
562
|
+
ENV['SERVERENGINE_SOCKETMANAGER_PATH'] = socket_manager_path.to_s
|
314
563
|
end
|
315
564
|
|
316
|
-
def
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
322
|
-
}
|
565
|
+
def dry_run_cmd
|
566
|
+
$log.info "starting fluentd-#{Fluent::VERSION} as dry run mode", ruby: RUBY_VERSION
|
567
|
+
@system_config.suppress_config_dump = true
|
568
|
+
dry_run
|
569
|
+
exit 0
|
570
|
+
rescue => e
|
571
|
+
$log.error "dry run failed: #{e}"
|
572
|
+
exit 1
|
323
573
|
end
|
324
574
|
|
325
|
-
|
326
|
-
|
575
|
+
## Set Engine's dry_run_mode true to override all target_id of worker sections
|
576
|
+
def dry_run
|
577
|
+
begin
|
578
|
+
Fluent::Engine.dry_run_mode = true
|
579
|
+
change_privilege
|
580
|
+
init_engine
|
581
|
+
run_configure
|
582
|
+
rescue Fluent::ConfigError => e
|
583
|
+
$log.error "config error", file: @config_path, error: e
|
584
|
+
$log.debug_backtrace
|
585
|
+
exit!(1)
|
586
|
+
ensure
|
587
|
+
Fluent::Engine.dry_run_mode = false
|
588
|
+
end
|
327
589
|
end
|
328
590
|
|
329
|
-
def
|
330
|
-
@
|
591
|
+
def show_plugin_config
|
592
|
+
name, type = @show_plugin_config.split(":") # input:tail
|
593
|
+
$log.info "show_plugin_config option is deprecated. Use fluent-plugin-config-format --format=txt #{name} #{type}"
|
594
|
+
exit 0
|
331
595
|
end
|
332
596
|
|
333
|
-
def supervise
|
334
|
-
|
597
|
+
def supervise
|
598
|
+
# Make dumpable conf, which is set corresponding_proxies for all elements in all worker sections
|
599
|
+
dry_run
|
335
600
|
|
336
601
|
Process.setproctitle("supervisor:#{@process_name}") if @process_name
|
337
|
-
$log.info "starting fluentd-#{Fluent::VERSION}"
|
338
|
-
|
339
|
-
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
|
348
|
-
|
349
|
-
|
350
|
-
|
351
|
-
|
352
|
-
|
353
|
-
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
|
358
|
-
|
359
|
-
|
602
|
+
$log.info "starting fluentd-#{Fluent::VERSION}", pid: Process.pid, ruby: RUBY_VERSION
|
603
|
+
|
604
|
+
rubyopt = ENV["RUBYOPT"]
|
605
|
+
fluentd_spawn_cmd = [ServerEngine.ruby_bin_path, "-Eascii-8bit:ascii-8bit"]
|
606
|
+
fluentd_spawn_cmd << rubyopt if rubyopt
|
607
|
+
fluentd_spawn_cmd << $0
|
608
|
+
fluentd_spawn_cmd += $fluentdargv
|
609
|
+
fluentd_spawn_cmd << "--under-supervisor"
|
610
|
+
|
611
|
+
$log.info "spawn command to main: ", cmdline: fluentd_spawn_cmd
|
612
|
+
|
613
|
+
params = {}
|
614
|
+
params['main_cmd'] = fluentd_spawn_cmd
|
615
|
+
params['daemonize'] = @daemonize
|
616
|
+
params['inline_config'] = @inline_config
|
617
|
+
params['log_path'] = @log_path
|
618
|
+
params['log_rotate_age'] = @log_rotate_age
|
619
|
+
params['log_rotate_size'] = @log_rotate_size
|
620
|
+
params['chuser'] = @chuser
|
621
|
+
params['chgroup'] = @chgroup
|
622
|
+
params['use_v1_config'] = @use_v1_config
|
623
|
+
params['conf_encoding'] = @conf_encoding
|
624
|
+
|
625
|
+
# system config parameters
|
626
|
+
params['workers'] = @workers
|
627
|
+
params['root_dir'] = @root_dir
|
628
|
+
params['log_level'] = @log_level
|
629
|
+
params['suppress_repeated_stacktrace'] = @suppress_repeated_stacktrace
|
630
|
+
params['signame'] = @signame
|
631
|
+
|
632
|
+
se = ServerEngine.create(ServerModule, WorkerModule){
|
633
|
+
Fluent::Supervisor.load_config(@config_path, params)
|
634
|
+
}
|
635
|
+
se.run
|
360
636
|
end
|
361
637
|
|
362
|
-
def
|
363
|
-
|
364
|
-
|
365
|
-
|
366
|
-
block.call
|
638
|
+
def install_main_process_signal_handlers
|
639
|
+
# Fluentd worker process (worker of ServerEngine) don't use code in serverengine to set signal handlers,
|
640
|
+
# because it does almost nothing.
|
641
|
+
# This method is the only method to set signal handlers in Fluentd worker process.
|
367
642
|
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
|
372
|
-
|
373
|
-
console.error "config error", file: @config_path, error: $!.to_s
|
374
|
-
console.debug_backtrace
|
375
|
-
end
|
643
|
+
# When user use Ctrl + C not SIGINT, SIGINT is sent to all process in same process group.
|
644
|
+
# ServerEngine server process will send SIGTERM to child(spawned) processes by that SIGINT, so
|
645
|
+
# worker process SHOULD NOT do anything with SIGINT, SHOULD just ignore.
|
646
|
+
trap :INT do
|
647
|
+
$log.debug "fluentd main process get SIGINT"
|
376
648
|
|
377
|
-
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
|
382
|
-
console.error "unexpected error", error: $!.to_s
|
383
|
-
console.error_backtrace
|
649
|
+
# When Fluentd is launched without supervisor, worker should handle ctrl-c by itself
|
650
|
+
if @standalone_worker
|
651
|
+
@finished = true
|
652
|
+
$log.debug "getting start to shutdown main process"
|
653
|
+
Fluent::Engine.stop
|
384
654
|
end
|
385
655
|
end
|
386
656
|
|
387
|
-
exit! 1
|
388
|
-
end
|
389
|
-
|
390
|
-
def install_supervisor_signal_handlers
|
391
|
-
trap :INT do
|
392
|
-
$log.debug "fluentd supervisor process get SIGINT"
|
393
|
-
supervisor_sigint_handler
|
394
|
-
end
|
395
|
-
|
396
657
|
trap :TERM do
|
397
|
-
$log.debug "fluentd
|
398
|
-
|
399
|
-
|
400
|
-
|
401
|
-
|
402
|
-
$log.debug "fluentd supervisor process get SIGHUP"
|
403
|
-
$log.info "restarting"
|
404
|
-
supervisor_sighup_handler
|
405
|
-
end
|
406
|
-
|
407
|
-
trap :USR1 do
|
408
|
-
$log.debug "fluentd supervisor process get SIGUSR1"
|
409
|
-
supervisor_sigusr1_handler
|
410
|
-
end
|
411
|
-
end
|
412
|
-
|
413
|
-
def supervisor_sigint_handler
|
414
|
-
@finished = true
|
415
|
-
if pid = @main_pid
|
416
|
-
# kill processes only still exists
|
417
|
-
unless Process.waitpid(pid, Process::WNOHANG)
|
418
|
-
begin
|
419
|
-
Process.kill(:INT, pid)
|
420
|
-
rescue Errno::ESRCH
|
421
|
-
# ignore processes already died
|
422
|
-
end
|
658
|
+
$log.debug "fluentd main process get SIGTERM"
|
659
|
+
unless @finished
|
660
|
+
@finished = true
|
661
|
+
$log.debug "getting start to shutdown main process"
|
662
|
+
Fluent::Engine.stop
|
423
663
|
end
|
424
664
|
end
|
425
|
-
end
|
426
665
|
|
427
|
-
|
428
|
-
|
429
|
-
|
430
|
-
|
431
|
-
|
432
|
-
|
433
|
-
|
434
|
-
|
435
|
-
|
666
|
+
trap :USR1 do
|
667
|
+
flush_buffer
|
668
|
+
end unless Fluent.windows?
|
669
|
+
|
670
|
+
if Fluent.windows?
|
671
|
+
command_pipe = STDIN.dup
|
672
|
+
STDIN.reopen(File::NULL, "rb")
|
673
|
+
command_pipe.binmode
|
674
|
+
command_pipe.sync = true
|
675
|
+
|
676
|
+
Thread.new do
|
677
|
+
loop do
|
678
|
+
cmd = command_pipe.gets.chomp
|
679
|
+
case cmd
|
680
|
+
when "GRACEFUL_STOP", "IMMEDIATE_STOP"
|
681
|
+
$log.debug "fluentd main process get #{cmd} command"
|
682
|
+
@finished = true
|
683
|
+
$log.debug "getting start to shutdown main process"
|
684
|
+
Fluent::Engine.stop
|
685
|
+
break
|
686
|
+
else
|
687
|
+
$log.warn "fluentd main process get unknown command [#{cmd}]"
|
688
|
+
end
|
436
689
|
end
|
437
690
|
end
|
438
691
|
end
|
439
692
|
end
|
440
693
|
|
441
|
-
def
|
694
|
+
def flush_buffer
|
442
695
|
# Creating new thread due to mutex can't lock
|
443
696
|
# in main thread during trap context
|
444
697
|
Thread.new {
|
445
|
-
|
446
|
-
|
447
|
-
|
448
|
-
|
449
|
-
|
698
|
+
begin
|
699
|
+
$log.debug "fluentd main process get SIGUSR1"
|
700
|
+
$log.info "force flushing buffered events"
|
701
|
+
@log.reopen!
|
702
|
+
Fluent::Engine.flush!
|
703
|
+
$log.debug "flushing thread: flushed"
|
704
|
+
rescue Exception => e
|
705
|
+
$log.warn "flushing thread error: #{e}"
|
450
706
|
end
|
451
707
|
}.run
|
452
708
|
end
|
453
709
|
|
454
|
-
def
|
455
|
-
|
456
|
-
|
457
|
-
|
458
|
-
|
710
|
+
def logging_with_console_output
|
711
|
+
yield $log
|
712
|
+
unless @log.stdout?
|
713
|
+
logger = ServerEngine::DaemonLogger.new(STDOUT)
|
714
|
+
log = Fluent::Log.new(logger)
|
715
|
+
log.level = @log_level
|
716
|
+
console = log.enable_debug
|
717
|
+
yield console
|
459
718
|
end
|
460
719
|
end
|
461
720
|
|
462
|
-
def
|
463
|
-
|
464
|
-
|
721
|
+
def main_process(&block)
|
722
|
+
if @process_name
|
723
|
+
if @workers > 1
|
724
|
+
Process.setproctitle("worker:#{@process_name}#{ENV['SERVERENGINE_WORKER_ID']}")
|
725
|
+
else
|
726
|
+
Process.setproctitle("worker:#{@process_name}")
|
727
|
+
end
|
728
|
+
end
|
465
729
|
|
466
|
-
|
467
|
-
|
730
|
+
unrecoverable_error = false
|
731
|
+
|
732
|
+
begin
|
733
|
+
block.call
|
734
|
+
rescue Fluent::ConfigError => e
|
735
|
+
logging_with_console_output do |log|
|
736
|
+
log.error "config error", file: @config_path, error: e
|
737
|
+
log.debug_backtrace
|
738
|
+
end
|
739
|
+
unrecoverable_error = true
|
740
|
+
rescue Fluent::UnrecoverableError => e
|
741
|
+
logging_with_console_output do |log|
|
742
|
+
log.error e.message, error: e
|
743
|
+
log.error_backtrace
|
744
|
+
end
|
745
|
+
unrecoverable_error = true
|
746
|
+
rescue ScriptError => e # LoadError, NotImplementedError, SyntaxError
|
747
|
+
logging_with_console_output do |log|
|
748
|
+
if e.respond_to?(:path)
|
749
|
+
log.error e.message, path: e.path, error: e
|
750
|
+
else
|
751
|
+
log.error e.message, error: e
|
752
|
+
end
|
753
|
+
log.error_backtrace
|
754
|
+
end
|
755
|
+
unrecoverable_error = true
|
756
|
+
rescue => e
|
757
|
+
logging_with_console_output do |log|
|
758
|
+
log.error "unexpected error", error: e
|
759
|
+
log.error_backtrace
|
760
|
+
end
|
761
|
+
end
|
762
|
+
|
763
|
+
exit!(unrecoverable_error ? 2 : 1)
|
468
764
|
end
|
469
765
|
|
470
766
|
def read_config
|
471
|
-
$log.info "reading config file", path: @config_path
|
472
767
|
@config_fname = File.basename(@config_path)
|
473
768
|
@config_basedir = File.dirname(@config_path)
|
474
|
-
@config_data = File.
|
769
|
+
@config_data = File.open(@config_path, "r:#{@conf_encoding}:utf-8") {|f| f.read }
|
475
770
|
if @inline_config == '-'
|
476
771
|
@config_data << "\n" << STDIN.read
|
477
772
|
elsif @inline_config
|
@@ -482,28 +777,12 @@ module Fluent
|
|
482
777
|
|
483
778
|
def set_system_config
|
484
779
|
@system_config = SystemConfig.create(@conf) # @conf is set in read_config
|
780
|
+
@system_config.attach(self)
|
485
781
|
@system_config.apply(self)
|
486
782
|
end
|
487
783
|
|
488
|
-
def run_configure
|
489
|
-
Fluent::Engine.run_configure(@conf)
|
490
|
-
end
|
491
|
-
|
492
784
|
def change_privilege
|
493
|
-
|
494
|
-
etc_group = Supervisor.get_etc_group(@chgroup)
|
495
|
-
Process::GID.change_privilege(etc_group.gid)
|
496
|
-
end
|
497
|
-
|
498
|
-
if @chuser
|
499
|
-
etc_pw = Supervisor.get_etc_passwd(@chuser)
|
500
|
-
user_groups = [etc_pw.gid]
|
501
|
-
Etc.setgrent
|
502
|
-
Etc.group { |gr| user_groups << gr.gid if gr.mem.include?(etc_pw.name) } # emulate 'id -G'
|
503
|
-
|
504
|
-
Process.groups = Process.groups | user_groups
|
505
|
-
Process::UID.change_privilege(etc_pw.uid)
|
506
|
-
end
|
785
|
+
ServerEngine::Privilege.change(@chuser, @chgroup)
|
507
786
|
end
|
508
787
|
|
509
788
|
def init_engine
|
@@ -516,54 +795,13 @@ module Fluent
|
|
516
795
|
@plugin_dirs.each {|dir|
|
517
796
|
if Dir.exist?(dir)
|
518
797
|
dir = File.expand_path(dir)
|
519
|
-
Fluent::Engine.
|
798
|
+
Fluent::Engine.add_plugin_dir(dir)
|
520
799
|
end
|
521
800
|
}
|
522
801
|
end
|
523
802
|
|
524
|
-
def
|
525
|
-
|
526
|
-
# But enough safe to limit twice call of Fluent::Engine.stop.
|
527
|
-
|
528
|
-
trap :INT do
|
529
|
-
$log.debug "fluentd main process get SIGINT"
|
530
|
-
unless @finished
|
531
|
-
@finished = true
|
532
|
-
$log.debug "getting start to shutdown main process"
|
533
|
-
Fluent::Engine.stop
|
534
|
-
end
|
535
|
-
end
|
536
|
-
|
537
|
-
trap :TERM do
|
538
|
-
$log.debug "fluentd main process get SIGTERM"
|
539
|
-
unless @finished
|
540
|
-
@finished = true
|
541
|
-
$log.debug "getting start to shutdown main process"
|
542
|
-
Fluent::Engine.stop
|
543
|
-
end
|
544
|
-
end
|
545
|
-
|
546
|
-
trap :HUP do
|
547
|
-
# TODO
|
548
|
-
$log.debug "fluentd main process get SIGHUP"
|
549
|
-
end
|
550
|
-
|
551
|
-
trap :USR1 do
|
552
|
-
$log.debug "fluentd main process get SIGUSR1"
|
553
|
-
$log.info "force flushing buffered events"
|
554
|
-
@log.reopen!
|
555
|
-
|
556
|
-
# Creating new thread due to mutex can't lock
|
557
|
-
# in main thread during trap context
|
558
|
-
Thread.new {
|
559
|
-
begin
|
560
|
-
Fluent::Engine.flush!
|
561
|
-
$log.debug "flushing thread: flushed"
|
562
|
-
rescue Exception => e
|
563
|
-
$log.warn "flushing thread error: #{e}"
|
564
|
-
end
|
565
|
-
}.run
|
566
|
-
end
|
803
|
+
def run_configure
|
804
|
+
Fluent::Engine.run_configure(@conf)
|
567
805
|
end
|
568
806
|
|
569
807
|
def run_engine
|