logstash-lib 1.3.2
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.
- data/.gitignore +24 -0
- data/.tailor +8 -0
- data/.travis.yml +12 -0
- data/CHANGELOG +1185 -0
- data/CONTRIBUTING.md +61 -0
- data/CONTRIBUTORS +79 -0
- data/LICENSE +14 -0
- data/Makefile +460 -0
- data/README.md +120 -0
- data/STYLE.md +96 -0
- data/bin/logstash +37 -0
- data/bin/logstash-test +4 -0
- data/bin/logstash-web +4 -0
- data/bin/logstash.lib.sh +78 -0
- data/bot/check_pull_changelog.rb +89 -0
- data/docs/configuration.md +260 -0
- data/docs/docgen.rb +242 -0
- data/docs/extending/example-add-a-new-filter.md +121 -0
- data/docs/extending/index.md +91 -0
- data/docs/flags.md +43 -0
- data/docs/generate_index.rb +28 -0
- data/docs/index.html.erb +56 -0
- data/docs/learn.md +46 -0
- data/docs/life-of-an-event.md +109 -0
- data/docs/logging-tool-comparisons.md +60 -0
- data/docs/plugin-doc.html.erb +91 -0
- data/docs/plugin-milestones.md +41 -0
- data/docs/plugin-synopsis.html.erb +24 -0
- data/docs/release-engineering.md +46 -0
- data/docs/release-test-results.md +14 -0
- data/docs/repositories.md +35 -0
- data/docs/tutorials/10-minute-walkthrough/apache-elasticsearch.conf +35 -0
- data/docs/tutorials/10-minute-walkthrough/apache-parse.conf +33 -0
- data/docs/tutorials/10-minute-walkthrough/apache_log.1 +1 -0
- data/docs/tutorials/10-minute-walkthrough/apache_log.2.bz2 +0 -0
- data/docs/tutorials/10-minute-walkthrough/hello-search.conf +25 -0
- data/docs/tutorials/10-minute-walkthrough/hello.conf +16 -0
- data/docs/tutorials/10-minute-walkthrough/index.md +124 -0
- data/docs/tutorials/10-minute-walkthrough/step-5-output.txt +17 -0
- data/docs/tutorials/getting-started-centralized-overview-diagram.png +0 -0
- data/docs/tutorials/getting-started-centralized-overview-diagram.xml +1 -0
- data/docs/tutorials/getting-started-centralized.md +217 -0
- data/docs/tutorials/getting-started-simple.md +200 -0
- data/docs/tutorials/just-enough-rabbitmq-for-logstash.md +201 -0
- data/docs/tutorials/media/frontend-response-codes.png +0 -0
- data/docs/tutorials/metrics-from-logs.md +84 -0
- data/docs/tutorials/zeromq.md +118 -0
- data/extract_services.rb +29 -0
- data/gembag.rb +64 -0
- data/lib/logstash-event.rb +2 -0
- data/lib/logstash.rb +4 -0
- data/lib/logstash/JRUBY-6970-openssl.rb +22 -0
- data/lib/logstash/JRUBY-6970.rb +102 -0
- data/lib/logstash/agent.rb +305 -0
- data/lib/logstash/certs/cacert.pem +3895 -0
- data/lib/logstash/codecs/base.rb +49 -0
- data/lib/logstash/codecs/compress_spooler.rb +50 -0
- data/lib/logstash/codecs/dots.rb +18 -0
- data/lib/logstash/codecs/edn.rb +28 -0
- data/lib/logstash/codecs/edn_lines.rb +36 -0
- data/lib/logstash/codecs/fluent.rb +55 -0
- data/lib/logstash/codecs/graphite.rb +114 -0
- data/lib/logstash/codecs/json.rb +41 -0
- data/lib/logstash/codecs/json_lines.rb +52 -0
- data/lib/logstash/codecs/json_spooler.rb +22 -0
- data/lib/logstash/codecs/line.rb +58 -0
- data/lib/logstash/codecs/msgpack.rb +43 -0
- data/lib/logstash/codecs/multiline.rb +189 -0
- data/lib/logstash/codecs/netflow.rb +342 -0
- data/lib/logstash/codecs/netflow/util.rb +212 -0
- data/lib/logstash/codecs/noop.rb +19 -0
- data/lib/logstash/codecs/oldlogstashjson.rb +56 -0
- data/lib/logstash/codecs/plain.rb +48 -0
- data/lib/logstash/codecs/rubydebug.rb +22 -0
- data/lib/logstash/codecs/spool.rb +38 -0
- data/lib/logstash/config/Makefile +4 -0
- data/lib/logstash/config/config_ast.rb +380 -0
- data/lib/logstash/config/file.rb +39 -0
- data/lib/logstash/config/grammar.rb +3504 -0
- data/lib/logstash/config/grammar.treetop +241 -0
- data/lib/logstash/config/mixin.rb +464 -0
- data/lib/logstash/config/registry.rb +13 -0
- data/lib/logstash/config/test.conf +18 -0
- data/lib/logstash/errors.rb +10 -0
- data/lib/logstash/event.rb +262 -0
- data/lib/logstash/filters/advisor.rb +178 -0
- data/lib/logstash/filters/alter.rb +173 -0
- data/lib/logstash/filters/anonymize.rb +93 -0
- data/lib/logstash/filters/base.rb +190 -0
- data/lib/logstash/filters/checksum.rb +50 -0
- data/lib/logstash/filters/cidr.rb +76 -0
- data/lib/logstash/filters/cipher.rb +145 -0
- data/lib/logstash/filters/clone.rb +35 -0
- data/lib/logstash/filters/collate.rb +114 -0
- data/lib/logstash/filters/csv.rb +94 -0
- data/lib/logstash/filters/date.rb +244 -0
- data/lib/logstash/filters/dns.rb +201 -0
- data/lib/logstash/filters/drop.rb +32 -0
- data/lib/logstash/filters/elapsed.rb +256 -0
- data/lib/logstash/filters/elasticsearch.rb +73 -0
- data/lib/logstash/filters/environment.rb +27 -0
- data/lib/logstash/filters/extractnumbers.rb +84 -0
- data/lib/logstash/filters/gelfify.rb +52 -0
- data/lib/logstash/filters/geoip.rb +145 -0
- data/lib/logstash/filters/grep.rb +153 -0
- data/lib/logstash/filters/grok.rb +425 -0
- data/lib/logstash/filters/grokdiscovery.rb +75 -0
- data/lib/logstash/filters/i18n.rb +51 -0
- data/lib/logstash/filters/json.rb +90 -0
- data/lib/logstash/filters/json_encode.rb +52 -0
- data/lib/logstash/filters/kv.rb +232 -0
- data/lib/logstash/filters/metaevent.rb +68 -0
- data/lib/logstash/filters/metrics.rb +237 -0
- data/lib/logstash/filters/multiline.rb +241 -0
- data/lib/logstash/filters/mutate.rb +399 -0
- data/lib/logstash/filters/noop.rb +21 -0
- data/lib/logstash/filters/prune.rb +149 -0
- data/lib/logstash/filters/punct.rb +32 -0
- data/lib/logstash/filters/railsparallelrequest.rb +86 -0
- data/lib/logstash/filters/range.rb +142 -0
- data/lib/logstash/filters/ruby.rb +42 -0
- data/lib/logstash/filters/sleep.rb +111 -0
- data/lib/logstash/filters/split.rb +64 -0
- data/lib/logstash/filters/sumnumbers.rb +73 -0
- data/lib/logstash/filters/syslog_pri.rb +107 -0
- data/lib/logstash/filters/translate.rb +121 -0
- data/lib/logstash/filters/unique.rb +29 -0
- data/lib/logstash/filters/urldecode.rb +57 -0
- data/lib/logstash/filters/useragent.rb +112 -0
- data/lib/logstash/filters/uuid.rb +58 -0
- data/lib/logstash/filters/xml.rb +139 -0
- data/lib/logstash/filters/zeromq.rb +123 -0
- data/lib/logstash/filterworker.rb +122 -0
- data/lib/logstash/inputs/base.rb +125 -0
- data/lib/logstash/inputs/collectd.rb +306 -0
- data/lib/logstash/inputs/drupal_dblog.rb +323 -0
- data/lib/logstash/inputs/drupal_dblog/jdbcconnection.rb +66 -0
- data/lib/logstash/inputs/elasticsearch.rb +140 -0
- data/lib/logstash/inputs/eventlog.rb +129 -0
- data/lib/logstash/inputs/eventlog/racob_fix.rb +44 -0
- data/lib/logstash/inputs/exec.rb +69 -0
- data/lib/logstash/inputs/file.rb +146 -0
- data/lib/logstash/inputs/ganglia.rb +127 -0
- data/lib/logstash/inputs/ganglia/gmondpacket.rb +146 -0
- data/lib/logstash/inputs/ganglia/xdr.rb +327 -0
- data/lib/logstash/inputs/gelf.rb +138 -0
- data/lib/logstash/inputs/gemfire.rb +222 -0
- data/lib/logstash/inputs/generator.rb +97 -0
- data/lib/logstash/inputs/graphite.rb +41 -0
- data/lib/logstash/inputs/heroku.rb +51 -0
- data/lib/logstash/inputs/imap.rb +136 -0
- data/lib/logstash/inputs/irc.rb +84 -0
- data/lib/logstash/inputs/log4j.rb +136 -0
- data/lib/logstash/inputs/lumberjack.rb +53 -0
- data/lib/logstash/inputs/pipe.rb +57 -0
- data/lib/logstash/inputs/rabbitmq.rb +126 -0
- data/lib/logstash/inputs/rabbitmq/bunny.rb +118 -0
- data/lib/logstash/inputs/rabbitmq/hot_bunnies.rb +1 -0
- data/lib/logstash/inputs/rabbitmq/march_hare.rb +129 -0
- data/lib/logstash/inputs/redis.rb +263 -0
- data/lib/logstash/inputs/relp.rb +106 -0
- data/lib/logstash/inputs/s3.rb +279 -0
- data/lib/logstash/inputs/snmptrap.rb +87 -0
- data/lib/logstash/inputs/sqlite.rb +185 -0
- data/lib/logstash/inputs/sqs.rb +172 -0
- data/lib/logstash/inputs/stdin.rb +46 -0
- data/lib/logstash/inputs/stomp.rb +84 -0
- data/lib/logstash/inputs/syslog.rb +237 -0
- data/lib/logstash/inputs/tcp.rb +231 -0
- data/lib/logstash/inputs/threadable.rb +18 -0
- data/lib/logstash/inputs/twitter.rb +82 -0
- data/lib/logstash/inputs/udp.rb +81 -0
- data/lib/logstash/inputs/unix.rb +163 -0
- data/lib/logstash/inputs/varnishlog.rb +48 -0
- data/lib/logstash/inputs/websocket.rb +50 -0
- data/lib/logstash/inputs/wmi.rb +72 -0
- data/lib/logstash/inputs/xmpp.rb +81 -0
- data/lib/logstash/inputs/zenoss.rb +143 -0
- data/lib/logstash/inputs/zeromq.rb +165 -0
- data/lib/logstash/kibana.rb +113 -0
- data/lib/logstash/loadlibs.rb +9 -0
- data/lib/logstash/logging.rb +89 -0
- data/lib/logstash/monkeypatches-for-bugs.rb +2 -0
- data/lib/logstash/monkeypatches-for-debugging.rb +47 -0
- data/lib/logstash/monkeypatches-for-performance.rb +66 -0
- data/lib/logstash/multiqueue.rb +53 -0
- data/lib/logstash/namespace.rb +16 -0
- data/lib/logstash/outputs/base.rb +120 -0
- data/lib/logstash/outputs/boundary.rb +116 -0
- data/lib/logstash/outputs/circonus.rb +78 -0
- data/lib/logstash/outputs/cloudwatch.rb +351 -0
- data/lib/logstash/outputs/csv.rb +55 -0
- data/lib/logstash/outputs/datadog.rb +93 -0
- data/lib/logstash/outputs/datadog_metrics.rb +123 -0
- data/lib/logstash/outputs/elasticsearch.rb +332 -0
- data/lib/logstash/outputs/elasticsearch/elasticsearch-template.json +44 -0
- data/lib/logstash/outputs/elasticsearch_http.rb +256 -0
- data/lib/logstash/outputs/elasticsearch_river.rb +214 -0
- data/lib/logstash/outputs/email.rb +299 -0
- data/lib/logstash/outputs/exec.rb +40 -0
- data/lib/logstash/outputs/file.rb +180 -0
- data/lib/logstash/outputs/ganglia.rb +75 -0
- data/lib/logstash/outputs/gelf.rb +208 -0
- data/lib/logstash/outputs/gemfire.rb +103 -0
- data/lib/logstash/outputs/google_bigquery.rb +570 -0
- data/lib/logstash/outputs/google_cloud_storage.rb +431 -0
- data/lib/logstash/outputs/graphite.rb +143 -0
- data/lib/logstash/outputs/graphtastic.rb +185 -0
- data/lib/logstash/outputs/hipchat.rb +80 -0
- data/lib/logstash/outputs/http.rb +142 -0
- data/lib/logstash/outputs/irc.rb +80 -0
- data/lib/logstash/outputs/jira.rb +109 -0
- data/lib/logstash/outputs/juggernaut.rb +105 -0
- data/lib/logstash/outputs/librato.rb +146 -0
- data/lib/logstash/outputs/loggly.rb +93 -0
- data/lib/logstash/outputs/lumberjack.rb +51 -0
- data/lib/logstash/outputs/metriccatcher.rb +103 -0
- data/lib/logstash/outputs/mongodb.rb +81 -0
- data/lib/logstash/outputs/nagios.rb +119 -0
- data/lib/logstash/outputs/nagios_nsca.rb +123 -0
- data/lib/logstash/outputs/null.rb +18 -0
- data/lib/logstash/outputs/opentsdb.rb +101 -0
- data/lib/logstash/outputs/pagerduty.rb +79 -0
- data/lib/logstash/outputs/pipe.rb +132 -0
- data/lib/logstash/outputs/rabbitmq.rb +96 -0
- data/lib/logstash/outputs/rabbitmq/bunny.rb +135 -0
- data/lib/logstash/outputs/rabbitmq/hot_bunnies.rb +1 -0
- data/lib/logstash/outputs/rabbitmq/march_hare.rb +143 -0
- data/lib/logstash/outputs/redis.rb +245 -0
- data/lib/logstash/outputs/riak.rb +152 -0
- data/lib/logstash/outputs/riemann.rb +109 -0
- data/lib/logstash/outputs/s3.rb +356 -0
- data/lib/logstash/outputs/sns.rb +124 -0
- data/lib/logstash/outputs/solr_http.rb +78 -0
- data/lib/logstash/outputs/sqs.rb +141 -0
- data/lib/logstash/outputs/statsd.rb +116 -0
- data/lib/logstash/outputs/stdout.rb +53 -0
- data/lib/logstash/outputs/stomp.rb +67 -0
- data/lib/logstash/outputs/syslog.rb +145 -0
- data/lib/logstash/outputs/tcp.rb +145 -0
- data/lib/logstash/outputs/udp.rb +38 -0
- data/lib/logstash/outputs/websocket.rb +46 -0
- data/lib/logstash/outputs/websocket/app.rb +29 -0
- data/lib/logstash/outputs/websocket/pubsub.rb +45 -0
- data/lib/logstash/outputs/xmpp.rb +78 -0
- data/lib/logstash/outputs/zabbix.rb +108 -0
- data/lib/logstash/outputs/zeromq.rb +125 -0
- data/lib/logstash/pipeline.rb +286 -0
- data/lib/logstash/plugin.rb +150 -0
- data/lib/logstash/plugin_mixins/aws_config.rb +93 -0
- data/lib/logstash/program.rb +15 -0
- data/lib/logstash/runner.rb +238 -0
- data/lib/logstash/sized_queue.rb +8 -0
- data/lib/logstash/test.rb +183 -0
- data/lib/logstash/threadwatchdog.rb +37 -0
- data/lib/logstash/time_addon.rb +33 -0
- data/lib/logstash/util.rb +106 -0
- data/lib/logstash/util/buftok.rb +139 -0
- data/lib/logstash/util/charset.rb +39 -0
- data/lib/logstash/util/fieldreference.rb +50 -0
- data/lib/logstash/util/password.rb +25 -0
- data/lib/logstash/util/prctl.rb +11 -0
- data/lib/logstash/util/relp.rb +326 -0
- data/lib/logstash/util/require-helper.rb +18 -0
- data/lib/logstash/util/socket_peer.rb +7 -0
- data/lib/logstash/util/zenoss.rb +566 -0
- data/lib/logstash/util/zeromq.rb +47 -0
- data/lib/logstash/version.rb +6 -0
- data/locales/en.yml +170 -0
- data/logstash-event.gemspec +29 -0
- data/logstash.gemspec +128 -0
- data/patterns/firewalls +60 -0
- data/patterns/grok-patterns +91 -0
- data/patterns/haproxy +37 -0
- data/patterns/java +3 -0
- data/patterns/linux-syslog +14 -0
- data/patterns/mcollective +1 -0
- data/patterns/mcollective-patterns +4 -0
- data/patterns/nagios +108 -0
- data/patterns/postgresql +3 -0
- data/patterns/redis +3 -0
- data/patterns/ruby +2 -0
- data/pkg/build.sh +135 -0
- data/pkg/centos/after-install.sh +1 -0
- data/pkg/centos/before-install.sh +10 -0
- data/pkg/centos/before-remove.sh +11 -0
- data/pkg/centos/sysconfig +15 -0
- data/pkg/debian/after-install.sh +5 -0
- data/pkg/debian/before-install.sh +13 -0
- data/pkg/debian/before-remove.sh +13 -0
- data/pkg/debian/build.sh +34 -0
- data/pkg/debian/debian/README +6 -0
- data/pkg/debian/debian/changelog +17 -0
- data/pkg/debian/debian/compat +1 -0
- data/pkg/debian/debian/control +16 -0
- data/pkg/debian/debian/copyright +27 -0
- data/pkg/debian/debian/dirs +19 -0
- data/pkg/debian/debian/docs +0 -0
- data/pkg/debian/debian/logstash.default +39 -0
- data/pkg/debian/debian/logstash.init +201 -0
- data/pkg/debian/debian/logstash.install +1 -0
- data/pkg/debian/debian/logstash.logrotate +9 -0
- data/pkg/debian/debian/logstash.postinst +68 -0
- data/pkg/debian/debian/logstash.postrm +23 -0
- data/pkg/debian/debian/manpage.1.ex +59 -0
- data/pkg/debian/debian/preinst.ex +37 -0
- data/pkg/debian/debian/prerm.ex +40 -0
- data/pkg/debian/debian/release.conf +5 -0
- data/pkg/debian/debian/rules +80 -0
- data/pkg/debian/debian/watch.ex +22 -0
- data/pkg/logrotate.conf +8 -0
- data/pkg/logstash-web.default +41 -0
- data/pkg/logstash-web.sysv.debian +201 -0
- data/pkg/logstash-web.upstart.ubuntu +18 -0
- data/pkg/logstash.default +45 -0
- data/pkg/logstash.sysv.debian +202 -0
- data/pkg/logstash.sysv.redhat +158 -0
- data/pkg/logstash.upstart.ubuntu +20 -0
- data/pkg/rpm/SOURCES/logstash.conf +26 -0
- data/pkg/rpm/SOURCES/logstash.init +80 -0
- data/pkg/rpm/SOURCES/logstash.logrotate +8 -0
- data/pkg/rpm/SOURCES/logstash.sysconfig +3 -0
- data/pkg/rpm/SOURCES/logstash.wrapper +105 -0
- data/pkg/rpm/SPECS/logstash.spec +180 -0
- data/pkg/rpm/readme.md +4 -0
- data/pkg/ubuntu/after-install.sh +7 -0
- data/pkg/ubuntu/before-install.sh +12 -0
- data/pkg/ubuntu/before-remove.sh +13 -0
- data/pull_release_note.rb +25 -0
- data/require-analyze.rb +22 -0
- data/spec/README.md +14 -0
- data/spec/codecs/edn.rb +40 -0
- data/spec/codecs/edn_lines.rb +53 -0
- data/spec/codecs/graphite.rb +96 -0
- data/spec/codecs/json.rb +57 -0
- data/spec/codecs/json_lines.rb +51 -0
- data/spec/codecs/json_spooler.rb +43 -0
- data/spec/codecs/msgpack.rb +39 -0
- data/spec/codecs/multiline.rb +60 -0
- data/spec/codecs/oldlogstashjson.rb +55 -0
- data/spec/codecs/plain.rb +35 -0
- data/spec/codecs/spool.rb +35 -0
- data/spec/conditionals/test.rb +323 -0
- data/spec/config.rb +31 -0
- data/spec/event.rb +165 -0
- data/spec/examples/fail2ban.rb +28 -0
- data/spec/examples/graphite-input.rb +41 -0
- data/spec/examples/mysql-slow-query.rb +70 -0
- data/spec/examples/parse-apache-logs.rb +66 -0
- data/spec/examples/parse-haproxy-logs.rb +115 -0
- data/spec/examples/syslog.rb +48 -0
- data/spec/filters/alter.rb +96 -0
- data/spec/filters/anonymize.rb +189 -0
- data/spec/filters/checksum.rb +41 -0
- data/spec/filters/clone.rb +67 -0
- data/spec/filters/collate.rb +122 -0
- data/spec/filters/csv.rb +174 -0
- data/spec/filters/date.rb +285 -0
- data/spec/filters/date_performance.rb +31 -0
- data/spec/filters/dns.rb +159 -0
- data/spec/filters/drop.rb +19 -0
- data/spec/filters/elapsed.rb +294 -0
- data/spec/filters/environment.rb +43 -0
- data/spec/filters/geoip.rb +62 -0
- data/spec/filters/grep.rb +342 -0
- data/spec/filters/grok.rb +473 -0
- data/spec/filters/grok/timeout2.rb +56 -0
- data/spec/filters/grok/timeouts.rb +39 -0
- data/spec/filters/i18n.rb +25 -0
- data/spec/filters/json.rb +72 -0
- data/spec/filters/json_encode.rb +37 -0
- data/spec/filters/kv.rb +403 -0
- data/spec/filters/metrics.rb +212 -0
- data/spec/filters/multiline.rb +119 -0
- data/spec/filters/mutate.rb +180 -0
- data/spec/filters/noop.rb +221 -0
- data/spec/filters/prune.rb +441 -0
- data/spec/filters/punct.rb +18 -0
- data/spec/filters/railsparallelrequest.rb +112 -0
- data/spec/filters/range.rb +169 -0
- data/spec/filters/split.rb +58 -0
- data/spec/filters/translate.rb +70 -0
- data/spec/filters/unique.rb +25 -0
- data/spec/filters/useragent.rb +42 -0
- data/spec/filters/xml.rb +157 -0
- data/spec/inputs/file.rb +107 -0
- data/spec/inputs/gelf.rb +52 -0
- data/spec/inputs/generator.rb +30 -0
- data/spec/inputs/imap.rb +60 -0
- data/spec/inputs/redis.rb +63 -0
- data/spec/inputs/relp.rb +70 -0
- data/spec/inputs/tcp.rb +101 -0
- data/spec/jar.rb +21 -0
- data/spec/outputs/csv.rb +266 -0
- data/spec/outputs/elasticsearch.rb +161 -0
- data/spec/outputs/elasticsearch_http.rb +240 -0
- data/spec/outputs/email.rb +173 -0
- data/spec/outputs/file.rb +82 -0
- data/spec/outputs/graphite.rb +236 -0
- data/spec/outputs/redis.rb +127 -0
- data/spec/speed.rb +20 -0
- data/spec/sqlite-test.rb +81 -0
- data/spec/support/LOGSTASH-733.rb +21 -0
- data/spec/support/LOGSTASH-820.rb +25 -0
- data/spec/support/akamai-grok.rb +26 -0
- data/spec/support/date-http.rb +17 -0
- data/spec/support/postwait1.rb +26 -0
- data/spec/support/pull375.rb +21 -0
- data/spec/test_utils.rb +125 -0
- data/spec/util/fieldeval_spec.rb +44 -0
- data/test/jenkins/config.xml.erb +74 -0
- data/test/jenkins/create-jobs.rb +23 -0
- data/test/jenkins/generatorjob.config.xml +66 -0
- data/tools/Gemfile +14 -0
- data/tools/Gemfile.jruby-1.9.lock +322 -0
- data/tools/Gemfile.rbx-2.1.lock +516 -0
- data/tools/Gemfile.ruby-1.9.1.lock +310 -0
- data/tools/Gemfile.ruby-2.0.0.lock +310 -0
- metadata +629 -0
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
require "logstash/filters/base"
|
|
3
|
+
require "logstash/namespace"
|
|
4
|
+
|
|
5
|
+
class LogStash::Filters::Metaevent < LogStash::Filters::Base
|
|
6
|
+
config_name "metaevent"
|
|
7
|
+
milestone 1
|
|
8
|
+
|
|
9
|
+
# syntax: `followed_by_tags => [ "tag", "tag" ]`
|
|
10
|
+
config :followed_by_tags, :validate => :array, :required => true
|
|
11
|
+
|
|
12
|
+
# syntax: `period => 60`
|
|
13
|
+
config :period, :validate => :number, :default => 5
|
|
14
|
+
|
|
15
|
+
def register
|
|
16
|
+
@logger.debug("registering")
|
|
17
|
+
@metaevents = []
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def filter(event)
|
|
21
|
+
if filter?(event)
|
|
22
|
+
start_period(event)
|
|
23
|
+
elsif within_period(event)
|
|
24
|
+
if followed_by_tags_match(event)
|
|
25
|
+
trigger(event)
|
|
26
|
+
else
|
|
27
|
+
@logger.debug(["metaevent", @add_tag, "ignoring (tags don't match)", event])
|
|
28
|
+
end
|
|
29
|
+
else
|
|
30
|
+
@logger.debug(["metaevent", @add_tag, "ignoring (not in period)", event])
|
|
31
|
+
end
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def flush
|
|
35
|
+
return if @metaevents.empty?
|
|
36
|
+
|
|
37
|
+
new_events = @metaevents
|
|
38
|
+
@metaevents = []
|
|
39
|
+
new_events
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
private
|
|
43
|
+
|
|
44
|
+
def start_period(event)
|
|
45
|
+
@logger.debug(["metaevent", @add_tag, "start_period", event])
|
|
46
|
+
@start_event = event
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def trigger(event)
|
|
50
|
+
@logger.debug(["metaevent", @add_tag, "trigger", event])
|
|
51
|
+
|
|
52
|
+
event = LogStash::Event.new
|
|
53
|
+
event["source"] = Socket.gethostname
|
|
54
|
+
event["tags"] = [@add_tag]
|
|
55
|
+
|
|
56
|
+
@metaevents << event
|
|
57
|
+
@start_event = nil
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def followed_by_tags_match(event)
|
|
61
|
+
(event["tags"] & @followed_by_tags).size == @followed_by_tags.size
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def within_period(event)
|
|
65
|
+
time_delta = event["@timestamp"] - @start_event["@timestamp"]
|
|
66
|
+
time_delta >= 0 && time_delta <= @period
|
|
67
|
+
end
|
|
68
|
+
end
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
require "securerandom"
|
|
3
|
+
require "logstash/filters/base"
|
|
4
|
+
require "logstash/namespace"
|
|
5
|
+
|
|
6
|
+
# The metrics filter is useful for aggregating metrics.
|
|
7
|
+
#
|
|
8
|
+
# For example, if you have a field 'response' that is
|
|
9
|
+
# a http response code, and you want to count each
|
|
10
|
+
# kind of response, you can do this:
|
|
11
|
+
#
|
|
12
|
+
# filter {
|
|
13
|
+
# metrics {
|
|
14
|
+
# meter => [ "http.%{response}" ]
|
|
15
|
+
# add_tag => "metric"
|
|
16
|
+
# }
|
|
17
|
+
# }
|
|
18
|
+
#
|
|
19
|
+
# Metrics are flushed every 5 seconds by default or according to
|
|
20
|
+
# 'flush_interval'. Metrics appear as
|
|
21
|
+
# new events in the event stream and go through any filters
|
|
22
|
+
# that occur after as well as outputs.
|
|
23
|
+
#
|
|
24
|
+
# In general, you will want to add a tag to your metrics and have an output
|
|
25
|
+
# explicitly look for that tag.
|
|
26
|
+
#
|
|
27
|
+
# The event that is flushed will include every 'meter' and 'timer'
|
|
28
|
+
# metric in the following way:
|
|
29
|
+
#
|
|
30
|
+
# #### 'meter' values
|
|
31
|
+
#
|
|
32
|
+
# For a `meter => "something"` you will receive the following fields:
|
|
33
|
+
#
|
|
34
|
+
# * "thing.count" - the total count of events
|
|
35
|
+
# * "thing.rate_1m" - the 1-minute rate (sliding)
|
|
36
|
+
# * "thing.rate_5m" - the 5-minute rate (sliding)
|
|
37
|
+
# * "thing.rate_15m" - the 15-minute rate (sliding)
|
|
38
|
+
#
|
|
39
|
+
# #### 'timer' values
|
|
40
|
+
#
|
|
41
|
+
# For a `timer => [ "thing", "%{duration}" ]` you will receive the following fields:
|
|
42
|
+
#
|
|
43
|
+
# * "thing.count" - the total count of events
|
|
44
|
+
# * "thing.rate_1m" - the 1-minute rate of events (sliding)
|
|
45
|
+
# * "thing.rate_5m" - the 5-minute rate of events (sliding)
|
|
46
|
+
# * "thing.rate_15m" - the 15-minute rate of events (sliding)
|
|
47
|
+
# * "thing.min" - the minimum value seen for this metric
|
|
48
|
+
# * "thing.max" - the maximum value seen for this metric
|
|
49
|
+
# * "thing.stddev" - the standard deviation for this metric
|
|
50
|
+
# * "thing.mean" - the mean for this metric
|
|
51
|
+
#
|
|
52
|
+
# #### Example: computing event rate
|
|
53
|
+
#
|
|
54
|
+
# For a simple example, let's track how many events per second are running
|
|
55
|
+
# through logstash:
|
|
56
|
+
#
|
|
57
|
+
# input {
|
|
58
|
+
# generator {
|
|
59
|
+
# type => "generated"
|
|
60
|
+
# }
|
|
61
|
+
# }
|
|
62
|
+
#
|
|
63
|
+
# filter {
|
|
64
|
+
# metrics {
|
|
65
|
+
# type => "generated"
|
|
66
|
+
# meter => "events"
|
|
67
|
+
# add_tag => "metric"
|
|
68
|
+
# }
|
|
69
|
+
# }
|
|
70
|
+
#
|
|
71
|
+
# output {
|
|
72
|
+
# stdout {
|
|
73
|
+
# # only emit events with the 'metric' tag
|
|
74
|
+
# tags => "metric"
|
|
75
|
+
# message => "rate: %{events.rate_1m}"
|
|
76
|
+
# }
|
|
77
|
+
# }
|
|
78
|
+
#
|
|
79
|
+
# Running the above:
|
|
80
|
+
#
|
|
81
|
+
# % java -jar logstash.jar agent -f example.conf
|
|
82
|
+
# rate: 23721.983566819246
|
|
83
|
+
# rate: 24811.395722536377
|
|
84
|
+
# rate: 25875.892745934525
|
|
85
|
+
# rate: 26836.42375967113
|
|
86
|
+
#
|
|
87
|
+
# We see the output includes our 'events' 1-minute rate.
|
|
88
|
+
#
|
|
89
|
+
# In the real world, you would emit this to graphite or another metrics store,
|
|
90
|
+
# like so:
|
|
91
|
+
#
|
|
92
|
+
# output {
|
|
93
|
+
# graphite {
|
|
94
|
+
# metrics => [ "events.rate_1m", "%{events.rate_1m}" ]
|
|
95
|
+
# }
|
|
96
|
+
# }
|
|
97
|
+
class LogStash::Filters::Metrics < LogStash::Filters::Base
|
|
98
|
+
config_name "metrics"
|
|
99
|
+
milestone 1
|
|
100
|
+
|
|
101
|
+
# syntax: `meter => [ "name of metric", "name of metric" ]`
|
|
102
|
+
config :meter, :validate => :array, :default => []
|
|
103
|
+
|
|
104
|
+
# syntax: `timer => [ "name of metric", "%{time_value}" ]`
|
|
105
|
+
config :timer, :validate => :hash, :default => {}
|
|
106
|
+
|
|
107
|
+
# Don't track events that have @timestamp older than some number of seconds.
|
|
108
|
+
#
|
|
109
|
+
# This is useful if you want to only include events that are near real-time
|
|
110
|
+
# in your metrics.
|
|
111
|
+
#
|
|
112
|
+
# Example, to only count events that are within 10 seconds of real-time, you
|
|
113
|
+
# would do this:
|
|
114
|
+
#
|
|
115
|
+
# filter {
|
|
116
|
+
# metrics {
|
|
117
|
+
# meter => [ "hits" ]
|
|
118
|
+
# ignore_older_than => 10
|
|
119
|
+
# }
|
|
120
|
+
# }
|
|
121
|
+
config :ignore_older_than, :validate => :number, :default => 0
|
|
122
|
+
|
|
123
|
+
# The flush interval, when the metrics event is created. Must be a multiple of 5s.
|
|
124
|
+
config :flush_interval, :validate => :number, :default => 5
|
|
125
|
+
|
|
126
|
+
# The clear interval, when all counter are reset.
|
|
127
|
+
#
|
|
128
|
+
# If set to -1, the default value, the metrics will never be cleared.
|
|
129
|
+
# Otherwise, should be a multiple of 5s.
|
|
130
|
+
config :clear_interval, :validate => :number, :default => -1
|
|
131
|
+
|
|
132
|
+
# The rates that should be measured, in minutes.
|
|
133
|
+
# Possible values are 1, 5, and 15.
|
|
134
|
+
config :rates, :validate => :array, :default => [1, 5, 15]
|
|
135
|
+
|
|
136
|
+
# The percentiles that should be measured
|
|
137
|
+
config :percentiles, :validate => :array, :default => [1, 5, 10, 90, 95, 99, 100]
|
|
138
|
+
|
|
139
|
+
def register
|
|
140
|
+
require "metriks"
|
|
141
|
+
require "socket"
|
|
142
|
+
@last_flush = 0 # how many seconds ago the metrics where flushed.
|
|
143
|
+
@last_clear = 0 # how many seconds ago the metrics where cleared.
|
|
144
|
+
@random_key_preffix = SecureRandom.hex
|
|
145
|
+
unless (@rates - [1, 5, 15]).empty?
|
|
146
|
+
raise LogStash::ConfigurationError, "Invalid rates configuration. possible rates are 1, 5, 15. Rates: #{rates}."
|
|
147
|
+
end
|
|
148
|
+
initialize_metrics
|
|
149
|
+
end # def register
|
|
150
|
+
|
|
151
|
+
def filter(event)
|
|
152
|
+
return unless filter?(event)
|
|
153
|
+
|
|
154
|
+
# TODO(piavlo): This should probably be moved to base filter class.
|
|
155
|
+
if @ignore_older_than > 0 && Time.now - event["@timestamp"] > @ignore_older_than
|
|
156
|
+
@logger.debug("Skipping metriks for old event", :event => event)
|
|
157
|
+
return
|
|
158
|
+
end
|
|
159
|
+
|
|
160
|
+
@meter.each do |m|
|
|
161
|
+
@metric_meters[event.sprintf(m)].mark
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
@timer.each do |name, value|
|
|
165
|
+
@metric_timers[event.sprintf(name)].update(event.sprintf(value).to_f)
|
|
166
|
+
end
|
|
167
|
+
end # def filter
|
|
168
|
+
|
|
169
|
+
def flush
|
|
170
|
+
# Add 5 seconds to @last_flush and @last_clear counters
|
|
171
|
+
# since this method is called every 5 seconds.
|
|
172
|
+
@last_flush += 5
|
|
173
|
+
@last_clear += 5
|
|
174
|
+
|
|
175
|
+
# Do nothing if there's nothing to do ;)
|
|
176
|
+
return unless should_flush?
|
|
177
|
+
|
|
178
|
+
event = LogStash::Event.new
|
|
179
|
+
event["message"] = Socket.gethostname
|
|
180
|
+
@metric_meters.each do |name, metric|
|
|
181
|
+
flush_rates event, name, metric
|
|
182
|
+
metric.clear if should_clear?
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
@metric_timers.each do |name, metric|
|
|
186
|
+
flush_rates event, name, metric
|
|
187
|
+
# These 4 values are not sliding, so they probably are not useful.
|
|
188
|
+
event["#{name}.min"] = metric.min
|
|
189
|
+
event["#{name}.max"] = metric.max
|
|
190
|
+
# timer's stddev currently returns variance, fix it.
|
|
191
|
+
event["#{name}.stddev"] = metric.stddev ** 0.5
|
|
192
|
+
event["#{name}.mean"] = metric.mean
|
|
193
|
+
|
|
194
|
+
@percentiles.each do |percentile|
|
|
195
|
+
event["#{name}.p#{percentile}"] = metric.snapshot.value(percentile / 100)
|
|
196
|
+
end
|
|
197
|
+
metric.clear if should_clear?
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
# Reset counter since metrics were flushed
|
|
201
|
+
@last_flush = 0
|
|
202
|
+
|
|
203
|
+
if should_clear?
|
|
204
|
+
#Reset counter since metrics were cleared
|
|
205
|
+
@last_clear = 0
|
|
206
|
+
initialize_metrics
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
filter_matched(event)
|
|
210
|
+
return [event]
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
private
|
|
214
|
+
def flush_rates(event, name, metric)
|
|
215
|
+
event["#{name}.count"] = metric.count
|
|
216
|
+
event["#{name}.rate_1m"] = metric.one_minute_rate if @rates.include? 1
|
|
217
|
+
event["#{name}.rate_5m"] = metric.five_minute_rate if @rates.include? 5
|
|
218
|
+
event["#{name}.rate_15m"] = metric.fifteen_minute_rate if @rates.include? 15
|
|
219
|
+
end
|
|
220
|
+
|
|
221
|
+
def initialize_metrics
|
|
222
|
+
@metric_meters = Hash.new { |h,k| h[k] = Metriks.meter metric_key(k) }
|
|
223
|
+
@metric_timers = Hash.new { |h,k| h[k] = Metriks.timer metric_key(k) }
|
|
224
|
+
end
|
|
225
|
+
|
|
226
|
+
def metric_key(key)
|
|
227
|
+
"#{@random_key_preffix}_#{key}"
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
def should_flush?
|
|
231
|
+
@last_flush >= @flush_interval && (@metric_meters.any? || @metric_timers.any?)
|
|
232
|
+
end
|
|
233
|
+
|
|
234
|
+
def should_clear?
|
|
235
|
+
@clear_interval > 0 && @last_clear >= @clear_interval
|
|
236
|
+
end
|
|
237
|
+
end # class LogStash::Filters::Metrics
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
# multiline filter
|
|
3
|
+
#
|
|
4
|
+
# This filter will collapse multiline messages into a single event.
|
|
5
|
+
#
|
|
6
|
+
|
|
7
|
+
require "logstash/filters/base"
|
|
8
|
+
require "logstash/namespace"
|
|
9
|
+
require "set"
|
|
10
|
+
|
|
11
|
+
# The multiline filter is for combining multiple events from a single source
|
|
12
|
+
# into the same event.
|
|
13
|
+
#
|
|
14
|
+
# The original goal of this filter was to allow joining of multi-line messages
|
|
15
|
+
# from files into a single event. For example - joining java exception and
|
|
16
|
+
# stacktrace messages into a single event.
|
|
17
|
+
#
|
|
18
|
+
# TODO(sissel): Document any issues?
|
|
19
|
+
# The config looks like this:
|
|
20
|
+
#
|
|
21
|
+
# filter {
|
|
22
|
+
# multiline {
|
|
23
|
+
# type => "type"
|
|
24
|
+
# pattern => "pattern, a regexp"
|
|
25
|
+
# negate => boolean
|
|
26
|
+
# what => "previous" or "next"
|
|
27
|
+
# }
|
|
28
|
+
# }
|
|
29
|
+
#
|
|
30
|
+
# The 'regexp' should match what you believe to be an indicator that
|
|
31
|
+
# the field is part of a multi-line event
|
|
32
|
+
#
|
|
33
|
+
# The 'what' must be "previous" or "next" and indicates the relation
|
|
34
|
+
# to the multi-line event.
|
|
35
|
+
#
|
|
36
|
+
# The 'negate' can be "true" or "false" (defaults false). If true, a
|
|
37
|
+
# message not matching the pattern will constitute a match of the multiline
|
|
38
|
+
# filter and the what will be applied. (vice-versa is also true)
|
|
39
|
+
#
|
|
40
|
+
# For example, java stack traces are multiline and usually have the message
|
|
41
|
+
# starting at the far-left, then each subsequent line indented. Do this:
|
|
42
|
+
#
|
|
43
|
+
# filter {
|
|
44
|
+
# multiline {
|
|
45
|
+
# type => "somefiletype"
|
|
46
|
+
# pattern => "^\s"
|
|
47
|
+
# what => "previous"
|
|
48
|
+
# }
|
|
49
|
+
# }
|
|
50
|
+
#
|
|
51
|
+
# This says that any line starting with whitespace belongs to the previous line.
|
|
52
|
+
#
|
|
53
|
+
# Another example is C line continuations (backslash). Here's how to do that:
|
|
54
|
+
#
|
|
55
|
+
# filter {
|
|
56
|
+
# multiline {
|
|
57
|
+
# type => "somefiletype "
|
|
58
|
+
# pattern => "\\$"
|
|
59
|
+
# what => "next"
|
|
60
|
+
# }
|
|
61
|
+
# }
|
|
62
|
+
#
|
|
63
|
+
class LogStash::Filters::Multiline < LogStash::Filters::Base
|
|
64
|
+
|
|
65
|
+
config_name "multiline"
|
|
66
|
+
milestone 3
|
|
67
|
+
|
|
68
|
+
# The regular expression to match
|
|
69
|
+
config :pattern, :validate => :string, :required => true
|
|
70
|
+
|
|
71
|
+
# If the pattern matched, does event belong to the next or previous event?
|
|
72
|
+
config :what, :validate => ["previous", "next"], :required => true
|
|
73
|
+
|
|
74
|
+
# Negate the regexp pattern ('if not matched')
|
|
75
|
+
config :negate, :validate => :boolean, :default => false
|
|
76
|
+
|
|
77
|
+
# The stream identity is how the multiline filter determines which stream an
|
|
78
|
+
# event belongs. This is generally used for differentiating, say, events
|
|
79
|
+
# coming from multiple files in the same file input, or multiple connections
|
|
80
|
+
# coming from a tcp input.
|
|
81
|
+
#
|
|
82
|
+
# The default value here is usually what you want, but there are some cases
|
|
83
|
+
# where you want to change it. One such example is if you are using a tcp
|
|
84
|
+
# input with only one client connecting at any time. If that client
|
|
85
|
+
# reconnects (due to error or client restart), then logstash will identify
|
|
86
|
+
# the new connection as a new stream and break any multiline goodness that
|
|
87
|
+
# may have occurred between the old and new connection. To solve this use
|
|
88
|
+
# case, you can use "%{@source_host}.%{@type}" instead.
|
|
89
|
+
config :stream_identity , :validate => :string, :default => "%{host}.%{path}.%{type}"
|
|
90
|
+
|
|
91
|
+
# logstash ships by default with a bunch of patterns, so you don't
|
|
92
|
+
# necessarily need to define this yourself unless you are adding additional
|
|
93
|
+
# patterns.
|
|
94
|
+
#
|
|
95
|
+
# Pattern files are plain text with format:
|
|
96
|
+
#
|
|
97
|
+
# NAME PATTERN
|
|
98
|
+
#
|
|
99
|
+
# For example:
|
|
100
|
+
#
|
|
101
|
+
# NUMBER \d+
|
|
102
|
+
config :patterns_dir, :validate => :array, :default => []
|
|
103
|
+
|
|
104
|
+
# Detect if we are running from a jarfile, pick the right path.
|
|
105
|
+
@@patterns_path = Set.new
|
|
106
|
+
if __FILE__ =~ /file:\/.*\.jar!.*/
|
|
107
|
+
@@patterns_path += ["#{File.dirname(__FILE__)}/../../patterns/*"]
|
|
108
|
+
else
|
|
109
|
+
@@patterns_path += ["#{File.dirname(__FILE__)}/../../../patterns/*"]
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
public
|
|
113
|
+
def initialize(config = {})
|
|
114
|
+
super
|
|
115
|
+
|
|
116
|
+
@threadsafe = false
|
|
117
|
+
|
|
118
|
+
# This filter needs to keep state.
|
|
119
|
+
@types = Hash.new { |h,k| h[k] = [] }
|
|
120
|
+
@pending = Hash.new
|
|
121
|
+
end # def initialize
|
|
122
|
+
|
|
123
|
+
public
|
|
124
|
+
def register
|
|
125
|
+
require "grok-pure" # rubygem 'jls-grok'
|
|
126
|
+
|
|
127
|
+
@grok = Grok.new
|
|
128
|
+
|
|
129
|
+
@patterns_dir = @@patterns_path.to_a + @patterns_dir
|
|
130
|
+
@patterns_dir.each do |path|
|
|
131
|
+
# Can't read relative paths from jars, try to normalize away '../'
|
|
132
|
+
while path =~ /file:\/.*\.jar!.*\/\.\.\//
|
|
133
|
+
# replace /foo/bar/../baz => /foo/baz
|
|
134
|
+
path = path.gsub(/[^\/]+\/\.\.\//, "")
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
if File.directory?(path)
|
|
138
|
+
path = File.join(path, "*")
|
|
139
|
+
end
|
|
140
|
+
|
|
141
|
+
Dir.glob(path).each do |file|
|
|
142
|
+
@logger.info("Grok loading patterns from file", :path => file)
|
|
143
|
+
@grok.add_patterns_from_file(file)
|
|
144
|
+
end
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
@grok.compile(@pattern)
|
|
148
|
+
|
|
149
|
+
@logger.debug("Registered multiline plugin", :type => @type, :config => @config)
|
|
150
|
+
end # def register
|
|
151
|
+
|
|
152
|
+
public
|
|
153
|
+
def filter(event)
|
|
154
|
+
return unless filter?(event)
|
|
155
|
+
|
|
156
|
+
if event["message"].is_a?(Array)
|
|
157
|
+
match = @grok.match(event["message"].first)
|
|
158
|
+
else
|
|
159
|
+
match = @grok.match(event["message"])
|
|
160
|
+
end
|
|
161
|
+
key = event.sprintf(@stream_identity)
|
|
162
|
+
pending = @pending[key]
|
|
163
|
+
|
|
164
|
+
@logger.debug("Multiline", :pattern => @pattern, :message => event["message"],
|
|
165
|
+
:match => match, :negate => @negate)
|
|
166
|
+
|
|
167
|
+
# Add negate option
|
|
168
|
+
match = (match and !@negate) || (!match and @negate)
|
|
169
|
+
|
|
170
|
+
case @what
|
|
171
|
+
when "previous"
|
|
172
|
+
if match
|
|
173
|
+
event.tag "multiline"
|
|
174
|
+
# previous previous line is part of this event.
|
|
175
|
+
# append it to the event and cancel it
|
|
176
|
+
if pending
|
|
177
|
+
pending.append(event)
|
|
178
|
+
else
|
|
179
|
+
@pending[key] = event
|
|
180
|
+
end
|
|
181
|
+
event.cancel
|
|
182
|
+
else
|
|
183
|
+
# this line is not part of the previous event
|
|
184
|
+
# if we have a pending event, it's done, send it.
|
|
185
|
+
# put the current event into pending
|
|
186
|
+
if pending
|
|
187
|
+
tmp = event.to_hash
|
|
188
|
+
event.overwrite(pending)
|
|
189
|
+
@pending[key] = LogStash::Event.new(tmp)
|
|
190
|
+
else
|
|
191
|
+
@pending[key] = event
|
|
192
|
+
event.cancel
|
|
193
|
+
end # if/else pending
|
|
194
|
+
end # if/else match
|
|
195
|
+
when "next"
|
|
196
|
+
if match
|
|
197
|
+
event.tag "multiline"
|
|
198
|
+
# this line is part of a multiline event, the next
|
|
199
|
+
# line will be part, too, put it into pending.
|
|
200
|
+
if pending
|
|
201
|
+
pending.append(event)
|
|
202
|
+
else
|
|
203
|
+
@pending[key] = event
|
|
204
|
+
end
|
|
205
|
+
event.cancel
|
|
206
|
+
else
|
|
207
|
+
# if we have something in pending, join it with this message
|
|
208
|
+
# and send it. otherwise, this is a new message and not part of
|
|
209
|
+
# multiline, send it.
|
|
210
|
+
if pending
|
|
211
|
+
pending.append(event)
|
|
212
|
+
event.overwrite(pending.to_hash)
|
|
213
|
+
@pending.delete(key)
|
|
214
|
+
end
|
|
215
|
+
end # if/else match
|
|
216
|
+
else
|
|
217
|
+
# TODO(sissel): Make this part of the 'register' method.
|
|
218
|
+
@logger.warn("Unknown multiline 'what' value.", :what => @what)
|
|
219
|
+
end # case @what
|
|
220
|
+
|
|
221
|
+
if !event.cancelled?
|
|
222
|
+
event["message"] = event["message"].join("\n") if event["message"].is_a?(Array)
|
|
223
|
+
event["@timestamp"] = event["@timestamp"].first if event["@timestamp"].is_a?(Array)
|
|
224
|
+
filter_matched(event) if match
|
|
225
|
+
end
|
|
226
|
+
end # def filter
|
|
227
|
+
|
|
228
|
+
# Flush any pending messages. This is generally used for unit testing only.
|
|
229
|
+
#
|
|
230
|
+
# Note: flush is disabled now; it is preferable to use the multiline codec.
|
|
231
|
+
public
|
|
232
|
+
def __flush
|
|
233
|
+
events = []
|
|
234
|
+
@pending.each do |key, value|
|
|
235
|
+
value.uncancel
|
|
236
|
+
events << value
|
|
237
|
+
end
|
|
238
|
+
@pending.clear
|
|
239
|
+
return events
|
|
240
|
+
end # def flush
|
|
241
|
+
end # class LogStash::Filters::Multiline
|