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