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,173 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
require "logstash/filters/base"
|
|
3
|
+
require "logstash/namespace"
|
|
4
|
+
|
|
5
|
+
# The alter filter allows you to do general alterations to fields
|
|
6
|
+
# that are not included in the normal mutate filter.
|
|
7
|
+
#
|
|
8
|
+
#
|
|
9
|
+
# NOTE: The functionality provided by this plugin is likely to
|
|
10
|
+
# be merged into the 'mutate' filter in future versions.
|
|
11
|
+
class LogStash::Filters::Alter < LogStash::Filters::Base
|
|
12
|
+
config_name "alter"
|
|
13
|
+
milestone 1
|
|
14
|
+
|
|
15
|
+
# Change the content of the field to the specified value
|
|
16
|
+
# if the actual content is equal to the expected one.
|
|
17
|
+
#
|
|
18
|
+
# Example:
|
|
19
|
+
#
|
|
20
|
+
# filter {
|
|
21
|
+
# alter {
|
|
22
|
+
# condrewrite => [
|
|
23
|
+
# "field_name", "expected_value", "new_value"
|
|
24
|
+
# "field_name2", "expected_value2, "new_value2"
|
|
25
|
+
# ....
|
|
26
|
+
# ]
|
|
27
|
+
# }
|
|
28
|
+
# }
|
|
29
|
+
config :condrewrite, :validate => :array
|
|
30
|
+
|
|
31
|
+
# Change the content of the field to the specified value
|
|
32
|
+
# if the content of another field is equal to the expected one.
|
|
33
|
+
#
|
|
34
|
+
# Example:
|
|
35
|
+
#
|
|
36
|
+
# filter {
|
|
37
|
+
# alter {
|
|
38
|
+
# condrewriteother => [
|
|
39
|
+
# "field_name", "expected_value", "field_name_to_change", "value",
|
|
40
|
+
# "field_name2", "expected_value2, "field_name_to_change2", "value2",
|
|
41
|
+
# ....
|
|
42
|
+
# ]
|
|
43
|
+
# }
|
|
44
|
+
# }
|
|
45
|
+
config :condrewriteother, :validate => :array
|
|
46
|
+
|
|
47
|
+
# Sets the value of field_name to the first nonnull expression among its arguments.
|
|
48
|
+
#
|
|
49
|
+
# Example:
|
|
50
|
+
#
|
|
51
|
+
# filter {
|
|
52
|
+
# alter {
|
|
53
|
+
# coalesce => [
|
|
54
|
+
# "field_name", "value1", "value2", "value3", ...
|
|
55
|
+
# ]
|
|
56
|
+
# }
|
|
57
|
+
# }
|
|
58
|
+
config :coalesce, :validate => :array
|
|
59
|
+
|
|
60
|
+
public
|
|
61
|
+
def register
|
|
62
|
+
@condrewrite_parsed = []
|
|
63
|
+
@condrewrite.nil? or @condrewrite.each_slice(3) do |field, expected, replacement|
|
|
64
|
+
if [field, expected, replacement].any? {|n| n.nil?}
|
|
65
|
+
@logger.error("Invalid condrewrte configuration. condrewrite has to define 3 elements per config entry", :field => field, :expected => expected, :replacement => replacement)
|
|
66
|
+
raise "Bad configuration, aborting."
|
|
67
|
+
end
|
|
68
|
+
@condrewrite_parsed << {
|
|
69
|
+
:field => field,
|
|
70
|
+
:expected => expected,
|
|
71
|
+
:replacement => replacement
|
|
72
|
+
}
|
|
73
|
+
end # condrewrite
|
|
74
|
+
|
|
75
|
+
@condrewriteother_parsed = []
|
|
76
|
+
@condrewriteother.nil? or @condrewriteother.each_slice(4) do |field, expected, replacement_field, replacement_value|
|
|
77
|
+
if [field, expected, replacement_field, replacement_value].any? {|n| n.nil?}
|
|
78
|
+
@logger.error("Invalid condrewrteother configuration. condrewriteother has to define 4 elements per config entry", :field => field, :expected => expected, :replacement_field => replacement_field, :replacement_value => replacement_value)
|
|
79
|
+
raise "Bad configuration, aborting."
|
|
80
|
+
end
|
|
81
|
+
@condrewriteother_parsed << {
|
|
82
|
+
:field => field,
|
|
83
|
+
:expected => expected,
|
|
84
|
+
:replacement_field => replacement_field,
|
|
85
|
+
:replacement_value => replacement_value
|
|
86
|
+
}
|
|
87
|
+
end # condrewriteother
|
|
88
|
+
|
|
89
|
+
@coalesce_parsed = []
|
|
90
|
+
@coalesce.nil? or if not @coalesce.is_a?(Array) or @coalesce.length < 2
|
|
91
|
+
@logger.error("Invalid coalesce configuration. coalesce has to define one Array of at least 2 elements")
|
|
92
|
+
raise "Bad configuration, aborting."
|
|
93
|
+
else
|
|
94
|
+
@coalesce_parsed << {
|
|
95
|
+
:field => @coalesce.slice!(0),
|
|
96
|
+
:subst_array => @coalesce
|
|
97
|
+
}
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
end # def register
|
|
102
|
+
|
|
103
|
+
public
|
|
104
|
+
def filter(event)
|
|
105
|
+
return unless filter?(event)
|
|
106
|
+
|
|
107
|
+
condrewrite(event) if @condrewrite
|
|
108
|
+
condrewriteother(event) if @condrewriteother
|
|
109
|
+
coalesce(event) if @coalesce
|
|
110
|
+
|
|
111
|
+
filter_matched(event)
|
|
112
|
+
end # def filter
|
|
113
|
+
|
|
114
|
+
private
|
|
115
|
+
def condrewrite(event)
|
|
116
|
+
@condrewrite_parsed.each do |config|
|
|
117
|
+
field = config[:field]
|
|
118
|
+
expected = config[:expected]
|
|
119
|
+
replacement = config[:replacement]
|
|
120
|
+
|
|
121
|
+
if event[field].is_a?(Array)
|
|
122
|
+
event[field] = event[field].map do |v|
|
|
123
|
+
if v == event.sprintf(expected)
|
|
124
|
+
v = event.sprintf(replacement)
|
|
125
|
+
else
|
|
126
|
+
v
|
|
127
|
+
end
|
|
128
|
+
end
|
|
129
|
+
else
|
|
130
|
+
if event[field] == event.sprintf(expected)
|
|
131
|
+
event[field] = event.sprintf(replacement)
|
|
132
|
+
end
|
|
133
|
+
end
|
|
134
|
+
end # @condrewrite_parsed.each
|
|
135
|
+
end # def condrewrite
|
|
136
|
+
|
|
137
|
+
private
|
|
138
|
+
def condrewriteother(event)
|
|
139
|
+
@condrewriteother_parsed.each do |config|
|
|
140
|
+
field = config[:field]
|
|
141
|
+
expected = config[:expected]
|
|
142
|
+
replacement_field = config[:replacement_field]
|
|
143
|
+
replacement_value = config[:replacement_value]
|
|
144
|
+
|
|
145
|
+
if event[field].is_a?(Array)
|
|
146
|
+
event[field].each do |v|
|
|
147
|
+
if v == event.sprintf(expected)
|
|
148
|
+
event[replacement_field] = event.sprintf(replacement_value)
|
|
149
|
+
end
|
|
150
|
+
end
|
|
151
|
+
else
|
|
152
|
+
if event[field] == event.sprintf(expected)
|
|
153
|
+
event[replacement_field] = event.sprintf(replacement_value)
|
|
154
|
+
end
|
|
155
|
+
end
|
|
156
|
+
end # @condrewriteother_parsed.each
|
|
157
|
+
end # def condrewriteother
|
|
158
|
+
|
|
159
|
+
private
|
|
160
|
+
def coalesce(event)
|
|
161
|
+
@coalesce_parsed.each do |config|
|
|
162
|
+
field = config[:field]
|
|
163
|
+
subst_array = config[:subst_array]
|
|
164
|
+
|
|
165
|
+
substitution_parsed = subst_array.map { |x| event.sprintf(x) }
|
|
166
|
+
not_nul_index = substitution_parsed.find_index { |x| not x.nil? and not x.eql?("nil") and not (not x.index("%").nil? && x.match(/%\{[^}]\}/).nil?) }
|
|
167
|
+
if not not_nul_index.nil?
|
|
168
|
+
event[field] = substitution_parsed[not_nul_index]
|
|
169
|
+
end
|
|
170
|
+
end # @coalesce_parsed.each
|
|
171
|
+
end # def coalesce
|
|
172
|
+
|
|
173
|
+
end # class LogStash::Filters::Alter
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
require "logstash/filters/base"
|
|
3
|
+
require "logstash/namespace"
|
|
4
|
+
|
|
5
|
+
# Anonymize fields using by replacing values with a consistent hash.
|
|
6
|
+
class LogStash::Filters::Anonymize < LogStash::Filters::Base
|
|
7
|
+
config_name "anonymize"
|
|
8
|
+
milestone 1
|
|
9
|
+
|
|
10
|
+
# The fields to be anonymized
|
|
11
|
+
config :fields, :validate => :array, :required => true
|
|
12
|
+
|
|
13
|
+
# Hashing key
|
|
14
|
+
# When using MURMUR3 the key is ignored but must still be set.
|
|
15
|
+
# When using IPV4_NETWORK key is the subnet prefix lentgh
|
|
16
|
+
config :key, :validate => :string, :required => true
|
|
17
|
+
|
|
18
|
+
# digest/hash type
|
|
19
|
+
config :algorithm, :validate => ['SHA1', 'SHA256', 'SHA384', 'SHA512', 'MD5', "MURMUR3", "IPV4_NETWORK"], :required => true, :default => 'SHA1'
|
|
20
|
+
|
|
21
|
+
public
|
|
22
|
+
def register
|
|
23
|
+
# require any library and set the anonymize function
|
|
24
|
+
case @algorithm
|
|
25
|
+
when "IPV4_NETWORK"
|
|
26
|
+
require 'ipaddr'
|
|
27
|
+
class << self; alias_method :anonymize, :anonymize_ipv4_network; end
|
|
28
|
+
when "MURMUR3"
|
|
29
|
+
require "murmurhash3"
|
|
30
|
+
class << self; alias_method :anonymize, :anonymize_murmur3; end
|
|
31
|
+
else
|
|
32
|
+
require 'openssl'
|
|
33
|
+
class << self; alias_method :anonymize, :anonymize_openssl; end
|
|
34
|
+
end
|
|
35
|
+
end # def register
|
|
36
|
+
|
|
37
|
+
public
|
|
38
|
+
def filter(event)
|
|
39
|
+
return unless filter?(event)
|
|
40
|
+
@fields.each do |field|
|
|
41
|
+
next unless event.include?(field)
|
|
42
|
+
if event[field].is_a?(Array)
|
|
43
|
+
event[field] = event[field].collect { |v| anonymize(v) }
|
|
44
|
+
else
|
|
45
|
+
event[field] = anonymize(event[field])
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end # def filter
|
|
49
|
+
|
|
50
|
+
private
|
|
51
|
+
def anonymize_ipv4_network(ip_string)
|
|
52
|
+
IPAddr.new(ip_string).mask(@key.to_i).to_s
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def anonymize_openssl(data)
|
|
56
|
+
digest = algorithm()
|
|
57
|
+
OpenSSL::HMAC.hexdigest(digest, @key, data)
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
def anonymize_murmur3(value)
|
|
61
|
+
case value
|
|
62
|
+
when Fixnum
|
|
63
|
+
MurmurHash3::V32.int_hash(value)
|
|
64
|
+
when String
|
|
65
|
+
MurmurHash3::V32.str_hash(value)
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
def algorithm
|
|
70
|
+
|
|
71
|
+
case @algorithm
|
|
72
|
+
#when 'SHA'
|
|
73
|
+
#return OpenSSL::Digest::SHA.new
|
|
74
|
+
when 'SHA1'
|
|
75
|
+
return OpenSSL::Digest::SHA1.new
|
|
76
|
+
#when 'SHA224'
|
|
77
|
+
#return OpenSSL::Digest::SHA224.new
|
|
78
|
+
when 'SHA256'
|
|
79
|
+
return OpenSSL::Digest::SHA256.new
|
|
80
|
+
when 'SHA384'
|
|
81
|
+
return OpenSSL::Digest::SHA384.new
|
|
82
|
+
when 'SHA512'
|
|
83
|
+
return OpenSSL::Digest::SHA512.new
|
|
84
|
+
#when 'MD4'
|
|
85
|
+
#return OpenSSL::Digest::MD4.new
|
|
86
|
+
when 'MD5'
|
|
87
|
+
return OpenSSL::Digest::MD5.new
|
|
88
|
+
else
|
|
89
|
+
@logger.error("Unknown algorithm")
|
|
90
|
+
end
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
end # class LogStash::Filters::Anonymize
|
|
@@ -0,0 +1,190 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
require "logstash/namespace"
|
|
3
|
+
require "logstash/logging"
|
|
4
|
+
require "logstash/plugin"
|
|
5
|
+
require "logstash/config/mixin"
|
|
6
|
+
|
|
7
|
+
class LogStash::Filters::Base < LogStash::Plugin
|
|
8
|
+
include LogStash::Config::Mixin
|
|
9
|
+
|
|
10
|
+
config_name "filter"
|
|
11
|
+
|
|
12
|
+
# Note that all of the specified routing options (type,tags.exclude\_tags,include\_fields,exclude\_fields)
|
|
13
|
+
# must be met in order for the event to be handled by the filter.
|
|
14
|
+
|
|
15
|
+
# The type to act on. If a type is given, then this filter will only
|
|
16
|
+
# act on messages with the same type. See any input plugin's "type"
|
|
17
|
+
# attribute for more.
|
|
18
|
+
# Optional.
|
|
19
|
+
config :type, :validate => :string, :default => "", :deprecated => "You can achieve this same behavior with the new conditionals, like: `if [type] == \"sometype\" { %PLUGIN% { ... } }`."
|
|
20
|
+
|
|
21
|
+
# Only handle events with all/any (controlled by include\_any config option) of these tags.
|
|
22
|
+
# Optional.
|
|
23
|
+
config :tags, :validate => :array, :default => [], :deprecated => "You can achieve similar behavior with the new conditionals, like: `if \"sometag\" in [tags] { %PLUGIN% { ... } }`"
|
|
24
|
+
|
|
25
|
+
# Only handle events without all/any (controlled by exclude\_any config
|
|
26
|
+
# option) of these tags.
|
|
27
|
+
# Optional.
|
|
28
|
+
config :exclude_tags, :validate => :array, :default => [], :deprecated => "You can achieve similar behavior with the new conditionals, like: `if !(\"sometag\" in [tags]) { %PLUGIN% { ... } }`"
|
|
29
|
+
|
|
30
|
+
# If this filter is successful, add arbitrary tags to the event.
|
|
31
|
+
# Tags can be dynamic and include parts of the event using the %{field}
|
|
32
|
+
# syntax. Example:
|
|
33
|
+
#
|
|
34
|
+
# filter {
|
|
35
|
+
# %PLUGIN% {
|
|
36
|
+
# add_tag => [ "foo_%{somefield}" ]
|
|
37
|
+
# }
|
|
38
|
+
# }
|
|
39
|
+
#
|
|
40
|
+
# If the event has field "somefield" == "hello" this filter, on success,
|
|
41
|
+
# would add a tag "foo_hello"
|
|
42
|
+
config :add_tag, :validate => :array, :default => []
|
|
43
|
+
|
|
44
|
+
# If this filter is successful, remove arbitrary tags from the event.
|
|
45
|
+
# Tags can be dynamic and include parts of the event using the %{field}
|
|
46
|
+
# syntax. Example:
|
|
47
|
+
#
|
|
48
|
+
# filter {
|
|
49
|
+
# %PLUGIN% {
|
|
50
|
+
# remove_tag => [ "foo_%{somefield}" ]
|
|
51
|
+
# }
|
|
52
|
+
# }
|
|
53
|
+
#
|
|
54
|
+
# If the event has field "somefield" == "hello" this filter, on success,
|
|
55
|
+
# would remove the tag "foo_hello" if it is present
|
|
56
|
+
config :remove_tag, :validate => :array, :default => []
|
|
57
|
+
|
|
58
|
+
# If this filter is successful, add any arbitrary fields to this event.
|
|
59
|
+
# Tags can be dynamic and include parts of the event using the %{field}
|
|
60
|
+
# Example:
|
|
61
|
+
#
|
|
62
|
+
# filter {
|
|
63
|
+
# %PLUGIN% {
|
|
64
|
+
# add_field => [ "foo_%{somefield}", "Hello world, from %{host}" ]
|
|
65
|
+
# }
|
|
66
|
+
# }
|
|
67
|
+
#
|
|
68
|
+
# If the event has field "somefield" == "hello" this filter, on success,
|
|
69
|
+
# would add field "foo_hello" if it is present, with the
|
|
70
|
+
# value above and the %{host} piece replaced with that value from the
|
|
71
|
+
# event.
|
|
72
|
+
config :add_field, :validate => :hash, :default => {}
|
|
73
|
+
|
|
74
|
+
# If this filter is successful, remove arbitrary fields from this event.
|
|
75
|
+
# Fields names can be dynamic and include parts of the event using the %{field}
|
|
76
|
+
# Example:
|
|
77
|
+
#
|
|
78
|
+
# filter {
|
|
79
|
+
# %PLUGIN% {
|
|
80
|
+
# remove_field => [ "foo_%{somefield}" ]
|
|
81
|
+
# }
|
|
82
|
+
# }
|
|
83
|
+
#
|
|
84
|
+
# If the event has field "somefield" == "hello" this filter, on success,
|
|
85
|
+
# would remove the field with name "foo_hello" if it is present
|
|
86
|
+
config :remove_field, :validate => :array, :default => []
|
|
87
|
+
|
|
88
|
+
RESERVED = ["type", "tags", "exclude_tags", "include_fields", "exclude_fields", "add_tag", "remove_tag", "add_field", "remove_field", "include_any", "exclude_any"]
|
|
89
|
+
|
|
90
|
+
public
|
|
91
|
+
def initialize(params)
|
|
92
|
+
super
|
|
93
|
+
config_init(params)
|
|
94
|
+
@threadsafe = true
|
|
95
|
+
end # def initialize
|
|
96
|
+
|
|
97
|
+
public
|
|
98
|
+
def register
|
|
99
|
+
raise "#{self.class}#register must be overidden"
|
|
100
|
+
end # def register
|
|
101
|
+
|
|
102
|
+
public
|
|
103
|
+
def filter(event)
|
|
104
|
+
raise "#{self.class}#filter must be overidden"
|
|
105
|
+
end # def filter
|
|
106
|
+
|
|
107
|
+
public
|
|
108
|
+
def execute(event, &block)
|
|
109
|
+
filter(event, &block)
|
|
110
|
+
end # def execute
|
|
111
|
+
|
|
112
|
+
public
|
|
113
|
+
def threadsafe?
|
|
114
|
+
@threadsafe
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
# a filter instance should call filter_matched from filter if the event
|
|
118
|
+
# matches the filter's conditions (right type, etc)
|
|
119
|
+
protected
|
|
120
|
+
def filter_matched(event)
|
|
121
|
+
@add_field.each do |field, value|
|
|
122
|
+
field = event.sprintf(field)
|
|
123
|
+
value = [value] if !value.is_a?(Array)
|
|
124
|
+
value.each do |v|
|
|
125
|
+
v = event.sprintf(v)
|
|
126
|
+
if event.include?(field)
|
|
127
|
+
event[field] = [event[field]] if !event[field].is_a?(Array)
|
|
128
|
+
event[field] << v
|
|
129
|
+
else
|
|
130
|
+
event[field] = v
|
|
131
|
+
end
|
|
132
|
+
@logger.debug? and @logger.debug("filters/#{self.class.name}: adding value to field",
|
|
133
|
+
:field => field, :value => value)
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
@remove_field.each do |field|
|
|
138
|
+
field = event.sprintf(field)
|
|
139
|
+
@logger.debug? and @logger.debug("filters/#{self.class.name}: removing field",
|
|
140
|
+
:field => field)
|
|
141
|
+
event.remove(field)
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
@add_tag.each do |tag|
|
|
145
|
+
tag = event.sprintf(tag)
|
|
146
|
+
@logger.debug? and @logger.debug("filters/#{self.class.name}: adding tag",
|
|
147
|
+
:tag => tag)
|
|
148
|
+
(event["tags"] ||= []) << tag
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
@remove_tag.each do |tag|
|
|
152
|
+
break if event["tags"].nil?
|
|
153
|
+
tag = event.sprintf(tag)
|
|
154
|
+
@logger.debug? and @logger.debug("filters/#{self.class.name}: removing tag",
|
|
155
|
+
:tag => tag)
|
|
156
|
+
event["tags"].delete(tag)
|
|
157
|
+
end
|
|
158
|
+
end # def filter_matched
|
|
159
|
+
|
|
160
|
+
protected
|
|
161
|
+
def filter?(event)
|
|
162
|
+
if !@type.empty?
|
|
163
|
+
if event["type"] != @type
|
|
164
|
+
@logger.debug? and @logger.debug(["filters/#{self.class.name}: Skipping event because type doesn't match #{@type}", event])
|
|
165
|
+
return false
|
|
166
|
+
end
|
|
167
|
+
end
|
|
168
|
+
|
|
169
|
+
if !@tags.empty?
|
|
170
|
+
# this filter has only works on events with certain tags,
|
|
171
|
+
# and this event has no tags.
|
|
172
|
+
return false if !event["tags"]
|
|
173
|
+
|
|
174
|
+
# Is @tags a subset of the event's tags? If not, skip it.
|
|
175
|
+
if (event["tags"] & @tags).size != @tags.size
|
|
176
|
+
@logger.debug(["filters/#{self.class.name}: Skipping event because tags don't match #{@tags.inspect}", event])
|
|
177
|
+
return false
|
|
178
|
+
end
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
if !@exclude_tags.empty? && event["tags"]
|
|
182
|
+
if (diff_tags = (event["tags"] & @exclude_tags)).size != 0
|
|
183
|
+
@logger.debug(["filters/#{self.class.name}: Skipping event because tags contains excluded tags: #{diff_tags.inspect}", event])
|
|
184
|
+
return false
|
|
185
|
+
end
|
|
186
|
+
end
|
|
187
|
+
|
|
188
|
+
return true
|
|
189
|
+
end
|
|
190
|
+
end # class LogStash::Filters::Base
|