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,22 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
require "logstash/codecs/base"
|
|
3
|
+
require "logstash/codecs/spool"
|
|
4
|
+
|
|
5
|
+
# This is the base class for logstash codecs.
|
|
6
|
+
class LogStash::Codecs::JsonSpooler < LogStash::Codecs::Spool
|
|
7
|
+
config_name "json_spooler"
|
|
8
|
+
milestone 1
|
|
9
|
+
|
|
10
|
+
public
|
|
11
|
+
def decode(data)
|
|
12
|
+
super(JSON.parse(data.force_encoding("UTF-8"))) do |event|
|
|
13
|
+
yield event
|
|
14
|
+
end
|
|
15
|
+
end # def decode
|
|
16
|
+
|
|
17
|
+
public
|
|
18
|
+
def encode(data)
|
|
19
|
+
super(data)
|
|
20
|
+
end # def encode
|
|
21
|
+
|
|
22
|
+
end # class LogStash::Codecs::Json
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
require "logstash/codecs/base"
|
|
3
|
+
require "logstash/util/charset"
|
|
4
|
+
|
|
5
|
+
# Line-oriented text data.
|
|
6
|
+
#
|
|
7
|
+
# Decoding behavior: Only whole line events will be emitted.
|
|
8
|
+
#
|
|
9
|
+
# Encoding behavior: Each event will be emitted with a trailing newline.
|
|
10
|
+
class LogStash::Codecs::Line < LogStash::Codecs::Base
|
|
11
|
+
config_name "line"
|
|
12
|
+
milestone 3
|
|
13
|
+
|
|
14
|
+
# Set the desired text format for encoding.
|
|
15
|
+
config :format, :validate => :string
|
|
16
|
+
|
|
17
|
+
# The character encoding used in this input. Examples include "UTF-8"
|
|
18
|
+
# and "cp1252"
|
|
19
|
+
#
|
|
20
|
+
# This setting is useful if your log files are in Latin-1 (aka cp1252)
|
|
21
|
+
# or in another character set other than UTF-8.
|
|
22
|
+
#
|
|
23
|
+
# This only affects "plain" format logs since json is UTF-8 already.
|
|
24
|
+
config :charset, :validate => ::Encoding.name_list, :default => "UTF-8"
|
|
25
|
+
|
|
26
|
+
public
|
|
27
|
+
def register
|
|
28
|
+
require "logstash/util/buftok"
|
|
29
|
+
@buffer = FileWatch::BufferedTokenizer.new
|
|
30
|
+
@converter = LogStash::Util::Charset.new(@charset)
|
|
31
|
+
@converter.logger = @logger
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
public
|
|
35
|
+
def decode(data)
|
|
36
|
+
@buffer.extract(data).each do |line|
|
|
37
|
+
yield LogStash::Event.new("message" => @converter.convert(line))
|
|
38
|
+
end
|
|
39
|
+
end # def decode
|
|
40
|
+
|
|
41
|
+
public
|
|
42
|
+
def flush(&block)
|
|
43
|
+
remainder = @buffer.flush
|
|
44
|
+
if !remainder.empty?
|
|
45
|
+
block.call(LogStash::Event.new({"message" => remainder}))
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
public
|
|
50
|
+
def encode(data)
|
|
51
|
+
if data.is_a? LogStash::Event and @format
|
|
52
|
+
@on_event.call(data.sprintf(@format) + "\n")
|
|
53
|
+
else
|
|
54
|
+
@on_event.call(data.to_s + "\n")
|
|
55
|
+
end
|
|
56
|
+
end # def encode
|
|
57
|
+
|
|
58
|
+
end # class LogStash::Codecs::Plain
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
require "logstash/codecs/base"
|
|
3
|
+
|
|
4
|
+
class LogStash::Codecs::Msgpack < LogStash::Codecs::Base
|
|
5
|
+
config_name "msgpack"
|
|
6
|
+
|
|
7
|
+
milestone 1
|
|
8
|
+
|
|
9
|
+
config :format, :validate => :string, :default => nil
|
|
10
|
+
|
|
11
|
+
public
|
|
12
|
+
def register
|
|
13
|
+
require "msgpack"
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
public
|
|
17
|
+
def decode(data)
|
|
18
|
+
begin
|
|
19
|
+
# Msgpack does not care about UTF-8
|
|
20
|
+
event = LogStash::Event.new(MessagePack.unpack(data))
|
|
21
|
+
event["@timestamp"] = Time.at(event["@timestamp"]).utc if event["@timestamp"].is_a? Float
|
|
22
|
+
event["tags"] ||= []
|
|
23
|
+
if @format
|
|
24
|
+
event["message"] ||= event.sprintf(@format)
|
|
25
|
+
end
|
|
26
|
+
rescue => e
|
|
27
|
+
# Treat as plain text and try to do the best we can with it?
|
|
28
|
+
@logger.warn("Trouble parsing msgpack input, falling back to plain text",
|
|
29
|
+
:input => data, :exception => e)
|
|
30
|
+
event["message"] = data
|
|
31
|
+
event["tags"] ||= []
|
|
32
|
+
event["tags"] << "_msgpackparsefailure"
|
|
33
|
+
end
|
|
34
|
+
yield event
|
|
35
|
+
end # def decode
|
|
36
|
+
|
|
37
|
+
public
|
|
38
|
+
def encode(event)
|
|
39
|
+
event["@timestamp"] = event["@timestamp"].to_f
|
|
40
|
+
@on_event.call event.to_hash.to_msgpack
|
|
41
|
+
end # def encode
|
|
42
|
+
|
|
43
|
+
end # class LogStash::Codecs::Msgpack
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
require "logstash/codecs/base"
|
|
3
|
+
|
|
4
|
+
# The multiline codec is for taking line-oriented text and merging them into a
|
|
5
|
+
# single event.
|
|
6
|
+
#
|
|
7
|
+
# The original goal of this codec was to allow joining of multi-line messages
|
|
8
|
+
# from files into a single event. For example - joining java exception and
|
|
9
|
+
# stacktrace messages into a single event.
|
|
10
|
+
#
|
|
11
|
+
# The config looks like this:
|
|
12
|
+
#
|
|
13
|
+
# input {
|
|
14
|
+
# stdin {
|
|
15
|
+
# codec => multiline {
|
|
16
|
+
# pattern => "pattern, a regexp"
|
|
17
|
+
# negate => true or false
|
|
18
|
+
# what => "previous" or "next"
|
|
19
|
+
# }
|
|
20
|
+
# }
|
|
21
|
+
# }
|
|
22
|
+
#
|
|
23
|
+
# The 'pattern' should match what you believe to be an indicator that the field
|
|
24
|
+
# is part of a multi-line event.
|
|
25
|
+
#
|
|
26
|
+
# The 'what' must be "previous" or "next" and indicates the relation
|
|
27
|
+
# to the multi-line event.
|
|
28
|
+
#
|
|
29
|
+
# The 'negate' can be "true" or "false" (defaults false). If true, a
|
|
30
|
+
# message not matching the pattern will constitute a match of the multiline
|
|
31
|
+
# filter and the what will be applied. (vice-versa is also true)
|
|
32
|
+
#
|
|
33
|
+
# For example, java stack traces are multiline and usually have the message
|
|
34
|
+
# starting at the far-left, then each subsequent line indented. Do this:
|
|
35
|
+
#
|
|
36
|
+
# input {
|
|
37
|
+
# stdin {
|
|
38
|
+
# codec => multiline {
|
|
39
|
+
# pattern => "^\s"
|
|
40
|
+
# what => "previous"
|
|
41
|
+
# }
|
|
42
|
+
# }
|
|
43
|
+
# }
|
|
44
|
+
#
|
|
45
|
+
# This says that any line starting with whitespace belongs to the previous line.
|
|
46
|
+
#
|
|
47
|
+
# Another example is to merge lines not starting with a date up to the previous
|
|
48
|
+
# line..
|
|
49
|
+
#
|
|
50
|
+
# input {
|
|
51
|
+
# file {
|
|
52
|
+
# path => "/var/log/someapp.log"
|
|
53
|
+
# codec => multiline {
|
|
54
|
+
# # Grok pattern names are valid! :)
|
|
55
|
+
# pattern => "^%{TIMESTAMP_ISO8601} "
|
|
56
|
+
# negate => true
|
|
57
|
+
# what => previous
|
|
58
|
+
# }
|
|
59
|
+
# }
|
|
60
|
+
# }
|
|
61
|
+
#
|
|
62
|
+
# This is the base class for logstash codecs.
|
|
63
|
+
class LogStash::Codecs::Multiline < LogStash::Codecs::Base
|
|
64
|
+
config_name "multiline"
|
|
65
|
+
milestone 3
|
|
66
|
+
|
|
67
|
+
# The regular expression to match
|
|
68
|
+
config :pattern, :validate => :string, :required => true
|
|
69
|
+
|
|
70
|
+
# If the pattern matched, does event belong to the next or previous event?
|
|
71
|
+
config :what, :validate => ["previous", "next"], :required => true
|
|
72
|
+
|
|
73
|
+
# Negate the regexp pattern ('if not matched')
|
|
74
|
+
config :negate, :validate => :boolean, :default => false
|
|
75
|
+
|
|
76
|
+
# logstash ships by default with a bunch of patterns, so you don't
|
|
77
|
+
# necessarily need to define this yourself unless you are adding additional
|
|
78
|
+
# patterns.
|
|
79
|
+
#
|
|
80
|
+
# Pattern files are plain text with format:
|
|
81
|
+
#
|
|
82
|
+
# NAME PATTERN
|
|
83
|
+
#
|
|
84
|
+
# For example:
|
|
85
|
+
#
|
|
86
|
+
# NUMBER \d+
|
|
87
|
+
config :patterns_dir, :validate => :array, :default => []
|
|
88
|
+
|
|
89
|
+
# The character encoding used in this input. Examples include "UTF-8"
|
|
90
|
+
# and "cp1252"
|
|
91
|
+
#
|
|
92
|
+
# This setting is useful if your log files are in Latin-1 (aka cp1252)
|
|
93
|
+
# or in another character set other than UTF-8.
|
|
94
|
+
#
|
|
95
|
+
# This only affects "plain" format logs since json is UTF-8 already.
|
|
96
|
+
config :charset, :validate => ::Encoding.name_list, :default => "UTF-8"
|
|
97
|
+
|
|
98
|
+
# Tag multiline events with a given tag. This tag will only be added
|
|
99
|
+
# to events that actually have multiple lines in them.
|
|
100
|
+
config :multiline_tag, :validate => :string, :default => "multiline"
|
|
101
|
+
|
|
102
|
+
public
|
|
103
|
+
def register
|
|
104
|
+
require "grok-pure" # rubygem 'jls-grok'
|
|
105
|
+
# Detect if we are running from a jarfile, pick the right path.
|
|
106
|
+
patterns_path = []
|
|
107
|
+
if __FILE__ =~ /file:\/.*\.jar!.*/
|
|
108
|
+
patterns_path += ["#{File.dirname(__FILE__)}/../../patterns/*"]
|
|
109
|
+
else
|
|
110
|
+
patterns_path += ["#{File.dirname(__FILE__)}/../../../patterns/*"]
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
@grok = Grok.new
|
|
114
|
+
|
|
115
|
+
@patterns_dir = patterns_path.to_a + @patterns_dir
|
|
116
|
+
@patterns_dir.each do |path|
|
|
117
|
+
# Can't read relative paths from jars, try to normalize away '../'
|
|
118
|
+
while path =~ /file:\/.*\.jar!.*\/\.\.\//
|
|
119
|
+
# replace /foo/bar/../baz => /foo/baz
|
|
120
|
+
path = path.gsub(/[^\/]+\/\.\.\//, "")
|
|
121
|
+
end
|
|
122
|
+
|
|
123
|
+
if File.directory?(path)
|
|
124
|
+
path = File.join(path, "*")
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
Dir.glob(path).each do |file|
|
|
128
|
+
@logger.info("Grok loading patterns from file", :path => file)
|
|
129
|
+
@grok.add_patterns_from_file(file)
|
|
130
|
+
end
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
@grok.compile(@pattern)
|
|
134
|
+
@logger.debug("Registered multiline plugin", :type => @type, :config => @config)
|
|
135
|
+
|
|
136
|
+
@buffer = []
|
|
137
|
+
@handler = method("do_#{@what}".to_sym)
|
|
138
|
+
end # def register
|
|
139
|
+
|
|
140
|
+
public
|
|
141
|
+
def decode(text, &block)
|
|
142
|
+
text.force_encoding(@charset)
|
|
143
|
+
if @charset != "UTF-8"
|
|
144
|
+
# Convert to UTF-8 if not in that character set.
|
|
145
|
+
text = text.encode("UTF-8", :invalid => :replace, :undef => :replace)
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
match = @grok.match(text)
|
|
149
|
+
@logger.debug("Multiline", :pattern => @pattern, :text => text,
|
|
150
|
+
:match => !match.nil?, :negate => @negate)
|
|
151
|
+
|
|
152
|
+
# Add negate option
|
|
153
|
+
match = (match and !@negate) || (!match and @negate)
|
|
154
|
+
@handler.call(text, match, &block)
|
|
155
|
+
end # def decode
|
|
156
|
+
|
|
157
|
+
def buffer(text)
|
|
158
|
+
@time = Time.now.utc if @buffer.empty?
|
|
159
|
+
@buffer << text
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
def flush(&block)
|
|
163
|
+
if @buffer.any?
|
|
164
|
+
event = LogStash::Event.new("@timestamp" => @time, "message" => @buffer.join("\n"))
|
|
165
|
+
# Tag multiline events
|
|
166
|
+
event.tag @multiline_tag if @multiline_tag && @buffer.size > 1
|
|
167
|
+
|
|
168
|
+
yield event
|
|
169
|
+
@buffer = []
|
|
170
|
+
end
|
|
171
|
+
end
|
|
172
|
+
|
|
173
|
+
def do_next(text, matched, &block)
|
|
174
|
+
buffer(text)
|
|
175
|
+
flush(&block) if !matched
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
def do_previous(text, matched, &block)
|
|
179
|
+
flush(&block) if !matched
|
|
180
|
+
buffer(text)
|
|
181
|
+
end
|
|
182
|
+
|
|
183
|
+
public
|
|
184
|
+
def encode(data)
|
|
185
|
+
# Nothing to do.
|
|
186
|
+
@on_event.call(data)
|
|
187
|
+
end # def encode
|
|
188
|
+
|
|
189
|
+
end # class LogStash::Codecs::Plain
|
|
@@ -0,0 +1,342 @@
|
|
|
1
|
+
# encoding: utf-8
|
|
2
|
+
require "logstash/filters/base"
|
|
3
|
+
require "logstash/namespace"
|
|
4
|
+
|
|
5
|
+
# The "netflow" codec is for decoding Netflow v5/v9 flows.
|
|
6
|
+
class LogStash::Codecs::Netflow < LogStash::Codecs::Base
|
|
7
|
+
config_name "netflow"
|
|
8
|
+
milestone 1
|
|
9
|
+
|
|
10
|
+
# Netflow v9 template cache TTL (minutes)
|
|
11
|
+
config :cache_ttl, :validate => :number, :default => 4000
|
|
12
|
+
|
|
13
|
+
# Specify into what field you want the Netflow data.
|
|
14
|
+
config :target, :validate => :string, :default => "netflow"
|
|
15
|
+
|
|
16
|
+
# Specify which Netflow versions you will accept.
|
|
17
|
+
config :versions, :validate => :array, :default => [5, 9]
|
|
18
|
+
|
|
19
|
+
public
|
|
20
|
+
def initialize(params={})
|
|
21
|
+
super(params)
|
|
22
|
+
@threadsafe = false
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
public
|
|
26
|
+
def register
|
|
27
|
+
require "logstash/codecs/netflow/util"
|
|
28
|
+
@templates = Vash.new()
|
|
29
|
+
end # def register
|
|
30
|
+
|
|
31
|
+
public
|
|
32
|
+
def decode(payload, &block)
|
|
33
|
+
header = Header.read(payload)
|
|
34
|
+
|
|
35
|
+
unless @versions.include?(header.version)
|
|
36
|
+
@logger.warn("Ignoring Netflow version v#{header.version}")
|
|
37
|
+
return
|
|
38
|
+
end
|
|
39
|
+
|
|
40
|
+
if header.version == 5
|
|
41
|
+
flowset = Netflow5PDU.read(payload)
|
|
42
|
+
elsif header.version == 9
|
|
43
|
+
flowset = Netflow9PDU.read(payload)
|
|
44
|
+
else
|
|
45
|
+
@logger.warn("Unsupported Netflow version v#{header.version}")
|
|
46
|
+
return
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
flowset.records.each do |record|
|
|
50
|
+
if flowset.version == 5
|
|
51
|
+
event = LogStash::Event.new
|
|
52
|
+
|
|
53
|
+
# FIXME Probably not doing this right WRT JRuby?
|
|
54
|
+
#
|
|
55
|
+
# The flowset header gives us the UTC epoch seconds along with
|
|
56
|
+
# residual nanoseconds so we can set @timestamp to that easily
|
|
57
|
+
event["@timestamp"] = Time.at(flowset.unix_sec, flowset.unix_nsec / 1000).utc
|
|
58
|
+
event[@target] = {}
|
|
59
|
+
|
|
60
|
+
# Copy some of the pertinent fields in the header to the event
|
|
61
|
+
['version', 'flow_seq_num', 'engine_type', 'engine_id', 'sampling_algorithm', 'sampling_interval', 'flow_records'].each do |f|
|
|
62
|
+
event[@target][f] = flowset[f]
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
# Create fields in the event from each field in the flow record
|
|
66
|
+
record.each_pair do |k,v|
|
|
67
|
+
case k.to_s
|
|
68
|
+
when /_switched$/
|
|
69
|
+
# The flow record sets the first and last times to the device
|
|
70
|
+
# uptime in milliseconds. Given the actual uptime is provided
|
|
71
|
+
# in the flowset header along with the epoch seconds we can
|
|
72
|
+
# convert these into absolute times
|
|
73
|
+
millis = flowset.uptime - v
|
|
74
|
+
seconds = flowset.unix_sec - (millis / 1000)
|
|
75
|
+
micros = (flowset.unix_nsec / 1000) - (millis % 1000)
|
|
76
|
+
if micros < 0
|
|
77
|
+
seconds--
|
|
78
|
+
micros += 1000000
|
|
79
|
+
end
|
|
80
|
+
# FIXME Again, probably doing this wrong WRT JRuby?
|
|
81
|
+
event[@target][k.to_s] = Time.at(seconds, micros).utc.strftime("%Y-%m-%dT%H:%M:%S.%3NZ")
|
|
82
|
+
else
|
|
83
|
+
event[@target][k.to_s] = v
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
yield event
|
|
88
|
+
elsif flowset.version == 9
|
|
89
|
+
case record.flowset_id
|
|
90
|
+
when 0
|
|
91
|
+
# Template flowset
|
|
92
|
+
record.flowset_data.templates.each do |template|
|
|
93
|
+
catch (:field) do
|
|
94
|
+
fields = []
|
|
95
|
+
template.fields.each do |field|
|
|
96
|
+
entry = netflow_field_for(field.field_type, field.field_length)
|
|
97
|
+
if ! entry
|
|
98
|
+
throw :field
|
|
99
|
+
end
|
|
100
|
+
fields += entry
|
|
101
|
+
end
|
|
102
|
+
# We get this far, we have a list of fields
|
|
103
|
+
#key = "#{flowset.source_id}|#{event["source"]}|#{template.template_id}"
|
|
104
|
+
key = "#{flowset.source_id}|#{template.template_id}"
|
|
105
|
+
@templates[key, @cache_ttl] = BinData::Struct.new(:endian => :big, :fields => fields)
|
|
106
|
+
# Purge any expired templates
|
|
107
|
+
@templates.cleanup!
|
|
108
|
+
end
|
|
109
|
+
end
|
|
110
|
+
when 1
|
|
111
|
+
# Options template flowset
|
|
112
|
+
record.flowset_data.templates.each do |template|
|
|
113
|
+
catch (:field) do
|
|
114
|
+
fields = []
|
|
115
|
+
template.option_fields.each do |field|
|
|
116
|
+
entry = netflow_field_for(field.field_type, field.field_length)
|
|
117
|
+
if ! entry
|
|
118
|
+
throw :field
|
|
119
|
+
end
|
|
120
|
+
fields += entry
|
|
121
|
+
end
|
|
122
|
+
# We get this far, we have a list of fields
|
|
123
|
+
#key = "#{flowset.source_id}|#{event["source"]}|#{template.template_id}"
|
|
124
|
+
key = "#{flowset.source_id}|#{template.template_id}"
|
|
125
|
+
@templates[key, @cache_ttl] = BinData::Struct.new(:endian => :big, :fields => fields)
|
|
126
|
+
# Purge any expired templates
|
|
127
|
+
@templates.cleanup!
|
|
128
|
+
end
|
|
129
|
+
end
|
|
130
|
+
when 256..65535
|
|
131
|
+
# Data flowset
|
|
132
|
+
#key = "#{flowset.source_id}|#{event["source"]}|#{record.flowset_id}"
|
|
133
|
+
key = "#{flowset.source_id}|#{record.flowset_id}"
|
|
134
|
+
template = @templates[key]
|
|
135
|
+
|
|
136
|
+
if ! template
|
|
137
|
+
#@logger.warn("No matching template for flow id #{record.flowset_id} from #{event["source"]}")
|
|
138
|
+
@logger.warn("No matching template for flow id #{record.flowset_id}")
|
|
139
|
+
next
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
length = record.flowset_length - 4
|
|
143
|
+
|
|
144
|
+
# Template shouldn't be longer than the record and there should
|
|
145
|
+
# be at most 3 padding bytes
|
|
146
|
+
if template.num_bytes > length or ! (length % template.num_bytes).between?(0, 3)
|
|
147
|
+
@logger.warn("Template length doesn't fit cleanly into flowset", :template_id => record.flowset_id, :template_length => template.num_bytes, :record_length => length)
|
|
148
|
+
next
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
array = BinData::Array.new(:type => template, :initial_length => length / template.num_bytes)
|
|
152
|
+
|
|
153
|
+
records = array.read(record.flowset_data)
|
|
154
|
+
|
|
155
|
+
records.each do |r|
|
|
156
|
+
event = LogStash::Event.new(
|
|
157
|
+
"@timestamp" => Time.at(flowset.unix_sec).utc,
|
|
158
|
+
@target => {}
|
|
159
|
+
)
|
|
160
|
+
|
|
161
|
+
# Fewer fields in the v9 header
|
|
162
|
+
['version', 'flow_seq_num'].each do |f|
|
|
163
|
+
event[@target][f] = flowset[f]
|
|
164
|
+
end
|
|
165
|
+
|
|
166
|
+
event[@target]['flowset_id'] = record.flowset_id
|
|
167
|
+
|
|
168
|
+
r.each_pair do |k,v|
|
|
169
|
+
case k.to_s
|
|
170
|
+
when /_switched$/
|
|
171
|
+
millis = flowset.uptime - v
|
|
172
|
+
seconds = flowset.unix_sec - (millis / 1000)
|
|
173
|
+
# v9 did away with the nanosecs field
|
|
174
|
+
micros = 1000000 - (millis % 1000)
|
|
175
|
+
event[@target][k.to_s] = Time.at(seconds, micros).utc.strftime("%Y-%m-%dT%H:%M:%S.%3NZ")
|
|
176
|
+
else
|
|
177
|
+
event[@target][k.to_s] = v
|
|
178
|
+
end
|
|
179
|
+
end
|
|
180
|
+
|
|
181
|
+
yield event
|
|
182
|
+
end
|
|
183
|
+
else
|
|
184
|
+
@logger.warn("Unsupported flowset id #{record.flowset_id}")
|
|
185
|
+
end
|
|
186
|
+
end
|
|
187
|
+
end
|
|
188
|
+
end # def filter
|
|
189
|
+
|
|
190
|
+
private
|
|
191
|
+
def uint_field(length, default)
|
|
192
|
+
# If length is 4, return :uint32, etc. and use default if length is 0
|
|
193
|
+
("uint" + (((length > 0) ? length : default) * 8).to_s).to_sym
|
|
194
|
+
end # def uint_field
|
|
195
|
+
|
|
196
|
+
private
|
|
197
|
+
def netflow_field_for(type, length)
|
|
198
|
+
case type
|
|
199
|
+
when 1
|
|
200
|
+
[[uint_field(length, 4), :in_bytes]]
|
|
201
|
+
when 2
|
|
202
|
+
[[uint_field(length, 4), :in_pkts]]
|
|
203
|
+
when 3
|
|
204
|
+
[[uint_field(length, 4), :flows]]
|
|
205
|
+
when 4
|
|
206
|
+
[[:uint8, :protocol]]
|
|
207
|
+
when 5
|
|
208
|
+
[[:uint8, :src_tos]]
|
|
209
|
+
when 6
|
|
210
|
+
[[:uint8, :tcp_flags]]
|
|
211
|
+
when 7
|
|
212
|
+
[[:uint16, :l4_src_port]]
|
|
213
|
+
when 8
|
|
214
|
+
[[:ip4_addr, :ipv4_src_addr]]
|
|
215
|
+
when 9
|
|
216
|
+
[[:uint8, :src_mask]]
|
|
217
|
+
when 10
|
|
218
|
+
[[uint_field(length, 2), :input_snmp]]
|
|
219
|
+
when 11
|
|
220
|
+
[[:uint16, :l4_dst_port]]
|
|
221
|
+
when 12
|
|
222
|
+
[[:ip4_addr, :ipv4_dst_addr]]
|
|
223
|
+
when 13
|
|
224
|
+
[[:uint8, :dst_mask]]
|
|
225
|
+
when 14
|
|
226
|
+
[[uint_field(length, 2), :output_snmp]]
|
|
227
|
+
when 15
|
|
228
|
+
[[:ip4_addr, :ipv4_next_hop]]
|
|
229
|
+
when 16
|
|
230
|
+
[[uint_field(length, 2), :src_as]]
|
|
231
|
+
when 17
|
|
232
|
+
[[uint_field(length, 2), :dst_as]]
|
|
233
|
+
when 18
|
|
234
|
+
[[:ip4_addr, :bgp_ipv4_next_hop]]
|
|
235
|
+
when 19
|
|
236
|
+
[[uint_field(length, 4), :mul_dst_pkts]]
|
|
237
|
+
when 20
|
|
238
|
+
[[uint_field(length, 4), :mul_dst_bytes]]
|
|
239
|
+
when 21
|
|
240
|
+
[[:uint32, :last_switched]]
|
|
241
|
+
when 22
|
|
242
|
+
[[:uint32, :first_switched]]
|
|
243
|
+
when 23
|
|
244
|
+
[[uint_field(length, 4), :out_bytes]]
|
|
245
|
+
when 24
|
|
246
|
+
[[uint_field(length, 4), :out_pkts]]
|
|
247
|
+
when 25
|
|
248
|
+
[[:uint16, :min_pkt_length]]
|
|
249
|
+
when 26
|
|
250
|
+
[[:uint16, :max_pkg_length]]
|
|
251
|
+
when 27
|
|
252
|
+
[[:ip6_addr, :ipv6_src_addr]]
|
|
253
|
+
when 28
|
|
254
|
+
[[:ip6_addr, :ipv6_dst_addr]]
|
|
255
|
+
when 29
|
|
256
|
+
[[:uint8, :ipv6_src_mask]]
|
|
257
|
+
when 30
|
|
258
|
+
[[:uint8, :ipv6_dst_mask]]
|
|
259
|
+
when 31
|
|
260
|
+
[[:uint24, :ipv6_flow_label]]
|
|
261
|
+
when 32
|
|
262
|
+
[[:uint16, :icmp_type]]
|
|
263
|
+
when 33
|
|
264
|
+
[[:uint8, :mul_igmp_type]]
|
|
265
|
+
when 34
|
|
266
|
+
[[:uint32, :sampling_interval]]
|
|
267
|
+
when 35
|
|
268
|
+
[[:uint8, :sampling_algorithm]]
|
|
269
|
+
when 36
|
|
270
|
+
[[:uint16, :flow_active_timeout]]
|
|
271
|
+
when 37
|
|
272
|
+
[[:uint16, :flow_inactive_timeout]]
|
|
273
|
+
when 38
|
|
274
|
+
[[:uint8, :engine_type]]
|
|
275
|
+
when 39
|
|
276
|
+
[[:uint8, :engine_id]]
|
|
277
|
+
when 40
|
|
278
|
+
[[uint_field(length, 4), :total_bytes_exp]]
|
|
279
|
+
when 41
|
|
280
|
+
[[uint_field(length, 4), :total_pkts_exp]]
|
|
281
|
+
when 42
|
|
282
|
+
[[uint_field(length, 4), :total_flows_exp]]
|
|
283
|
+
when 43 # Vendor specific field
|
|
284
|
+
[[:skip, nil, {:length => length}]]
|
|
285
|
+
when 44
|
|
286
|
+
[[:ip4_addr, :ipv4_src_prefix]]
|
|
287
|
+
when 45
|
|
288
|
+
[[:ip4_addr, :ipv4_dst_prefix]]
|
|
289
|
+
when 46
|
|
290
|
+
[[:uint8, :mpls_top_label_type]]
|
|
291
|
+
when 47
|
|
292
|
+
[[:uint32, :mpls_top_label_ip_addr]]
|
|
293
|
+
when 48
|
|
294
|
+
[[uint_field(length, 4), :flow_sampler_id]]
|
|
295
|
+
when 49
|
|
296
|
+
[[:uint8, :flow_sampler_mode]]
|
|
297
|
+
when 50
|
|
298
|
+
[[:uint32, :flow_sampler_random_interval]]
|
|
299
|
+
when 51 # Vendor specific field
|
|
300
|
+
[[:skip, nil, {:length => length}]]
|
|
301
|
+
when 52
|
|
302
|
+
[[:uint8, :min_ttl]]
|
|
303
|
+
when 53
|
|
304
|
+
[[:uint8, :max_ttl]]
|
|
305
|
+
when 54
|
|
306
|
+
[[:uint16, :ipv4_ident]]
|
|
307
|
+
when 55
|
|
308
|
+
[[:uint8, :dst_tos]]
|
|
309
|
+
when 56
|
|
310
|
+
[[:mac_addr, :in_src_mac]]
|
|
311
|
+
when 57
|
|
312
|
+
[[:mac_addr, :out_dst_mac]]
|
|
313
|
+
when 58
|
|
314
|
+
[[:uint16, :src_vlan]]
|
|
315
|
+
when 59
|
|
316
|
+
[[:uint16, :dst_vlan]]
|
|
317
|
+
when 60
|
|
318
|
+
[[:uint8, :ip_protocol_version]]
|
|
319
|
+
when 61
|
|
320
|
+
[[:uint8, :direction]]
|
|
321
|
+
when 62
|
|
322
|
+
[[:ip6_addr, :ipv6_next_hop]]
|
|
323
|
+
when 63
|
|
324
|
+
[[:ip6_addr, :bgp_ipv6_next_hop]]
|
|
325
|
+
when 64
|
|
326
|
+
[[:uint32, :ipv6_option_headers]]
|
|
327
|
+
when 65..69 # Vendor specific fields
|
|
328
|
+
[[:skip, nil, {:length => length}]]
|
|
329
|
+
when 80
|
|
330
|
+
[[:mac_addr, :in_dst_mac]]
|
|
331
|
+
when 81
|
|
332
|
+
[[:mac_addr, :out_src_mac]]
|
|
333
|
+
when 82
|
|
334
|
+
[[:string, :if_name, {:length => length, :trim_padding => true}]]
|
|
335
|
+
when 83
|
|
336
|
+
[[:string, :if_desc, {:length => length, :trim_padding => true}]]
|
|
337
|
+
else
|
|
338
|
+
@logger.warn("Unsupported field", :type => type, :length => length)
|
|
339
|
+
nil
|
|
340
|
+
end
|
|
341
|
+
end # def netflow_field_for
|
|
342
|
+
end # class LogStash::Filters::Netflow
|