fluentd 1.13.3 → 1.16.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.github/ISSUE_TEMPLATE/{bug_report.yaml → bug_report.yml} +2 -0
- data/.github/ISSUE_TEMPLATE/config.yml +2 -2
- data/.github/ISSUE_TEMPLATE/{feature_request.yaml → feature_request.yml} +1 -0
- data/.github/workflows/stale-actions.yml +11 -9
- data/.github/workflows/test.yml +32 -0
- data/CHANGELOG.md +490 -10
- data/CONTRIBUTING.md +2 -2
- data/MAINTAINERS.md +7 -5
- data/README.md +3 -23
- data/Rakefile +1 -1
- data/SECURITY.md +14 -0
- data/fluentd.gemspec +7 -8
- data/lib/fluent/command/cat.rb +13 -3
- data/lib/fluent/command/ctl.rb +6 -3
- data/lib/fluent/command/fluentd.rb +73 -65
- data/lib/fluent/command/plugin_config_formatter.rb +1 -1
- data/lib/fluent/compat/output.rb +9 -6
- data/lib/fluent/config/dsl.rb +1 -1
- data/lib/fluent/config/error.rb +12 -0
- data/lib/fluent/config/literal_parser.rb +2 -2
- data/lib/fluent/config/parser.rb +1 -1
- data/lib/fluent/config/v1_parser.rb +3 -3
- data/lib/fluent/config/yaml_parser/fluent_value.rb +47 -0
- data/lib/fluent/config/yaml_parser/loader.rb +108 -0
- data/lib/fluent/config/yaml_parser/parser.rb +166 -0
- data/lib/fluent/config/yaml_parser/section_builder.rb +107 -0
- data/lib/fluent/config/yaml_parser.rb +56 -0
- data/lib/fluent/config.rb +14 -1
- data/lib/fluent/counter/server.rb +1 -1
- data/lib/fluent/counter/validator.rb +3 -3
- data/lib/fluent/daemon.rb +2 -4
- data/lib/fluent/engine.rb +1 -1
- data/lib/fluent/env.rb +4 -0
- data/lib/fluent/error.rb +3 -0
- data/lib/fluent/event.rb +8 -4
- data/lib/fluent/event_router.rb +47 -2
- data/lib/fluent/file_wrapper.rb +137 -0
- data/lib/fluent/log/console_adapter.rb +66 -0
- data/lib/fluent/log.rb +44 -5
- data/lib/fluent/match.rb +1 -1
- data/lib/fluent/msgpack_factory.rb +6 -1
- data/lib/fluent/oj_options.rb +1 -2
- data/lib/fluent/plugin/bare_output.rb +49 -8
- data/lib/fluent/plugin/base.rb +26 -9
- data/lib/fluent/plugin/buf_file.rb +34 -5
- data/lib/fluent/plugin/buf_file_single.rb +32 -3
- data/lib/fluent/plugin/buffer/file_chunk.rb +1 -1
- data/lib/fluent/plugin/buffer.rb +216 -70
- data/lib/fluent/plugin/filter.rb +35 -1
- data/lib/fluent/plugin/filter_record_transformer.rb +1 -1
- data/lib/fluent/plugin/in_forward.rb +2 -2
- data/lib/fluent/plugin/in_http.rb +39 -10
- data/lib/fluent/plugin/in_monitor_agent.rb +4 -2
- data/lib/fluent/plugin/in_sample.rb +1 -1
- data/lib/fluent/plugin/in_syslog.rb +13 -1
- data/lib/fluent/plugin/in_tail/group_watch.rb +204 -0
- data/lib/fluent/plugin/in_tail/position_file.rb +33 -33
- data/lib/fluent/plugin/in_tail.rb +216 -84
- data/lib/fluent/plugin/in_tcp.rb +47 -2
- data/lib/fluent/plugin/input.rb +39 -1
- data/lib/fluent/plugin/metrics.rb +119 -0
- data/lib/fluent/plugin/metrics_local.rb +96 -0
- data/lib/fluent/plugin/multi_output.rb +43 -6
- data/lib/fluent/plugin/out_copy.rb +1 -1
- data/lib/fluent/plugin/out_exec_filter.rb +2 -2
- data/lib/fluent/plugin/out_file.rb +20 -2
- data/lib/fluent/plugin/out_forward/ack_handler.rb +19 -4
- data/lib/fluent/plugin/out_forward/socket_cache.rb +2 -0
- data/lib/fluent/plugin/out_forward.rb +17 -9
- data/lib/fluent/plugin/out_secondary_file.rb +39 -22
- data/lib/fluent/plugin/output.rb +167 -78
- data/lib/fluent/plugin/parser.rb +3 -4
- data/lib/fluent/plugin/parser_apache2.rb +1 -1
- data/lib/fluent/plugin/parser_json.rb +1 -1
- data/lib/fluent/plugin/parser_syslog.rb +1 -1
- data/lib/fluent/plugin/storage_local.rb +3 -5
- data/lib/fluent/plugin.rb +10 -1
- data/lib/fluent/plugin_helper/child_process.rb +3 -0
- data/lib/fluent/plugin_helper/event_emitter.rb +8 -1
- data/lib/fluent/plugin_helper/event_loop.rb +2 -2
- data/lib/fluent/plugin_helper/http_server/server.rb +2 -1
- data/lib/fluent/plugin_helper/metrics.rb +129 -0
- data/lib/fluent/plugin_helper/record_accessor.rb +1 -1
- data/lib/fluent/plugin_helper/retry_state.rb +14 -4
- data/lib/fluent/plugin_helper/server.rb +35 -6
- data/lib/fluent/plugin_helper/service_discovery.rb +2 -2
- data/lib/fluent/plugin_helper/socket.rb +13 -2
- data/lib/fluent/plugin_helper/thread.rb +3 -3
- data/lib/fluent/plugin_helper.rb +1 -0
- data/lib/fluent/plugin_id.rb +3 -2
- data/lib/fluent/registry.rb +2 -1
- data/lib/fluent/root_agent.rb +6 -0
- data/lib/fluent/rpc.rb +4 -3
- data/lib/fluent/supervisor.rb +283 -259
- data/lib/fluent/system_config.rb +13 -3
- data/lib/fluent/test/driver/base.rb +11 -5
- data/lib/fluent/test/driver/filter.rb +4 -0
- data/lib/fluent/test/startup_shutdown.rb +6 -8
- data/lib/fluent/time.rb +21 -20
- data/lib/fluent/version.rb +1 -1
- data/lib/fluent/win32api.rb +38 -0
- data/lib/fluent/winsvc.rb +5 -8
- data/templates/new_gem/test/helper.rb.erb +0 -1
- data/test/command/test_cat.rb +31 -2
- data/test/command/test_ctl.rb +1 -2
- data/test/command/test_fluentd.rb +209 -24
- data/test/command/test_plugin_config_formatter.rb +0 -1
- data/test/compat/test_parser.rb +6 -6
- data/test/config/test_system_config.rb +13 -11
- data/test/config/test_types.rb +1 -1
- data/test/log/test_console_adapter.rb +110 -0
- data/test/plugin/in_tail/test_io_handler.rb +26 -8
- data/test/plugin/in_tail/test_position_file.rb +48 -59
- data/test/plugin/out_forward/test_ack_handler.rb +39 -0
- data/test/plugin/out_forward/test_socket_cache.rb +26 -1
- data/test/plugin/test_bare_output.rb +14 -1
- data/test/plugin/test_base.rb +133 -1
- data/test/plugin/test_buf_file.rb +62 -23
- data/test/plugin/test_buf_file_single.rb +65 -0
- data/test/plugin/test_buffer.rb +267 -3
- data/test/plugin/test_buffer_chunk.rb +11 -0
- data/test/plugin/test_filter.rb +12 -1
- data/test/plugin/test_filter_parser.rb +1 -1
- data/test/plugin/test_filter_stdout.rb +2 -2
- data/test/plugin/test_in_forward.rb +9 -11
- data/test/plugin/test_in_http.rb +65 -3
- data/test/plugin/test_in_monitor_agent.rb +216 -11
- data/test/plugin/test_in_object_space.rb +9 -3
- data/test/plugin/test_in_syslog.rb +35 -0
- data/test/plugin/test_in_tail.rb +1393 -385
- data/test/plugin/test_in_tcp.rb +87 -2
- data/test/plugin/test_in_udp.rb +28 -0
- data/test/plugin/test_in_unix.rb +2 -2
- data/test/plugin/test_input.rb +12 -1
- data/test/plugin/test_metrics.rb +294 -0
- data/test/plugin/test_metrics_local.rb +96 -0
- data/test/plugin/test_multi_output.rb +25 -1
- data/test/plugin/test_out_exec.rb +6 -4
- data/test/plugin/test_out_exec_filter.rb +6 -2
- data/test/plugin/test_out_file.rb +34 -17
- data/test/plugin/test_out_forward.rb +78 -77
- data/test/plugin/test_out_http.rb +1 -0
- data/test/plugin/test_out_stdout.rb +2 -2
- data/test/plugin/test_output.rb +297 -12
- data/test/plugin/test_output_as_buffered.rb +44 -44
- data/test/plugin/test_output_as_buffered_compress.rb +32 -18
- data/test/plugin/test_output_as_buffered_retries.rb +54 -7
- data/test/plugin/test_output_as_buffered_secondary.rb +4 -4
- data/test/plugin/test_parser_regexp.rb +1 -6
- data/test/plugin/test_parser_syslog.rb +1 -1
- data/test/plugin_helper/test_cert_option.rb +1 -1
- data/test/plugin_helper/test_child_process.rb +38 -16
- data/test/plugin_helper/test_event_emitter.rb +29 -0
- data/test/plugin_helper/test_http_server_helper.rb +1 -1
- data/test/plugin_helper/test_metrics.rb +137 -0
- data/test/plugin_helper/test_retry_state.rb +602 -38
- data/test/plugin_helper/test_server.rb +78 -6
- data/test/plugin_helper/test_timer.rb +2 -2
- data/test/test_config.rb +191 -24
- data/test/test_event_router.rb +17 -0
- data/test/test_file_wrapper.rb +53 -0
- data/test/test_formatter.rb +24 -21
- data/test/test_log.rb +122 -40
- data/test/test_msgpack_factory.rb +32 -0
- data/test/test_plugin_classes.rb +102 -0
- data/test/test_root_agent.rb +30 -1
- data/test/test_supervisor.rb +477 -257
- data/test/test_time_parser.rb +22 -0
- metadata +55 -34
- data/.drone.yml +0 -35
- data/.github/workflows/issue-auto-closer.yml +0 -12
- data/.github/workflows/linux-test.yaml +0 -36
- data/.github/workflows/macos-test.yaml +0 -30
- data/.github/workflows/windows-test.yaml +0 -46
- data/.gitlab-ci.yml +0 -103
- data/lib/fluent/plugin/file_wrapper.rb +0 -187
- data/test/plugin/test_file_wrapper.rb +0 -126
- data/test/test_logger_initializer.rb +0 -46
data/MAINTAINERS.md
CHANGED
|
@@ -2,10 +2,12 @@
|
|
|
2
2
|
|
|
3
3
|
- [Naotoshi Seo](https://github.com/sonots), [ZOZO Technologies](https://tech.zozo.com/en/)
|
|
4
4
|
- [Okkez](https://github.com/okkez)
|
|
5
|
-
- [Hiroshi Hatake](https://github.com/cosmo0920), [Calyptia](https://
|
|
6
|
-
- [Masahiro Nakagawa](https://github.com/repeatedly)
|
|
7
|
-
- [Satoshi Tagomori](https://github.com/tagomoris)
|
|
8
|
-
- [
|
|
9
|
-
- [
|
|
5
|
+
- [Hiroshi Hatake](https://github.com/cosmo0920), [Calyptia](https://calyptia.com/)
|
|
6
|
+
- [Masahiro Nakagawa](https://github.com/repeatedly)
|
|
7
|
+
- [Satoshi Tagomori](https://github.com/tagomoris)
|
|
8
|
+
- [Toru Takahashi](https://github.com/toru-takahashi), [Treasure Data](https://www.treasuredata.com/)
|
|
9
|
+
- [Eduardo Silva](https://github.com/edsiper), [Calyptia](https://calyptia/)
|
|
10
|
+
- [Fujimoto Seiji](https://github.com/fujimots)
|
|
10
11
|
- [Takuro Ashie](https://github.com/ashie), [ClearCode](https://www.clear-code.com/)
|
|
11
12
|
- [Kentaro Hayashi](https://github.com/kenhys), [ClearCode](https://www.clear-code.com/)
|
|
13
|
+
- [Daijiro Fukuda](https://github.com/daipom), [ClearCode](https://www.clear-code.com/)
|
data/README.md
CHANGED
|
@@ -1,17 +1,11 @@
|
|
|
1
1
|
Fluentd: Open-Source Log Collector
|
|
2
2
|
===================================
|
|
3
|
-
GitHub Actions:
|
|
4
3
|
|
|
5
4
|
[](https://github.com/fluent/fluentd/actions/workflows/linux-test.yaml)
|
|
6
5
|
[](https://github.com/fluent/fluentd/actions/workflows/windows-test.yaml)
|
|
7
6
|
[](https://github.com/fluent/fluentd/actions/workflows/macos-test.yaml)
|
|
8
7
|
[](https://codeclimate.com/github/fluent/fluentd)
|
|
9
8
|
[](https://bestpractices.coreinfrastructure.org/projects/1189)
|
|
10
|
-
[](https://app.fossa.io/projects/git%2Bhttps%3A%2F%2Fgithub.com%2Ffluent%2Ffluentd?ref=badge_shield)
|
|
11
|
-
|
|
12
|
-
Drone CI for Arm64:
|
|
13
|
-
|
|
14
|
-
[](https://cloud.drone.io/fluent/fluentd)
|
|
15
9
|
|
|
16
10
|
[Fluentd](https://www.fluentd.org/) collects events from various data sources and writes them to files, RDBMS, NoSQL, IaaS, SaaS, Hadoop and so on. Fluentd helps you unify your logging infrastructure (Learn more about the [Unified Logging Layer](https://www.fluentd.org/blog/unified-logging-layer)).
|
|
17
11
|
|
|
@@ -19,16 +13,6 @@ Drone CI for Arm64:
|
|
|
19
13
|
<img src="https://www.fluentd.org/images/fluentd-architecture.png" width="500px"/>
|
|
20
14
|
</p>
|
|
21
15
|
|
|
22
|
-
An event consists of *tag*, *time* and *record*. Tag is a string separated with '.' (e.g. myapp.access). It is used to categorize events. Time is a UNIX time recorded at occurrence of an event. Record is a JSON object.
|
|
23
|
-
|
|
24
|
-
## Example Use Cases
|
|
25
|
-
|
|
26
|
-
Use Case | Description | Diagram
|
|
27
|
-
-------- | ------------|:---------:
|
|
28
|
-
Centralizing Apache/Nginx Server Logs | Fluentd can be used to tail access/error logs and transport them reliably to remote systems. | <img src="https://www.fluentd.org/images/recipes/elasticsearch-s3-fluentd.png" height="150"/>
|
|
29
|
-
Syslog Alerting | Fluentd can "grep" for events and send out alerts. | <img src="https://www.fluentd.org/images/syslog-fluentd-alert.png" height="100"/>
|
|
30
|
-
Mobile/Web Application Logging | Fluentd can function as middleware to enable asynchronous, scalable logging for user action events. | <img src="https://www.fluentd.org/images/datasources/asynchronous_logging.png" height="150"/>
|
|
31
|
-
|
|
32
16
|
## Quick Start
|
|
33
17
|
|
|
34
18
|
$ gem install fluentd
|
|
@@ -66,18 +50,12 @@ You can run specified test via `TEST` environment variable:
|
|
|
66
50
|
$ bundle exec rake test TEST=test/test_specified_path.rb
|
|
67
51
|
$ bundle exec rake test TEST=test/test_*.rb
|
|
68
52
|
|
|
69
|
-
## Fluentd UI: Admin GUI
|
|
70
|
-
|
|
71
|
-
[Fluentd UI](https://github.com/fluent/fluentd-ui) is a graphical user interface to start/stop/configure Fluentd.
|
|
72
|
-
|
|
73
|
-
<p align="center"><img width="500" src="https://www.fluentd.org/images/blog/fluentd-ui.gif"/></p>
|
|
74
|
-
|
|
75
53
|
## More Information
|
|
76
54
|
|
|
77
55
|
- Website: https://www.fluentd.org/
|
|
78
56
|
- Documentation: https://docs.fluentd.org/
|
|
79
57
|
- Project repository: https://github.com/fluent
|
|
80
|
-
- Discussion: https://
|
|
58
|
+
- Discussion: https://github.com/fluent/fluentd/discussions
|
|
81
59
|
- Slack / Community: https://slack.fluentd.org
|
|
82
60
|
- Newsletters: https://www.fluentd.org/newsletter
|
|
83
61
|
- Author: [Sadayuki Furuhashi](https://github.com/frsyuki)
|
|
@@ -88,6 +66,8 @@ You can run specified test via `TEST` environment variable:
|
|
|
88
66
|
|
|
89
67
|
A third party security audit was performed by Cure53, you can see the full report [here](docs/SECURITY_AUDIT.pdf).
|
|
90
68
|
|
|
69
|
+
See [SECURITY](SECURITY.md) to contact us about vulnerability.
|
|
70
|
+
|
|
91
71
|
## Contributors:
|
|
92
72
|
|
|
93
73
|
Patches contributed by [great developers](https://github.com/fluent/fluentd/contributors).
|
data/Rakefile
CHANGED
|
@@ -14,7 +14,7 @@ namespace :build do
|
|
|
14
14
|
desc 'Build gems for all platforms'
|
|
15
15
|
task :all do
|
|
16
16
|
Bundler.with_clean_env do
|
|
17
|
-
%w[ruby x86-mingw32 x64-mingw32].each do |name|
|
|
17
|
+
%w[ruby x86-mingw32 x64-mingw32 x64-mingw-ucrt].each do |name|
|
|
18
18
|
ENV['GEM_BUILD_FAKE_PLATFORM'] = name
|
|
19
19
|
Rake::Task["build"].execute
|
|
20
20
|
end
|
data/SECURITY.md
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# Security Policy
|
|
2
|
+
|
|
3
|
+
## Supported Versions
|
|
4
|
+
|
|
5
|
+
| Version | Supported |
|
|
6
|
+
| ------- | ------------------ |
|
|
7
|
+
| 1.16.x | :white_check_mark: |
|
|
8
|
+
| 1.15.x | :white_check_mark: |
|
|
9
|
+
| <= 1.14.x | :x: |
|
|
10
|
+
|
|
11
|
+
## Reporting a Vulnerability
|
|
12
|
+
|
|
13
|
+
Please post your vulnerability report from the following page:
|
|
14
|
+
https://github.com/fluent/fluentd/security/advisories
|
data/fluentd.gemspec
CHANGED
|
@@ -22,23 +22,21 @@ Gem::Specification.new do |gem|
|
|
|
22
22
|
gem.add_runtime_dependency("msgpack", [">= 1.3.1", "< 2.0.0"])
|
|
23
23
|
gem.add_runtime_dependency("yajl-ruby", ["~> 1.0"])
|
|
24
24
|
gem.add_runtime_dependency("cool.io", [">= 1.4.5", "< 2.0.0"])
|
|
25
|
-
gem.add_runtime_dependency("serverengine", [">= 2.
|
|
26
|
-
gem.add_runtime_dependency("http_parser.rb", [">= 0.5.1", "< 0.
|
|
27
|
-
gem.add_runtime_dependency("sigdump", ["~> 0.2.
|
|
25
|
+
gem.add_runtime_dependency("serverengine", [">= 2.3.2", "< 3.0.0"])
|
|
26
|
+
gem.add_runtime_dependency("http_parser.rb", [">= 0.5.1", "< 0.9.0"])
|
|
27
|
+
gem.add_runtime_dependency("sigdump", ["~> 0.2.5"])
|
|
28
28
|
gem.add_runtime_dependency("tzinfo", [">= 1.0", "< 3.0"])
|
|
29
29
|
gem.add_runtime_dependency("tzinfo-data", ["~> 1.0"])
|
|
30
|
-
gem.add_runtime_dependency("strptime", [">= 0.2.
|
|
31
|
-
gem.add_runtime_dependency("webrick", ["
|
|
30
|
+
gem.add_runtime_dependency("strptime", [">= 0.2.4", "< 1.0.0"])
|
|
31
|
+
gem.add_runtime_dependency("webrick", ["~> 1.4"])
|
|
32
32
|
|
|
33
33
|
# build gem for a certain platform. see also Rakefile
|
|
34
34
|
fake_platform = ENV['GEM_BUILD_FAKE_PLATFORM'].to_s
|
|
35
35
|
gem.platform = fake_platform unless fake_platform.empty?
|
|
36
36
|
if /mswin|mingw/ =~ fake_platform || (/mswin|mingw/ =~ RUBY_PLATFORM && fake_platform.empty?)
|
|
37
|
-
gem.add_runtime_dependency("win32-
|
|
38
|
-
gem.add_runtime_dependency("win32-service", ["~> 2.2.0"])
|
|
37
|
+
gem.add_runtime_dependency("win32-service", ["~> 2.3.0"])
|
|
39
38
|
gem.add_runtime_dependency("win32-ipc", ["~> 0.7.0"])
|
|
40
39
|
gem.add_runtime_dependency("win32-event", ["~> 0.6.3"])
|
|
41
|
-
gem.add_runtime_dependency("windows-pr", ["~> 1.2.6"])
|
|
42
40
|
gem.add_runtime_dependency("certstore_c", ["~> 0.1.7"])
|
|
43
41
|
end
|
|
44
42
|
|
|
@@ -51,5 +49,6 @@ Gem::Specification.new do |gem|
|
|
|
51
49
|
gem.add_development_dependency("test-unit", ["~> 3.3"])
|
|
52
50
|
gem.add_development_dependency("test-unit-rr", ["~> 1.0"])
|
|
53
51
|
gem.add_development_dependency("oj", [">= 2.14", "< 4"])
|
|
52
|
+
gem.add_development_dependency("async", "~> 1.23")
|
|
54
53
|
gem.add_development_dependency("async-http", ">= 0.50.0")
|
|
55
54
|
end
|
data/lib/fluent/command/cat.rb
CHANGED
|
@@ -35,6 +35,7 @@ format = 'json'
|
|
|
35
35
|
message_key = 'message'
|
|
36
36
|
time_as_integer = false
|
|
37
37
|
retry_limit = 5
|
|
38
|
+
event_time = nil
|
|
38
39
|
|
|
39
40
|
op.on('-p', '--port PORT', "fluent tcp port (default: #{port})", Integer) {|i|
|
|
40
41
|
port = i
|
|
@@ -80,6 +81,10 @@ op.on('--retry-limit N', "Specify the number of retry limit (default: #{retry_li
|
|
|
80
81
|
retry_limit = n
|
|
81
82
|
}
|
|
82
83
|
|
|
84
|
+
op.on('--event-time TIME_STRING', "Specify the time expression string (default: nil)") {|v|
|
|
85
|
+
event_time = v
|
|
86
|
+
}
|
|
87
|
+
|
|
83
88
|
singleton_class.module_eval do
|
|
84
89
|
define_method(:usage) do |msg|
|
|
85
90
|
puts op.to_s
|
|
@@ -134,7 +139,7 @@ class Writer
|
|
|
134
139
|
end
|
|
135
140
|
end
|
|
136
141
|
|
|
137
|
-
def initialize(tag, connector, time_as_integer: false, retry_limit: 5)
|
|
142
|
+
def initialize(tag, connector, time_as_integer: false, retry_limit: 5, event_time: nil)
|
|
138
143
|
@tag = tag
|
|
139
144
|
@connector = connector
|
|
140
145
|
@socket = false
|
|
@@ -148,6 +153,7 @@ class Writer
|
|
|
148
153
|
@retry_wait = 1
|
|
149
154
|
@retry_limit = retry_limit
|
|
150
155
|
@time_as_integer = time_as_integer
|
|
156
|
+
@event_time = event_time
|
|
151
157
|
|
|
152
158
|
super()
|
|
153
159
|
end
|
|
@@ -166,7 +172,11 @@ class Writer
|
|
|
166
172
|
end
|
|
167
173
|
end
|
|
168
174
|
|
|
169
|
-
time =
|
|
175
|
+
time = if @event_time
|
|
176
|
+
Fluent::EventTime.parse(@event_time)
|
|
177
|
+
else
|
|
178
|
+
Fluent::EventTime.now
|
|
179
|
+
end
|
|
170
180
|
time = time.to_i if @time_as_integer
|
|
171
181
|
entry = if secondary_record?(record)
|
|
172
182
|
# Even though secondary contains Fluent::EventTime in record,
|
|
@@ -309,7 +319,7 @@ else
|
|
|
309
319
|
}
|
|
310
320
|
end
|
|
311
321
|
|
|
312
|
-
w = Writer.new(tag, connector, time_as_integer: time_as_integer, retry_limit: retry_limit)
|
|
322
|
+
w = Writer.new(tag, connector, time_as_integer: time_as_integer, retry_limit: retry_limit, event_time: event_time)
|
|
313
323
|
w.start
|
|
314
324
|
|
|
315
325
|
case format
|
data/lib/fluent/command/ctl.rb
CHANGED
|
@@ -36,6 +36,7 @@ module Fluent
|
|
|
36
36
|
restart: "HUP",
|
|
37
37
|
flush: "USR1",
|
|
38
38
|
reload: "USR2",
|
|
39
|
+
dump: "CONT",
|
|
39
40
|
}
|
|
40
41
|
WINSVC_CONTROL_CODE_MAP = {
|
|
41
42
|
shutdown: SERVICE_CONTROL_STOP,
|
|
@@ -44,6 +45,7 @@ module Fluent
|
|
|
44
45
|
restart: 128,
|
|
45
46
|
flush: 129,
|
|
46
47
|
reload: SERVICE_CONTROL_PARAMCHANGE,
|
|
48
|
+
dump: 130,
|
|
47
49
|
}
|
|
48
50
|
else
|
|
49
51
|
COMMAND_MAP = {
|
|
@@ -51,6 +53,7 @@ module Fluent
|
|
|
51
53
|
restart: :HUP,
|
|
52
54
|
flush: :USR1,
|
|
53
55
|
reload: :USR2,
|
|
56
|
+
dump: :CONT,
|
|
54
57
|
}
|
|
55
58
|
end
|
|
56
59
|
|
|
@@ -89,7 +92,7 @@ module Fluent
|
|
|
89
92
|
|
|
90
93
|
def call
|
|
91
94
|
if Fluent.windows?
|
|
92
|
-
if
|
|
95
|
+
if /^[0-9]+$/.match?(@pid_or_svcname)
|
|
93
96
|
# Use as PID
|
|
94
97
|
return call_windows_event(@command, "fluentd_#{@pid_or_svcname}")
|
|
95
98
|
end
|
|
@@ -146,7 +149,7 @@ module Fluent
|
|
|
146
149
|
event = Win32::Event.open("#{prefix}#{suffix}")
|
|
147
150
|
event.set
|
|
148
151
|
event.close
|
|
149
|
-
rescue Errno::ENOENT
|
|
152
|
+
rescue Errno::ENOENT
|
|
150
153
|
puts "Error: Cannot find the fluentd process with the event name: \"#{prefix}\""
|
|
151
154
|
end
|
|
152
155
|
end
|
|
@@ -169,7 +172,7 @@ module Fluent
|
|
|
169
172
|
usage("PID or SVCNAME isn't specified!") if @pid_or_svcname.nil? || @pid_or_svcname.empty?
|
|
170
173
|
else
|
|
171
174
|
usage("PID isn't specified!") if @pid_or_svcname.nil? || @pid_or_svcname.empty?
|
|
172
|
-
usage("Invalid PID: #{pid}") unless
|
|
175
|
+
usage("Invalid PID: #{pid}") unless /^[0-9]+$/.match?(@pid_or_svcname)
|
|
173
176
|
end
|
|
174
177
|
end
|
|
175
178
|
end
|
|
@@ -26,26 +26,27 @@ $fluentdargv = Marshal.load(Marshal.dump(ARGV))
|
|
|
26
26
|
op = OptionParser.new
|
|
27
27
|
op.version = Fluent::VERSION
|
|
28
28
|
|
|
29
|
-
|
|
29
|
+
default_opts = Fluent::Supervisor.default_options
|
|
30
|
+
cmd_opts = {}
|
|
30
31
|
|
|
31
32
|
op.on('-s', "--setup [DIR=#{File.dirname(Fluent::DEFAULT_CONFIG_PATH)}]", "install sample configuration file to the directory") {|s|
|
|
32
|
-
|
|
33
|
+
cmd_opts[:setup_path] = s || File.dirname(Fluent::DEFAULT_CONFIG_PATH)
|
|
33
34
|
}
|
|
34
35
|
|
|
35
36
|
op.on('-c', '--config PATH', "config file path (default: #{Fluent::DEFAULT_CONFIG_PATH})") {|s|
|
|
36
|
-
|
|
37
|
+
cmd_opts[:config_path] = s
|
|
37
38
|
}
|
|
38
39
|
|
|
39
40
|
op.on('--dry-run', "Check fluentd setup is correct or not", TrueClass) {|b|
|
|
40
|
-
|
|
41
|
+
cmd_opts[:dry_run] = b
|
|
41
42
|
}
|
|
42
43
|
|
|
43
44
|
op.on('--show-plugin-config=PLUGIN', "[DEPRECATED] Show PLUGIN configuration and exit(ex: input:dummy)") {|plugin|
|
|
44
|
-
|
|
45
|
+
cmd_opts[:show_plugin_config] = plugin
|
|
45
46
|
}
|
|
46
47
|
|
|
47
48
|
op.on('-p', '--plugin DIR', "add plugin directory") {|s|
|
|
48
|
-
|
|
49
|
+
(cmd_opts[:plugin_dirs] ||= []) << s
|
|
49
50
|
}
|
|
50
51
|
|
|
51
52
|
op.on('-I PATH', "add library path") {|s|
|
|
@@ -53,44 +54,48 @@ op.on('-I PATH', "add library path") {|s|
|
|
|
53
54
|
}
|
|
54
55
|
|
|
55
56
|
op.on('-r NAME', "load library") {|s|
|
|
56
|
-
|
|
57
|
+
(cmd_opts[:libs] ||= []) << s
|
|
57
58
|
}
|
|
58
59
|
|
|
59
60
|
op.on('-d', '--daemon PIDFILE', "daemonize fluent process") {|s|
|
|
60
|
-
|
|
61
|
+
cmd_opts[:daemonize] = s
|
|
61
62
|
}
|
|
62
63
|
|
|
63
64
|
op.on('--under-supervisor', "run fluent worker under supervisor (this option is NOT for users)") {
|
|
64
|
-
|
|
65
|
+
cmd_opts[:supervise] = false
|
|
65
66
|
}
|
|
66
67
|
|
|
67
68
|
op.on('--no-supervisor', "run fluent worker without supervisor") {
|
|
68
|
-
|
|
69
|
-
|
|
69
|
+
cmd_opts[:supervise] = false
|
|
70
|
+
cmd_opts[:standalone_worker] = true
|
|
70
71
|
}
|
|
71
72
|
|
|
72
73
|
op.on('--workers NUM', "specify the number of workers under supervisor") { |i|
|
|
73
|
-
|
|
74
|
+
cmd_opts[:workers] = i.to_i
|
|
74
75
|
}
|
|
75
76
|
|
|
76
77
|
op.on('--user USER', "change user") {|s|
|
|
77
|
-
|
|
78
|
+
cmd_opts[:chuser] = s
|
|
78
79
|
}
|
|
79
80
|
|
|
80
81
|
op.on('--group GROUP', "change group") {|s|
|
|
81
|
-
|
|
82
|
+
cmd_opts[:chgroup] = s
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
op.on('--umask UMASK', "change umask") {|s|
|
|
86
|
+
cmd_opts[:chumask] = s
|
|
82
87
|
}
|
|
83
88
|
|
|
84
89
|
op.on('-o', '--log PATH', "log file path") {|s|
|
|
85
|
-
|
|
90
|
+
cmd_opts[:log_path] = s
|
|
86
91
|
}
|
|
87
92
|
|
|
88
93
|
op.on('--log-rotate-age AGE', 'generations to keep rotated log files') {|age|
|
|
89
94
|
if Fluent::Log::LOG_ROTATE_AGE.include?(age)
|
|
90
|
-
|
|
95
|
+
cmd_opts[:log_rotate_age] = age
|
|
91
96
|
else
|
|
92
97
|
begin
|
|
93
|
-
|
|
98
|
+
cmd_opts[:log_rotate_age] = Integer(age)
|
|
94
99
|
rescue TypeError, ArgumentError
|
|
95
100
|
usage "log-rotate-age should be #{ROTATE_AGE.join(', ')} or a number"
|
|
96
101
|
end
|
|
@@ -98,114 +103,129 @@ op.on('--log-rotate-age AGE', 'generations to keep rotated log files') {|age|
|
|
|
98
103
|
}
|
|
99
104
|
|
|
100
105
|
op.on('--log-rotate-size BYTES', 'sets the byte size to rotate log files') {|s|
|
|
101
|
-
|
|
106
|
+
cmd_opts[:log_rotate_size] = s.to_i
|
|
102
107
|
}
|
|
103
108
|
|
|
104
109
|
op.on('--log-event-verbose', 'enable log events during process startup/shutdown') {|b|
|
|
105
|
-
|
|
110
|
+
cmd_opts[:log_event_verbose] = b
|
|
106
111
|
}
|
|
107
112
|
|
|
108
113
|
op.on('-i', '--inline-config CONFIG_STRING', "inline config which is appended to the config file on-the-fly") {|s|
|
|
109
|
-
|
|
114
|
+
cmd_opts[:inline_config] = s
|
|
110
115
|
}
|
|
111
116
|
|
|
112
117
|
op.on('--emit-error-log-interval SECONDS', "suppress interval seconds of emit error logs") {|s|
|
|
113
|
-
|
|
118
|
+
cmd_opts[:suppress_interval] = s.to_i
|
|
114
119
|
}
|
|
115
120
|
|
|
116
121
|
op.on('--suppress-repeated-stacktrace [VALUE]', "suppress repeated stacktrace", TrueClass) {|b|
|
|
117
122
|
b = true if b.nil?
|
|
118
|
-
|
|
123
|
+
cmd_opts[:suppress_repeated_stacktrace] = b
|
|
119
124
|
}
|
|
120
125
|
|
|
121
126
|
op.on('--without-source', "invoke a fluentd without input plugins", TrueClass) {|b|
|
|
122
|
-
|
|
127
|
+
cmd_opts[:without_source] = b
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
op.on('--config-file-type VALU', 'guessing file type of fluentd configuration. yaml/yml or guess') { |s|
|
|
131
|
+
if (s == 'yaml') || (s == 'yml')
|
|
132
|
+
cmd_opts[:config_file_type] = s.to_sym
|
|
133
|
+
elsif (s == 'guess')
|
|
134
|
+
cmd_opts[:config_file_type] = s.to_sym
|
|
135
|
+
else
|
|
136
|
+
usage '--config-file-type accepts yaml/yml or guess'
|
|
137
|
+
end
|
|
123
138
|
}
|
|
124
139
|
|
|
125
140
|
op.on('--use-v1-config', "Use v1 configuration format (default)", TrueClass) {|b|
|
|
126
|
-
|
|
141
|
+
cmd_opts[:use_v1_config] = b
|
|
127
142
|
}
|
|
128
143
|
|
|
129
144
|
op.on('--use-v0-config', "Use v0 configuration format", TrueClass) {|b|
|
|
130
|
-
|
|
145
|
+
cmd_opts[:use_v1_config] = !b
|
|
131
146
|
}
|
|
132
147
|
|
|
133
148
|
op.on('--strict-config-value', "Parse config values strictly", TrueClass) {|b|
|
|
134
|
-
|
|
149
|
+
cmd_opts[:strict_config_value] = b
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
op.on('--enable-input-metrics', "Enable input plugin metrics on fluentd", TrueClass) {|b|
|
|
153
|
+
cmd_opts[:enable_input_metrics] = b
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
op.on('--enable-size-metrics', "Enable plugin record size metrics on fluentd", TrueClass) {|b|
|
|
157
|
+
cmd_opts[:enable_size_metrics] = b
|
|
135
158
|
}
|
|
136
159
|
|
|
137
160
|
op.on('-v', '--verbose', "increase verbose level (-v: debug, -vv: trace)", TrueClass) {|b|
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
161
|
+
return unless b
|
|
162
|
+
cur_level = cmd_opts.fetch(:log_level, default_opts[:log_level])
|
|
163
|
+
cmd_opts[:log_level] = [cur_level - 1, Fluent::Log::LEVEL_TRACE].max
|
|
141
164
|
}
|
|
142
165
|
|
|
143
166
|
op.on('-q', '--quiet', "decrease verbose level (-q: warn, -qq: error)", TrueClass) {|b|
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
167
|
+
return unless b
|
|
168
|
+
cur_level = cmd_opts.fetch(:log_level, default_opts[:log_level])
|
|
169
|
+
cmd_opts[:log_level] = [cur_level + 1, Fluent::Log::LEVEL_ERROR].min
|
|
147
170
|
}
|
|
148
171
|
|
|
149
172
|
op.on('--suppress-config-dump', "suppress config dumping when fluentd starts", TrueClass) {|b|
|
|
150
|
-
|
|
173
|
+
cmd_opts[:suppress_config_dump] = b
|
|
151
174
|
}
|
|
152
175
|
|
|
153
176
|
op.on('-g', '--gemfile GEMFILE', "Gemfile path") {|s|
|
|
154
|
-
|
|
177
|
+
cmd_opts[:gemfile] = s
|
|
155
178
|
}
|
|
156
179
|
|
|
157
180
|
op.on('-G', '--gem-path GEM_INSTALL_PATH', "Gemfile install path (default: $(dirname $gemfile)/vendor/bundle)") {|s|
|
|
158
|
-
|
|
181
|
+
cmd_opts[:gem_install_path] = s
|
|
159
182
|
}
|
|
160
183
|
|
|
161
184
|
op.on('--conf-encoding ENCODING', "specify configuration file encoding") { |s|
|
|
162
|
-
|
|
185
|
+
cmd_opts[:conf_encoding] = s
|
|
163
186
|
}
|
|
164
187
|
|
|
165
188
|
op.on('--disable-shared-socket', "Don't open shared socket for multiple workers") { |b|
|
|
166
|
-
|
|
189
|
+
cmd_opts[:disable_shared_socket] = b
|
|
167
190
|
}
|
|
168
191
|
|
|
169
192
|
if Fluent.windows?
|
|
170
|
-
|
|
171
|
-
include Windows::Library
|
|
172
|
-
|
|
173
|
-
opts.merge!(
|
|
193
|
+
cmd_opts.merge!(
|
|
174
194
|
:winsvc_name => 'fluentdwinsvc',
|
|
175
195
|
:winsvc_display_name => 'Fluentd Windows Service',
|
|
176
196
|
:winsvc_desc => 'Fluentd is an event collector system.',
|
|
177
197
|
)
|
|
178
198
|
|
|
179
199
|
op.on('-x', '--signame INTSIGNAME', "an object name which is used for Windows Service signal (Windows only)") {|s|
|
|
180
|
-
|
|
200
|
+
cmd_opts[:signame] = s
|
|
181
201
|
}
|
|
182
202
|
|
|
183
203
|
op.on('--reg-winsvc MODE', "install/uninstall as Windows Service. (i: install, u: uninstall) (Windows only)") {|s|
|
|
184
|
-
|
|
204
|
+
cmd_opts[:regwinsvc] = s
|
|
185
205
|
}
|
|
186
206
|
|
|
187
207
|
op.on('--[no-]reg-winsvc-auto-start', "Automatically start the Windows Service at boot. (only effective with '--reg-winsvc i') (Windows only)") {|s|
|
|
188
|
-
|
|
208
|
+
cmd_opts[:regwinsvcautostart] = s
|
|
189
209
|
}
|
|
190
210
|
|
|
191
211
|
op.on('--[no-]reg-winsvc-delay-start', "Automatically start the Windows Service at boot with delay. (only effective with '--reg-winsvc i' and '--reg-winsvc-auto-start') (Windows only)") {|s|
|
|
192
|
-
|
|
212
|
+
cmd_opts[:regwinsvcdelaystart] = s
|
|
193
213
|
}
|
|
194
214
|
|
|
195
215
|
op.on('--reg-winsvc-fluentdopt OPTION', "specify fluentd option parameters for Windows Service. (Windows only)") {|s|
|
|
196
|
-
|
|
216
|
+
cmd_opts[:fluentdopt] = s
|
|
197
217
|
}
|
|
198
218
|
|
|
199
219
|
op.on('--winsvc-name NAME', "The Windows Service name to run as (Windows only)") {|s|
|
|
200
|
-
|
|
220
|
+
cmd_opts[:winsvc_name] = s
|
|
201
221
|
}
|
|
202
222
|
|
|
203
223
|
op.on('--winsvc-display-name DISPLAY_NAME', "The Windows Service display name (Windows only)") {|s|
|
|
204
|
-
|
|
224
|
+
cmd_opts[:winsvc_display_name] = s
|
|
205
225
|
}
|
|
206
226
|
|
|
207
227
|
op.on('--winsvc-desc DESC', "The Windows Service description (Windows only)") {|s|
|
|
208
|
-
|
|
228
|
+
cmd_opts[:winsvc_desc] = s
|
|
209
229
|
}
|
|
210
230
|
end
|
|
211
231
|
|
|
@@ -228,6 +248,7 @@ rescue
|
|
|
228
248
|
usage $!.to_s
|
|
229
249
|
end
|
|
230
250
|
|
|
251
|
+
opts = default_opts.merge(cmd_opts)
|
|
231
252
|
|
|
232
253
|
##
|
|
233
254
|
## Bundler injection
|
|
@@ -270,9 +291,7 @@ if winsvcinstmode = opts[:regwinsvc]
|
|
|
270
291
|
case winsvcinstmode
|
|
271
292
|
when 'i'
|
|
272
293
|
binary_path = File.join(File.dirname(__FILE__), "..")
|
|
273
|
-
ruby_path =
|
|
274
|
-
GetModuleFileName.call(0,ruby_path,256)
|
|
275
|
-
ruby_path = ruby_path.rstrip.gsub(/\\/, '/')
|
|
294
|
+
ruby_path = ServerEngine.ruby_bin_path
|
|
276
295
|
start_type = Service::DEMAND_START
|
|
277
296
|
if opts[:regwinsvcautostart]
|
|
278
297
|
start_type = Service::AUTO_START
|
|
@@ -328,18 +347,7 @@ end
|
|
|
328
347
|
exit 0 if early_exit
|
|
329
348
|
|
|
330
349
|
if opts[:supervise]
|
|
331
|
-
|
|
332
|
-
if opts[:log_path] && opts[:log_path] != "-"
|
|
333
|
-
if opts[:log_rotate_age] || opts[:log_rotate_size]
|
|
334
|
-
require 'pathname'
|
|
335
|
-
|
|
336
|
-
log_path = Pathname(opts[:log_path]).sub_ext("-supervisor#{Pathname(opts[:log_path]).extname}").to_s
|
|
337
|
-
opts[:log_path] = log_path
|
|
338
|
-
end
|
|
339
|
-
end
|
|
340
|
-
end
|
|
341
|
-
|
|
342
|
-
supervisor = Fluent::Supervisor.new(opts)
|
|
350
|
+
supervisor = Fluent::Supervisor.new(cmd_opts)
|
|
343
351
|
supervisor.configure(supervisor: true)
|
|
344
352
|
supervisor.run_supervisor(dry_run: opts[:dry_run])
|
|
345
353
|
else
|
|
@@ -347,7 +355,7 @@ else
|
|
|
347
355
|
puts "Error: multi workers is not supported with --no-supervisor"
|
|
348
356
|
exit 2
|
|
349
357
|
end
|
|
350
|
-
worker = Fluent::Supervisor.new(
|
|
358
|
+
worker = Fluent::Supervisor.new(cmd_opts)
|
|
351
359
|
worker.configure
|
|
352
360
|
|
|
353
361
|
if opts[:daemonize] && opts[:standalone_worker]
|
|
@@ -61,7 +61,7 @@ class FluentPluginConfigFormatter
|
|
|
61
61
|
@plugin.class.ancestors.reverse_each do |plugin_class|
|
|
62
62
|
next unless plugin_class.respond_to?(:dump_config_definition)
|
|
63
63
|
unless @verbose
|
|
64
|
-
next if plugin_class.name
|
|
64
|
+
next if /::PluginHelper::/.match?(plugin_class.name)
|
|
65
65
|
end
|
|
66
66
|
dumped_config_definition = plugin_class.dump_config_definition
|
|
67
67
|
dumped_config[plugin_class.name] = dumped_config_definition unless dumped_config_definition.empty?
|
data/lib/fluent/compat/output.rb
CHANGED
|
@@ -310,7 +310,7 @@ module Fluent
|
|
|
310
310
|
# original implementation of v0.12 BufferedOutput
|
|
311
311
|
def emit(tag, es, chain, key="")
|
|
312
312
|
# this method will not be used except for the case that plugin calls super
|
|
313
|
-
@
|
|
313
|
+
@emit_count_metrics.inc
|
|
314
314
|
data = format_stream(tag, es)
|
|
315
315
|
if @buffer.emit(key, data, chain)
|
|
316
316
|
submit_flush
|
|
@@ -337,14 +337,14 @@ module Fluent
|
|
|
337
337
|
# because v0.12 BufferedOutput may overrides #format_stream, but original #handle_stream_simple method doesn't consider about it
|
|
338
338
|
def handle_stream_simple(tag, es, enqueue: false)
|
|
339
339
|
if @overrides_emit
|
|
340
|
-
current_emit_count = @
|
|
340
|
+
current_emit_count = @emit_count_metrics.get
|
|
341
341
|
size = es.size
|
|
342
342
|
key = data = nil
|
|
343
343
|
begin
|
|
344
344
|
emit(tag, es, NULL_OUTPUT_CHAIN)
|
|
345
345
|
key, data = self.last_emit_via_buffer
|
|
346
346
|
ensure
|
|
347
|
-
@
|
|
347
|
+
@emit_count_metrics.set(current_emit_count)
|
|
348
348
|
self.last_emit_via_buffer = nil
|
|
349
349
|
end
|
|
350
350
|
# on-the-fly key assignment can be done, and it's not configurable if Plugin#emit does it dynamically
|
|
@@ -352,7 +352,8 @@ module Fluent
|
|
|
352
352
|
write_guard do
|
|
353
353
|
@buffer.write({meta => data}, format: ->(_data){ _data }, size: ->(){ size }, enqueue: enqueue)
|
|
354
354
|
end
|
|
355
|
-
@
|
|
355
|
+
@emit_records_metrics.add(es.size)
|
|
356
|
+
@emit_size_metrics.add(es.to_msgpack_stream.bytesize) if @enable_size_metrics
|
|
356
357
|
return [meta]
|
|
357
358
|
end
|
|
358
359
|
|
|
@@ -363,7 +364,8 @@ module Fluent
|
|
|
363
364
|
write_guard do
|
|
364
365
|
@buffer.write({meta => bulk}, format: ->(_data){ _data }, size: ->(){ size }, enqueue: enqueue)
|
|
365
366
|
end
|
|
366
|
-
@
|
|
367
|
+
@emit_records_metrics.add(es.size)
|
|
368
|
+
@emit_size_metrics.add(es.to_msgpack_stream.bytesize) if @enable_size_metrics
|
|
367
369
|
return [meta]
|
|
368
370
|
end
|
|
369
371
|
|
|
@@ -373,7 +375,8 @@ module Fluent
|
|
|
373
375
|
write_guard do
|
|
374
376
|
@buffer.write({meta => data}, enqueue: enqueue)
|
|
375
377
|
end
|
|
376
|
-
@
|
|
378
|
+
@emit_records_metrics.add(es.size)
|
|
379
|
+
@emit_size_metrics.add(es.to_msgpack_stream.bytesize) if @enable_size_metrics
|
|
377
380
|
[meta]
|
|
378
381
|
end
|
|
379
382
|
|
data/lib/fluent/config/dsl.rb
CHANGED
|
@@ -110,7 +110,7 @@ module Fluent
|
|
|
110
110
|
|
|
111
111
|
def include(*args)
|
|
112
112
|
::Kernel.raise ::ArgumentError, "#{name} block requires arguments for include path" if args.nil? || args.size != 1
|
|
113
|
-
if args.first
|
|
113
|
+
if /\.rb$/.match?(args.first)
|
|
114
114
|
path = File.expand_path(args.first)
|
|
115
115
|
data = File.read(path)
|
|
116
116
|
self.instance_eval(data, path)
|
data/lib/fluent/config/error.rb
CHANGED
|
@@ -29,4 +29,16 @@ module Fluent
|
|
|
29
29
|
|
|
30
30
|
class SetDefault < Exception
|
|
31
31
|
end
|
|
32
|
+
|
|
33
|
+
class NotFoundPluginError < ConfigError
|
|
34
|
+
attr_reader :type, :kind
|
|
35
|
+
|
|
36
|
+
def initialize(msg, type: nil, kind: nil)
|
|
37
|
+
@msg = msg
|
|
38
|
+
@type = type
|
|
39
|
+
@kind = kind
|
|
40
|
+
|
|
41
|
+
super(msg)
|
|
42
|
+
end
|
|
43
|
+
end
|
|
32
44
|
end
|