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.
- checksums.yaml +7 -0
- data/.gitignore +21 -0
- data/.rspec +3 -0
- data/.rubocop.yml +1156 -0
- data/.travis.yml +26 -0
- data/Appraisals +23 -0
- data/CHANGELOG.md +203 -0
- data/Gemfile +6 -0
- data/LICENSE.txt +22 -0
- data/README.md +880 -0
- data/Rakefile +23 -0
- data/gemfiles/rails_3.2.gemfile +9 -0
- data/gemfiles/rails_4.0.gemfile +9 -0
- data/gemfiles/rails_4.1.gemfile +9 -0
- data/gemfiles/rails_4.2.gemfile +9 -0
- data/gemfiles/rails_5.0.gemfile +9 -0
- data/gemfiles/rails_5.1.gemfile +9 -0
- data/lib/logstash-event.rb +1 -0
- data/lib/logstash-logger.rb +11 -0
- data/lib/logstash-logger/buffer.rb +336 -0
- data/lib/logstash-logger/configuration.rb +29 -0
- data/lib/logstash-logger/device.rb +67 -0
- data/lib/logstash-logger/device/aws_stream.rb +94 -0
- data/lib/logstash-logger/device/balancer.rb +40 -0
- data/lib/logstash-logger/device/base.rb +73 -0
- data/lib/logstash-logger/device/connectable.rb +131 -0
- data/lib/logstash-logger/device/file.rb +23 -0
- data/lib/logstash-logger/device/firehose.rb +42 -0
- data/lib/logstash-logger/device/io.rb +11 -0
- data/lib/logstash-logger/device/kafka.rb +57 -0
- data/lib/logstash-logger/device/kinesis.rb +44 -0
- data/lib/logstash-logger/device/multi_delegator.rb +36 -0
- data/lib/logstash-logger/device/redis.rb +69 -0
- data/lib/logstash-logger/device/socket.rb +21 -0
- data/lib/logstash-logger/device/stderr.rb +13 -0
- data/lib/logstash-logger/device/stdout.rb +14 -0
- data/lib/logstash-logger/device/tcp.rb +86 -0
- data/lib/logstash-logger/device/udp.rb +12 -0
- data/lib/logstash-logger/device/unix.rb +18 -0
- data/lib/logstash-logger/formatter.rb +51 -0
- data/lib/logstash-logger/formatter/base.rb +73 -0
- data/lib/logstash-logger/formatter/cee.rb +11 -0
- data/lib/logstash-logger/formatter/cee_syslog.rb +22 -0
- data/lib/logstash-logger/formatter/json.rb +11 -0
- data/lib/logstash-logger/formatter/json_lines.rb +11 -0
- data/lib/logstash-logger/formatter/logstash_event.rb +6 -0
- data/lib/logstash-logger/logger.rb +106 -0
- data/lib/logstash-logger/multi_logger.rb +153 -0
- data/lib/logstash-logger/railtie.rb +51 -0
- data/lib/logstash-logger/silenced_logging.rb +83 -0
- data/lib/logstash-logger/tagged_logging.rb +40 -0
- data/lib/logstash-logger/version.rb +3 -0
- data/lib/logstash/event.rb +272 -0
- data/lib/logstash/namespace.rb +15 -0
- data/lib/logstash/util.rb +105 -0
- data/lib/logstash/util/fieldreference.rb +49 -0
- data/logstash-logger.gemspec +42 -0
- data/samples/example.crt +16 -0
- data/samples/example.key +15 -0
- data/samples/file.conf +11 -0
- data/samples/redis.conf +12 -0
- data/samples/ssl.conf +15 -0
- data/samples/syslog.conf +10 -0
- data/samples/tcp.conf +11 -0
- data/samples/udp.conf +11 -0
- data/samples/unix.conf +11 -0
- data/spec/configuration_spec.rb +27 -0
- data/spec/constructor_spec.rb +30 -0
- data/spec/device/balancer_spec.rb +31 -0
- data/spec/device/connectable_spec.rb +74 -0
- data/spec/device/file_spec.rb +15 -0
- data/spec/device/firehose_spec.rb +41 -0
- data/spec/device/io_spec.rb +13 -0
- data/spec/device/kafka_spec.rb +32 -0
- data/spec/device/kinesis_spec.rb +41 -0
- data/spec/device/multi_delegator_spec.rb +31 -0
- data/spec/device/redis_spec.rb +52 -0
- data/spec/device/socket_spec.rb +15 -0
- data/spec/device/stderr_spec.rb +16 -0
- data/spec/device/stdout_spec.rb +31 -0
- data/spec/device/tcp_spec.rb +120 -0
- data/spec/device/udp_spec.rb +9 -0
- data/spec/device/unix_spec.rb +23 -0
- data/spec/device_spec.rb +97 -0
- data/spec/formatter/base_spec.rb +125 -0
- data/spec/formatter/cee_spec.rb +15 -0
- data/spec/formatter/cee_syslog_spec.rb +43 -0
- data/spec/formatter/json_lines_spec.rb +14 -0
- data/spec/formatter/json_spec.rb +10 -0
- data/spec/formatter/logstash_event_spec.rb +10 -0
- data/spec/formatter_spec.rb +79 -0
- data/spec/logger_spec.rb +128 -0
- data/spec/logstash_event_spec.rb +139 -0
- data/spec/multi_logger_spec.rb +59 -0
- data/spec/rails_spec.rb +91 -0
- data/spec/silenced_logging_spec.rb +31 -0
- data/spec/spec_helper.rb +111 -0
- data/spec/syslog_spec.rb +32 -0
- data/spec/tagged_logging_spec.rb +32 -0
- 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
|
data/samples/example.crt
ADDED
@@ -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-----
|
data/samples/example.key
ADDED
@@ -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
data/samples/redis.conf
ADDED
data/samples/ssl.conf
ADDED
data/samples/syslog.conf
ADDED
data/samples/tcp.conf
ADDED
data/samples/udp.conf
ADDED
data/samples/unix.conf
ADDED
@@ -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
|