logstash-logger-yajl 0.27.0

Sign up to get free protection for your applications and to get access to all the features.
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