logstash-logger-yajl 0.27.0

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.
Files changed (100) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +21 -0
  3. data/.rspec +3 -0
  4. data/.rubocop.yml +1156 -0
  5. data/.travis.yml +26 -0
  6. data/Appraisals +23 -0
  7. data/CHANGELOG.md +203 -0
  8. data/Gemfile +6 -0
  9. data/LICENSE.txt +22 -0
  10. data/README.md +880 -0
  11. data/Rakefile +23 -0
  12. data/gemfiles/rails_3.2.gemfile +9 -0
  13. data/gemfiles/rails_4.0.gemfile +9 -0
  14. data/gemfiles/rails_4.1.gemfile +9 -0
  15. data/gemfiles/rails_4.2.gemfile +9 -0
  16. data/gemfiles/rails_5.0.gemfile +9 -0
  17. data/gemfiles/rails_5.1.gemfile +9 -0
  18. data/lib/logstash-event.rb +1 -0
  19. data/lib/logstash-logger.rb +11 -0
  20. data/lib/logstash-logger/buffer.rb +336 -0
  21. data/lib/logstash-logger/configuration.rb +29 -0
  22. data/lib/logstash-logger/device.rb +67 -0
  23. data/lib/logstash-logger/device/aws_stream.rb +94 -0
  24. data/lib/logstash-logger/device/balancer.rb +40 -0
  25. data/lib/logstash-logger/device/base.rb +73 -0
  26. data/lib/logstash-logger/device/connectable.rb +131 -0
  27. data/lib/logstash-logger/device/file.rb +23 -0
  28. data/lib/logstash-logger/device/firehose.rb +42 -0
  29. data/lib/logstash-logger/device/io.rb +11 -0
  30. data/lib/logstash-logger/device/kafka.rb +57 -0
  31. data/lib/logstash-logger/device/kinesis.rb +44 -0
  32. data/lib/logstash-logger/device/multi_delegator.rb +36 -0
  33. data/lib/logstash-logger/device/redis.rb +69 -0
  34. data/lib/logstash-logger/device/socket.rb +21 -0
  35. data/lib/logstash-logger/device/stderr.rb +13 -0
  36. data/lib/logstash-logger/device/stdout.rb +14 -0
  37. data/lib/logstash-logger/device/tcp.rb +86 -0
  38. data/lib/logstash-logger/device/udp.rb +12 -0
  39. data/lib/logstash-logger/device/unix.rb +18 -0
  40. data/lib/logstash-logger/formatter.rb +51 -0
  41. data/lib/logstash-logger/formatter/base.rb +73 -0
  42. data/lib/logstash-logger/formatter/cee.rb +11 -0
  43. data/lib/logstash-logger/formatter/cee_syslog.rb +22 -0
  44. data/lib/logstash-logger/formatter/json.rb +11 -0
  45. data/lib/logstash-logger/formatter/json_lines.rb +11 -0
  46. data/lib/logstash-logger/formatter/logstash_event.rb +6 -0
  47. data/lib/logstash-logger/logger.rb +106 -0
  48. data/lib/logstash-logger/multi_logger.rb +153 -0
  49. data/lib/logstash-logger/railtie.rb +51 -0
  50. data/lib/logstash-logger/silenced_logging.rb +83 -0
  51. data/lib/logstash-logger/tagged_logging.rb +40 -0
  52. data/lib/logstash-logger/version.rb +3 -0
  53. data/lib/logstash/event.rb +272 -0
  54. data/lib/logstash/namespace.rb +15 -0
  55. data/lib/logstash/util.rb +105 -0
  56. data/lib/logstash/util/fieldreference.rb +49 -0
  57. data/logstash-logger.gemspec +42 -0
  58. data/samples/example.crt +16 -0
  59. data/samples/example.key +15 -0
  60. data/samples/file.conf +11 -0
  61. data/samples/redis.conf +12 -0
  62. data/samples/ssl.conf +15 -0
  63. data/samples/syslog.conf +10 -0
  64. data/samples/tcp.conf +11 -0
  65. data/samples/udp.conf +11 -0
  66. data/samples/unix.conf +11 -0
  67. data/spec/configuration_spec.rb +27 -0
  68. data/spec/constructor_spec.rb +30 -0
  69. data/spec/device/balancer_spec.rb +31 -0
  70. data/spec/device/connectable_spec.rb +74 -0
  71. data/spec/device/file_spec.rb +15 -0
  72. data/spec/device/firehose_spec.rb +41 -0
  73. data/spec/device/io_spec.rb +13 -0
  74. data/spec/device/kafka_spec.rb +32 -0
  75. data/spec/device/kinesis_spec.rb +41 -0
  76. data/spec/device/multi_delegator_spec.rb +31 -0
  77. data/spec/device/redis_spec.rb +52 -0
  78. data/spec/device/socket_spec.rb +15 -0
  79. data/spec/device/stderr_spec.rb +16 -0
  80. data/spec/device/stdout_spec.rb +31 -0
  81. data/spec/device/tcp_spec.rb +120 -0
  82. data/spec/device/udp_spec.rb +9 -0
  83. data/spec/device/unix_spec.rb +23 -0
  84. data/spec/device_spec.rb +97 -0
  85. data/spec/formatter/base_spec.rb +125 -0
  86. data/spec/formatter/cee_spec.rb +15 -0
  87. data/spec/formatter/cee_syslog_spec.rb +43 -0
  88. data/spec/formatter/json_lines_spec.rb +14 -0
  89. data/spec/formatter/json_spec.rb +10 -0
  90. data/spec/formatter/logstash_event_spec.rb +10 -0
  91. data/spec/formatter_spec.rb +79 -0
  92. data/spec/logger_spec.rb +128 -0
  93. data/spec/logstash_event_spec.rb +139 -0
  94. data/spec/multi_logger_spec.rb +59 -0
  95. data/spec/rails_spec.rb +91 -0
  96. data/spec/silenced_logging_spec.rb +31 -0
  97. data/spec/spec_helper.rb +111 -0
  98. data/spec/syslog_spec.rb +32 -0
  99. data/spec/tagged_logging_spec.rb +32 -0
  100. metadata +385 -0
@@ -0,0 +1,49 @@
1
+ require "logstash/namespace"
2
+ require "logstash/util"
3
+
4
+ module LogStash::Util::FieldReference
5
+ def compile(str)
6
+ if str[0,1] != '['
7
+ return <<-"CODE"
8
+ lambda do |e, &block|
9
+ return block.call(e, #{str.inspect}) unless block.nil?
10
+ return e[#{str.inspect}]
11
+ end
12
+ CODE
13
+ end
14
+
15
+ code = "lambda do |e, &block|\n"
16
+ selectors = str.scan(/(?<=\[).+?(?=\])/)
17
+ selectors.each_with_index do |tok, i|
18
+ last = (i == selectors.count() - 1)
19
+ code << " # [#{tok}]#{ last ? " (last selector)" : "" }\n"
20
+
21
+ if last
22
+ code << <<-"CODE"
23
+ return block.call(e, #{tok.inspect}) unless block.nil?
24
+ CODE
25
+ end
26
+
27
+ code << <<-"CODE"
28
+ if e.is_a?(Array)
29
+ e = e[#{tok.to_i}]
30
+ else
31
+ e = e[#{tok.inspect}]
32
+ end
33
+ return e if e.nil?
34
+ CODE
35
+
36
+ end
37
+ code << "return e\nend"
38
+ #puts code
39
+ return code
40
+ end # def compile
41
+
42
+ def exec(str, obj, &block)
43
+ @__fieldeval_cache ||= {}
44
+ @__fieldeval_cache[str] ||= eval(compile(str))
45
+ return @__fieldeval_cache[str].call(obj, &block)
46
+ end
47
+
48
+ extend self
49
+ end # module LogStash::Util::FieldReference
@@ -0,0 +1,42 @@
1
+ # -*- encoding: utf-8 -*-
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'logstash-logger/version'
5
+
6
+ Gem::Specification.new do |gem|
7
+ gem.name = "logstash-logger-yajl"
8
+ gem.version = LogStashLogger::VERSION
9
+ gem.authors = ["David Butler"]
10
+ gem.email = ["dwbutler@ucla.edu"]
11
+ gem.description = %q{Ruby logger that writes directly to LogStash}
12
+ gem.summary = %q{LogStash Logger for ruby}
13
+ gem.homepage = "http://github.com/dwbutler/logstash-logger"
14
+ gem.license = "MIT"
15
+
16
+ gem.files = `git ls-files`.split($/)
17
+ gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
18
+ gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
19
+ gem.require_paths = ["lib"]
20
+
21
+ gem.add_dependency 'yajl-ruby', '~> 1.0'
22
+
23
+ gem.add_development_dependency 'rails'
24
+ gem.add_development_dependency 'redis'
25
+ gem.add_development_dependency 'poseidon'
26
+ gem.add_development_dependency 'aws-sdk-kinesis'
27
+ gem.add_development_dependency 'aws-sdk-firehose'
28
+
29
+ if defined?(JRUBY_VERSION)
30
+ gem.add_development_dependency 'SyslogLogger'
31
+ end
32
+
33
+ gem.add_development_dependency 'rspec', '>= 3'
34
+ gem.add_development_dependency 'rake'
35
+ gem.add_development_dependency 'pry'
36
+ gem.add_development_dependency 'wwtd'
37
+ gem.add_development_dependency 'appraisal'
38
+ gem.add_development_dependency 'rubocop'
39
+ gem.add_development_dependency 'insist', '1.0.0'
40
+ gem.add_development_dependency 'guard'
41
+ gem.add_development_dependency 'guard-rspec'
42
+ end
@@ -0,0 +1,16 @@
1
+ -----BEGIN CERTIFICATE-----
2
+ MIICdTCCAd4CCQDLMpdv+B+sYDANBgkqhkiG9w0BAQUFADB/MQswCQYDVQQGEwJV
3
+ UzETMBEGA1UECBMKQ2FsaWZvcm5pYTERMA8GA1UEBxMIUGFzYWRlbmExDzANBgNV
4
+ BAoTBkJ1dGxlcjEVMBMGA1UEAxMMRGF2aWQgQnV0bGVyMSAwHgYJKoZIhvcNAQkB
5
+ FhFkd2J1dGxlckB1Y2xhLmVkdTAeFw0xNDA2MDkwNjIyMTZaFw0xNTA2MDkwNjIy
6
+ MTZaMH8xCzAJBgNVBAYTAlVTMRMwEQYDVQQIEwpDYWxpZm9ybmlhMREwDwYDVQQH
7
+ EwhQYXNhZGVuYTEPMA0GA1UEChMGQnV0bGVyMRUwEwYDVQQDEwxEYXZpZCBCdXRs
8
+ ZXIxIDAeBgkqhkiG9w0BCQEWEWR3YnV0bGVyQHVjbGEuZWR1MIGfMA0GCSqGSIb3
9
+ DQEBAQUAA4GNADCBiQKBgQDbBJ1t2m8RA72GZZ8XOUCsLI1EhRqZqWx0zYHpZbc4
10
+ kVbfMeb5uyfpx1gd5QngZrsD0cvTf46F9z9Ng805Ns9jE5QBJxefl1b6iJ6f/Y9s
11
+ W+WYQJgtNOcJahWWLeiBXqApPUllFI2ME/52+/umuSYVtSVAW7QmPx3YSLPpVjkQ
12
+ 3wIDAQABMA0GCSqGSIb3DQEBBQUAA4GBAKiZm6yNzRXKJ9LBLL+Nep87WPlkdFmx
13
+ YUoEtTF8XpgMNfOdzF8DlD4FmoNz/SD7uVOk+tARUoEQFVK+iqpd3/dLDVa/pslX
14
+ a5v6AcmgfSFUHgLvKQZNvgY50jhLdqruf8PCgVnq+4L0ItguJx/viYMxF0p0fJTG
15
+ oGX8W4ul0W5F
16
+ -----END CERTIFICATE-----
@@ -0,0 +1,15 @@
1
+ -----BEGIN RSA PRIVATE KEY-----
2
+ MIICWwIBAAKBgQDbBJ1t2m8RA72GZZ8XOUCsLI1EhRqZqWx0zYHpZbc4kVbfMeb5
3
+ uyfpx1gd5QngZrsD0cvTf46F9z9Ng805Ns9jE5QBJxefl1b6iJ6f/Y9sW+WYQJgt
4
+ NOcJahWWLeiBXqApPUllFI2ME/52+/umuSYVtSVAW7QmPx3YSLPpVjkQ3wIDAQAB
5
+ AoGAYaFXBAchB3ahX22hU1rkJ1vcxTSIPQM3I4IQbRg4anDvRqMaESyKiD2iXAEj
6
+ O/LPXs6Ai5EK2VDz2Pvt2ZlDLFX3GKMEChtIa2mpiQqIdoJS+42ibqfHrv3nlnTK
7
+ OTeTcw+SbAAFTKFPJO94lGcBXhsYYW/LAFH08bVqp+Jhi1ECQQDzkz4O0eYH05Wb
8
+ 1bAwjNcjj+X6JKIRGgWYb1kkk3VyAFuD6qCEKBfS2t4nZs1yy83Ch4Bk9YmDHx1Q
9
+ gdYCjPsLAkEA5jCwo51KqboxAz6m0pZwdiKlCav94TMdHMKTFcUE5fDoWrwzrIyH
10
+ 8rr7q7cl3culX7pUcPdKMl78Nw6/4JFF/QJARwNfrWxut0ttq+BSHOWC98BFWXeC
11
+ tJ+0j+uuvqYrMJCAHeay47TYtUXQTQaA0X4vwA5HVafsbokMv+MKpPW7XwJAF713
12
+ yjgDpkOMoIAKpndbe+OQz9GMKniiDQBIORuLqMdSv2Dfl3Ea6D6+i/QklJ5XHOtT
13
+ oB7w6QcAzhDYWynAZQJAX0UF9alkX8CQq1rvsAG6zzh3bD+Udy7cU0Yonx/byZoz
14
+ K6G/seM5YFTMVrnbY9V23aIhjJSxGWOB5fDNPG5p4w==
15
+ -----END RSA PRIVATE KEY-----
data/samples/file.conf ADDED
@@ -0,0 +1,11 @@
1
+ input {
2
+ file {
3
+ path => "/usr/local/var/logstash.log"
4
+ format => json
5
+ }
6
+ }
7
+ output {
8
+ stdout {
9
+ codec => json_lines
10
+ }
11
+ }
@@ -0,0 +1,12 @@
1
+ input {
2
+ redis {
3
+ data_type => "list"
4
+ codec => json
5
+ key => "logstash"
6
+ }
7
+ }
8
+ output {
9
+ stdout {
10
+ codec => json_lines
11
+ }
12
+ }
data/samples/ssl.conf ADDED
@@ -0,0 +1,15 @@
1
+ input {
2
+ tcp {
3
+ port => 8443
4
+ ssl_enable => true
5
+ ssl_cert => "samples/example.crt"
6
+ ssl_key => "samples/example.key"
7
+ codec => json_lines
8
+ }
9
+ }
10
+ output {
11
+ stdout {
12
+ codec => json_lines
13
+ }
14
+ }
15
+
@@ -0,0 +1,10 @@
1
+ input {
2
+ syslog {
3
+ codec => json_lines
4
+ }
5
+ }
6
+ output {
7
+ stdout {
8
+ codec => json_lines
9
+ }
10
+ }
data/samples/tcp.conf ADDED
@@ -0,0 +1,11 @@
1
+ input {
2
+ tcp {
3
+ port => 5228
4
+ codec => json_lines
5
+ }
6
+ }
7
+ output {
8
+ stdout {
9
+ codec => json_lines
10
+ }
11
+ }
data/samples/udp.conf ADDED
@@ -0,0 +1,11 @@
1
+ input {
2
+ udp {
3
+ port => 5228
4
+ codec => json_lines
5
+ }
6
+ }
7
+ output {
8
+ stdout {
9
+ codec => json_lines
10
+ }
11
+ }
data/samples/unix.conf ADDED
@@ -0,0 +1,11 @@
1
+ input {
2
+ unix {
3
+ path => "/tmp/logstash"
4
+ codec => json_lines
5
+ }
6
+ }
7
+ output {
8
+ stdout {
9
+ codec => json_lines
10
+ }
11
+ }
@@ -0,0 +1,27 @@
1
+ require 'logstash-logger'
2
+
3
+ describe LogStashLogger do
4
+ describe "#configure" do
5
+ it 'auto initializes' do
6
+ config = LogStashLogger.configure
7
+ expect(config).to be_a LogStashLogger::Configuration
8
+ expect(LogStashLogger.configuration).to eq(config)
9
+ end
10
+
11
+ describe LogStashLogger::Configuration do
12
+ describe "#customize_event" do
13
+ it 'allows each LogStash::Event to be customized' do
14
+ config = LogStashLogger.configure do |config|
15
+ config.customize_event do |event|
16
+ event["test1"] = "response1"
17
+ end
18
+ end
19
+
20
+ event = LogStash::Event.new({})
21
+ config.customize_event_block.call(event)
22
+ expect(event["test1"]).to eq("response1")
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,30 @@
1
+ require 'logstash-logger'
2
+
3
+ describe LogStashLogger do
4
+ describe '.new' do
5
+ it 'returns a Logger instance' do
6
+ expect(LogStashLogger.new(type: :stdout)).to be_a ::Logger
7
+ end
8
+
9
+ context 'type: :multi_logger' do
10
+ it "returns an instance of LogStashLogger::MultiLogger" do
11
+ expect(LogStashLogger.new(type: :multi_logger)).to be_a LogStashLogger::MultiLogger
12
+ end
13
+
14
+ it 'merges top level configuration into each logger' do
15
+ logger = LogStashLogger.new(type: :multi_logger, port: 1234, outputs: [ { type: :tcp }, { type: :udp } ])
16
+ logger.loggers.each do |logger|
17
+ expect(logger.device.port).to eq(1234)
18
+ end
19
+ end
20
+ end
21
+
22
+ context 'logger_class: CustomLogger' do
23
+ class CustomLogger < Logger; end
24
+
25
+ it 'should create a logger of the specified class' do
26
+ expect(LogStashLogger.new(type: :stdout, :logger_class => CustomLogger)).to be_a CustomLogger
27
+ end
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,31 @@
1
+ require 'logstash-logger'
2
+
3
+ describe LogStashLogger::Device::Balancer do
4
+ include_context 'device'
5
+
6
+ # Create a Balancer writing to both STDOUT and a StringIO
7
+ subject { balancer_device }
8
+
9
+ describe '#write' do
10
+ before do
11
+ allow(subject.devices).to receive(:sample) { io }
12
+ end
13
+
14
+ it "writes to one device" do
15
+ expect(io).to receive(:write).once
16
+ expect($stdout).to_not receive(:write)
17
+ subject.write("log message")
18
+ end
19
+ end
20
+
21
+ describe '#flush, #close' do
22
+ [:flush, :close].each do |method_name|
23
+ it "call on all devices" do
24
+ subject.devices.each do |device|
25
+ expect(device).to receive(method_name).once
26
+ end
27
+ subject.send(method_name)
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,74 @@
1
+ require 'logstash-logger'
2
+
3
+ describe LogStashLogger::Device::Connectable do
4
+ include_context 'device'
5
+
6
+ let(:io) { double("IO") }
7
+
8
+ subject { udp_device }
9
+
10
+ describe "#reconnect" do
11
+ context "with active IO connection" do
12
+ before do
13
+ subject.instance_variable_set(:@io, io)
14
+ end
15
+
16
+ it "closes the connection" do
17
+ expect(io).to receive(:close).once
18
+ subject.reconnect
19
+ end
20
+ end
21
+
22
+ context "with no active IO connection" do
23
+ before do
24
+ subject.instance_variable_set(:@io, nil)
25
+ end
26
+
27
+ it "does nothing" do
28
+ expect(io).to_not receive(:close)
29
+ subject.reconnect
30
+ end
31
+ end
32
+ end
33
+
34
+ describe "#with_connection" do
35
+ context "on exception" do
36
+ before do
37
+ allow(subject).to receive(:connected?) { raise(StandardError) }
38
+ allow(subject).to receive(:warn)
39
+ end
40
+
41
+ context "with active IO connection" do
42
+ before do
43
+ subject.instance_variable_set(:@io, io)
44
+ end
45
+
46
+ it "closes the connection" do
47
+ expect(io).to receive(:close).once
48
+
49
+ expect {
50
+ subject.with_connection do |connection|
51
+ connection
52
+ end
53
+ }.to raise_error(StandardError)
54
+ end
55
+ end
56
+
57
+ context "with no active IO connection" do
58
+ before do
59
+ subject.instance_variable_set(:@io, nil)
60
+ end
61
+
62
+ it "does nothing" do
63
+ expect(io).to_not receive(:close)
64
+
65
+ expect {
66
+ subject.with_connection do |connection|
67
+ connection
68
+ end
69
+ }.to raise_error(StandardError)
70
+ end
71
+ end
72
+ end
73
+ end
74
+ end
@@ -0,0 +1,15 @@
1
+ require 'logstash-logger'
2
+
3
+ describe LogStashLogger::Device::File do
4
+ include_context 'device'
5
+
6
+ it "writes to a file" do
7
+ expect(file_device.to_io).to be_a ::File
8
+ end
9
+
10
+ context "when path is not specified" do
11
+ it "raises an exception" do
12
+ expect { described_class.new }.to raise_error(ArgumentError)
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,41 @@
1
+ require 'logstash-logger'
2
+
3
+ describe LogStashLogger::Device::Firehose do
4
+ include_context 'device'
5
+
6
+ let(:client) { double("Aws::Firehose::Client") }
7
+
8
+ before(:each) do
9
+ allow(Aws::Firehose::Client).to receive(:new) { client }
10
+ end
11
+
12
+ it "writes to a Firehose stream" do
13
+ response = ::Aws::Firehose::Types::PutRecordBatchOutput.new
14
+ response.failed_put_count = 0
15
+ response.request_responses = []
16
+ expect(client).to receive(:put_record_batch) { response }
17
+ firehose_device.write "foo"
18
+
19
+ expect(firehose_device).to be_connected
20
+ firehose_device.close!
21
+ expect(firehose_device).not_to be_connected
22
+ end
23
+
24
+ it "it puts records with recoverable errors back in the buffer" do
25
+ failed_record = ::Aws::Firehose::Types::PutRecordBatchResponseEntry.new
26
+ failed_record.error_code = "InternalFailure"
27
+ failed_record.error_message = "InternalFailure"
28
+ response = ::Aws::Firehose::Types::PutRecordBatchOutput.new
29
+ response.failed_put_count = 1
30
+ response.request_responses = [failed_record]
31
+
32
+ expect(client).to receive(:put_record_batch) { response }
33
+ expect(firehose_device).to receive(:write).with("foo")
34
+
35
+ firehose_device.write_one "foo"
36
+ end
37
+
38
+ it "defaults the Firehose stream to logstash" do
39
+ expect(firehose_device.stream).to eq('logstash')
40
+ end
41
+ end