logstash-logger 0.4.1 → 0.5.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 +4 -4
- data/.gitignore +1 -0
- data/.rspec +3 -0
- data/.travis.yml +6 -3
- data/Appraisals +11 -0
- data/CHANGELOG.md +20 -13
- data/Gemfile +1 -7
- data/README.md +94 -35
- data/Rakefile +3 -5
- data/gemfiles/rails_3.2.gemfile +7 -0
- data/gemfiles/rails_4.0.gemfile +7 -0
- data/gemfiles/rails_4.1.gemfile +7 -0
- data/lib/logstash-logger.rb +4 -3
- data/lib/logstash-logger/device.rb +28 -0
- data/lib/logstash-logger/device/base.rb +30 -0
- data/lib/logstash-logger/device/socket.rb +56 -0
- data/lib/logstash-logger/device/stdout.rb +14 -0
- data/lib/logstash-logger/device/tcp.rb +43 -0
- data/lib/logstash-logger/device/udp.rb +11 -0
- data/lib/logstash-logger/formatter.rb +51 -0
- data/lib/logstash-logger/logger.rb +32 -46
- data/lib/logstash-logger/railtie.rb +23 -0
- data/lib/logstash-logger/tagged_logging.rb +40 -0
- data/lib/logstash-logger/version.rb +2 -4
- data/logstash-logger.gemspec +5 -1
- data/samples/example.crt +16 -0
- data/samples/example.key +15 -0
- data/samples/ssl.conf +15 -0
- data/samples/tcp.conf +11 -0
- data/samples/udp.conf +11 -0
- data/spec/device/socket_spec.rb +15 -0
- data/spec/device/stdout_spec.rb +14 -0
- data/spec/device/tcp_spec.rb +36 -0
- data/spec/device/udp_spec.rb +9 -0
- data/spec/device_spec.rb +11 -0
- data/spec/logger_spec.rb +16 -30
- data/spec/rails_spec.rb +52 -0
- data/spec/spec_helper.rb +38 -5
- data/spec/tagged_logging_spec.rb +32 -0
- metadata +78 -4
- data/lib/logstash-logger/socket.rb +0 -34
data/spec/device_spec.rb
ADDED
data/spec/logger_spec.rb
CHANGED
@@ -1,24 +1,10 @@
|
|
1
|
-
require '
|
1
|
+
require 'logstash-logger'
|
2
2
|
|
3
3
|
describe LogStashLogger do
|
4
|
-
|
5
|
-
|
6
|
-
@socket_type ||= (ENV['SOCKET_TYPE'] || 'UDP').to_s.downcase.to_sym
|
7
|
-
end
|
8
|
-
|
9
|
-
before(:all) { puts "Testing with #{socket_type.to_s.upcase} socket type" }
|
10
|
-
|
11
|
-
let(:host) { '0.0.0.0' }
|
12
|
-
let(:hostname) { Socket.gethostname }
|
13
|
-
let(:port) { 5228 }
|
14
|
-
|
15
|
-
# The logstash logger
|
16
|
-
let(:logger) { LogStashLogger.new(host, port, socket_type) }
|
17
|
-
# The log device that the logger writes to
|
18
|
-
let(:logdev) { logger.instance_variable_get(:@logdev) }
|
19
|
-
|
4
|
+
include_context 'logger'
|
5
|
+
|
20
6
|
let! :listener do
|
21
|
-
case
|
7
|
+
case connection_type
|
22
8
|
when :tcp
|
23
9
|
TCPServer.new(port)
|
24
10
|
when :udp
|
@@ -39,7 +25,7 @@ describe LogStashLogger do
|
|
39
25
|
|
40
26
|
# The raw input received by the logstash listener
|
41
27
|
let :listener_input do
|
42
|
-
case
|
28
|
+
case connection_type
|
43
29
|
when :tcp then tcp_client.readline
|
44
30
|
when :udp then listener.recvfrom(8192)[0]
|
45
31
|
end
|
@@ -61,9 +47,9 @@ describe LogStashLogger do
|
|
61
47
|
# The socket that the logger is writing to
|
62
48
|
#let(:socket) { @socket }
|
63
49
|
|
64
|
-
it 'uses a LogStashLogger::
|
50
|
+
it 'uses a LogStashLogger::Device as the log device' do
|
65
51
|
expect(logdev).to be_a Logger::LogDevice
|
66
|
-
expect(logdev.instance_variable_get(:@dev)).to be_a LogStashLogger::
|
52
|
+
expect(logdev.instance_variable_get(:@dev)).to be_a LogStashLogger::Device::Base
|
67
53
|
end
|
68
54
|
|
69
55
|
it 'takes a string message as input and writes a logstash event' do
|
@@ -71,7 +57,7 @@ describe LogStashLogger do
|
|
71
57
|
|
72
58
|
expect(logdev).to receive(:write).and_call_original do |event|
|
73
59
|
expect(event).to be_a LogStash::Event
|
74
|
-
expect(event.
|
60
|
+
expect(event.host).to eql(hostname)
|
75
61
|
expect(event['message']).to eql(message)
|
76
62
|
expect(event['severity']).to eql('INFO')
|
77
63
|
end
|
@@ -79,20 +65,20 @@ describe LogStashLogger do
|
|
79
65
|
logger.info(message)
|
80
66
|
|
81
67
|
expect(listener_event['message']).to eq(message)
|
82
|
-
expect(listener_event['
|
68
|
+
expect(listener_event['host']).to eq(hostname)
|
83
69
|
end
|
84
70
|
|
85
71
|
it 'takes a logstash-formatted json string as input and writes out a logstash event' do
|
86
72
|
expect(logdev).to receive(:write).and_call_original do |event|
|
87
73
|
expect(event).to be_a LogStash::Event
|
88
74
|
expect(event['message']).to eql(logstash_event['message'])
|
89
|
-
expect(event.
|
75
|
+
expect(event.host).to eql(hostname)
|
90
76
|
end
|
91
77
|
|
92
78
|
logger.info(logstash_event.to_json)
|
93
79
|
|
94
80
|
expect(listener_event['message']).to eq(logstash_event['message'])
|
95
|
-
expect(listener_event['
|
81
|
+
expect(listener_event['host']).to eq(hostname)
|
96
82
|
end
|
97
83
|
|
98
84
|
it 'takes a LogStash::Event as input and writes it out intact' do
|
@@ -101,14 +87,14 @@ describe LogStashLogger do
|
|
101
87
|
expect(event['message']).to eql(logstash_event['message'])
|
102
88
|
expect(event['severity']).to eql(logstash_event['severity'])
|
103
89
|
expect(event.timestamp).to eql(logstash_event.timestamp)
|
104
|
-
expect(event.
|
90
|
+
expect(event.host).to eql(hostname)
|
105
91
|
end
|
106
92
|
|
107
93
|
logger.warn(logstash_event)
|
108
94
|
|
109
95
|
expect(listener_event['message']).to eq(logstash_event['message'])
|
110
96
|
expect(listener_event['severity']).to eq(logstash_event['severity'])
|
111
|
-
expect(listener_event['
|
97
|
+
expect(listener_event['host']).to eq(hostname)
|
112
98
|
end
|
113
99
|
|
114
100
|
it 'takes a data hash as input and writes out a logstash event' do
|
@@ -123,7 +109,7 @@ describe LogStashLogger do
|
|
123
109
|
expect(event['message']).to eql('test')
|
124
110
|
expect(event['severity']).to eql('INFO')
|
125
111
|
expect(event['foo']).to eql('bar')
|
126
|
-
expect(event.
|
112
|
+
expect(event.host).to eql(hostname)
|
127
113
|
end
|
128
114
|
|
129
115
|
logger.info(data.dup)
|
@@ -131,8 +117,8 @@ describe LogStashLogger do
|
|
131
117
|
expect(listener_event['message']).to eq(data["message"])
|
132
118
|
expect(listener_event['severity']).to eq(data['severity'])
|
133
119
|
expect(listener_event['foo']).to eq(data['foo'])
|
134
|
-
expect(listener_event['
|
120
|
+
expect(listener_event['host']).to eq(hostname)
|
135
121
|
expect(listener_event['@timestamp']).to_not be_nil
|
136
122
|
end
|
137
123
|
|
138
|
-
end
|
124
|
+
end
|
data/spec/rails_spec.rb
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
require 'rails/all'
|
2
|
+
require 'logstash-logger'
|
3
|
+
require 'logstash-logger/railtie'
|
4
|
+
|
5
|
+
module Test
|
6
|
+
class Application < ::Rails::Application
|
7
|
+
config.eager_load = false
|
8
|
+
|
9
|
+
config.logstash.port = PORT
|
10
|
+
config.log_level = :info
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
Test::Application.initialize!
|
15
|
+
|
16
|
+
describe LogStashLogger do
|
17
|
+
describe "Rails integration" do
|
18
|
+
let(:app) { Rails.application }
|
19
|
+
let(:config) { app.config }
|
20
|
+
|
21
|
+
describe 'Railtie' do
|
22
|
+
describe 'Rails.logger' do
|
23
|
+
subject { Rails.logger }
|
24
|
+
|
25
|
+
it { should be_a LogStashLogger }
|
26
|
+
|
27
|
+
it "defaults level to config.log_level" do
|
28
|
+
expect(subject.level).to eq(::Logger::INFO)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
describe '#setup' do
|
34
|
+
before do
|
35
|
+
app.config.logstash.port = PORT
|
36
|
+
LogStashLogger.setup(app)
|
37
|
+
end
|
38
|
+
|
39
|
+
context "when logstash is not configured" do
|
40
|
+
before do
|
41
|
+
app.config.logstash.clear
|
42
|
+
app.config.logger = nil
|
43
|
+
LogStashLogger.setup(app)
|
44
|
+
end
|
45
|
+
|
46
|
+
it "does not configure anything" do
|
47
|
+
expect(app.config.logger).to be_nil
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
data/spec/spec_helper.rb
CHANGED
@@ -1,8 +1,41 @@
|
|
1
|
-
require '
|
2
|
-
require 'bundler/setup'
|
3
|
-
|
4
|
-
require 'logstash-logger'
|
1
|
+
require 'pry'
|
5
2
|
|
6
3
|
RSpec.configure do |config|
|
7
4
|
config.order = "random"
|
8
|
-
|
5
|
+
|
6
|
+
config.before(:suite) do
|
7
|
+
puts "Testing with #{CONNECTION_TYPE.to_s.upcase} socket type"
|
8
|
+
end
|
9
|
+
|
10
|
+
config.expect_with :rspec do |c|
|
11
|
+
c.syntax = :expect
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
HOST = ENV['HOST'] || '0.0.0.0'
|
16
|
+
PORT = ENV.fetch('PORT', 5228).to_i
|
17
|
+
CONNECTION_TYPE ||= (ENV['TYPE'] || 'UDP').to_s.downcase.to_sym
|
18
|
+
|
19
|
+
RSpec.shared_context 'logger' do
|
20
|
+
# The type of connection we're testing
|
21
|
+
def connection_type
|
22
|
+
CONNECTION_TYPE
|
23
|
+
end
|
24
|
+
|
25
|
+
let(:host) { HOST }
|
26
|
+
let(:hostname) { Socket.gethostname }
|
27
|
+
let(:port) { PORT }
|
28
|
+
|
29
|
+
# The logstash logger
|
30
|
+
let(:logger) { LogStashLogger.new(host: host, port: port, type: connection_type) }
|
31
|
+
# The log device that the logger writes to
|
32
|
+
let(:logdev) { logger.instance_variable_get(:@logdev) }
|
33
|
+
end
|
34
|
+
|
35
|
+
RSpec.shared_context 'device' do
|
36
|
+
let(:port) { PORT }
|
37
|
+
let(:device_with_port) { LogStashLogger::Device.new(port: port) }
|
38
|
+
let(:udp_device) { LogStashLogger::Device.new(type: :udp, port: port) }
|
39
|
+
let(:tcp_device) { LogStashLogger::Device.new(type: :tcp, port: port) }
|
40
|
+
let(:ssl_tcp_device) { LogStashLogger::Device.new(type: :tcp, port: port, ssl_enable: true) }
|
41
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require 'logstash-logger'
|
2
|
+
|
3
|
+
describe LogStashLogger do
|
4
|
+
include_context 'logger'
|
5
|
+
|
6
|
+
describe "tagged logging" do
|
7
|
+
let(:message) { 'foo' }
|
8
|
+
let(:tag) { 'bar' }
|
9
|
+
|
10
|
+
it "puts tags into the tags array on the logstash event" do
|
11
|
+
expect(logdev).to receive(:write) do |event_string|
|
12
|
+
event = JSON.parse(event_string)
|
13
|
+
expect(event['tags']).to match_array([tag])
|
14
|
+
expect(event['message']).to eq(message)
|
15
|
+
end
|
16
|
+
|
17
|
+
logger.tagged(tag) do
|
18
|
+
logger.info(message)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
it "doesn't put tags on the event when there are no tags" do
|
23
|
+
expect(logdev).to receive(:write) do |event_string|
|
24
|
+
event = JSON.parse(event_string)
|
25
|
+
expect(event['tags']).to be_nil
|
26
|
+
expect(event['message']).to eq(message)
|
27
|
+
end
|
28
|
+
|
29
|
+
logger.info(message)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: logstash-logger
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Butler
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-
|
11
|
+
date: 2014-06-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: logstash-event
|
@@ -25,7 +25,7 @@ dependencies:
|
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '1.2'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: rails
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - ">="
|
@@ -38,6 +38,20 @@ dependencies:
|
|
38
38
|
- - ">="
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rspec
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '3'
|
48
|
+
type: :development
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '3'
|
41
55
|
- !ruby/object:Gem::Dependency
|
42
56
|
name: rake
|
43
57
|
requirement: !ruby/object:Gem::Requirement
|
@@ -52,6 +66,20 @@ dependencies:
|
|
52
66
|
- - ">="
|
53
67
|
- !ruby/object:Gem::Version
|
54
68
|
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: pry
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
55
83
|
- !ruby/object:Gem::Dependency
|
56
84
|
name: wwtd
|
57
85
|
requirement: !ruby/object:Gem::Requirement
|
@@ -66,6 +94,20 @@ dependencies:
|
|
66
94
|
- - ">="
|
67
95
|
- !ruby/object:Gem::Version
|
68
96
|
version: '0'
|
97
|
+
- !ruby/object:Gem::Dependency
|
98
|
+
name: appraisal
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
100
|
+
requirements:
|
101
|
+
- - ">="
|
102
|
+
- !ruby/object:Gem::Version
|
103
|
+
version: '0'
|
104
|
+
type: :development
|
105
|
+
prerelease: false
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
107
|
+
requirements:
|
108
|
+
- - ">="
|
109
|
+
- !ruby/object:Gem::Version
|
110
|
+
version: '0'
|
69
111
|
description: Ruby logger that writes directly to LogStash
|
70
112
|
email:
|
71
113
|
- dwbutler@ucla.edu
|
@@ -74,19 +116,44 @@ extensions: []
|
|
74
116
|
extra_rdoc_files: []
|
75
117
|
files:
|
76
118
|
- ".gitignore"
|
119
|
+
- ".rspec"
|
77
120
|
- ".travis.yml"
|
121
|
+
- Appraisals
|
78
122
|
- CHANGELOG.md
|
79
123
|
- Gemfile
|
80
124
|
- LICENSE.txt
|
81
125
|
- README.md
|
82
126
|
- Rakefile
|
127
|
+
- gemfiles/rails_3.2.gemfile
|
128
|
+
- gemfiles/rails_4.0.gemfile
|
129
|
+
- gemfiles/rails_4.1.gemfile
|
83
130
|
- lib/logstash-logger.rb
|
131
|
+
- lib/logstash-logger/device.rb
|
132
|
+
- lib/logstash-logger/device/base.rb
|
133
|
+
- lib/logstash-logger/device/socket.rb
|
134
|
+
- lib/logstash-logger/device/stdout.rb
|
135
|
+
- lib/logstash-logger/device/tcp.rb
|
136
|
+
- lib/logstash-logger/device/udp.rb
|
137
|
+
- lib/logstash-logger/formatter.rb
|
84
138
|
- lib/logstash-logger/logger.rb
|
85
|
-
- lib/logstash-logger/
|
139
|
+
- lib/logstash-logger/railtie.rb
|
140
|
+
- lib/logstash-logger/tagged_logging.rb
|
86
141
|
- lib/logstash-logger/version.rb
|
87
142
|
- logstash-logger.gemspec
|
143
|
+
- samples/example.crt
|
144
|
+
- samples/example.key
|
145
|
+
- samples/ssl.conf
|
146
|
+
- samples/tcp.conf
|
147
|
+
- samples/udp.conf
|
148
|
+
- spec/device/socket_spec.rb
|
149
|
+
- spec/device/stdout_spec.rb
|
150
|
+
- spec/device/tcp_spec.rb
|
151
|
+
- spec/device/udp_spec.rb
|
152
|
+
- spec/device_spec.rb
|
88
153
|
- spec/logger_spec.rb
|
154
|
+
- spec/rails_spec.rb
|
89
155
|
- spec/spec_helper.rb
|
156
|
+
- spec/tagged_logging_spec.rb
|
90
157
|
homepage: http://github.com/dwbutler/logstash-logger
|
91
158
|
licenses:
|
92
159
|
- MIT
|
@@ -112,5 +179,12 @@ signing_key:
|
|
112
179
|
specification_version: 4
|
113
180
|
summary: LogStash Logger for ruby
|
114
181
|
test_files:
|
182
|
+
- spec/device/socket_spec.rb
|
183
|
+
- spec/device/stdout_spec.rb
|
184
|
+
- spec/device/tcp_spec.rb
|
185
|
+
- spec/device/udp_spec.rb
|
186
|
+
- spec/device_spec.rb
|
115
187
|
- spec/logger_spec.rb
|
188
|
+
- spec/rails_spec.rb
|
116
189
|
- spec/spec_helper.rb
|
190
|
+
- spec/tagged_logging_spec.rb
|
@@ -1,34 +0,0 @@
|
|
1
|
-
class LogStashLogger::Socket
|
2
|
-
def initialize(host, port, socket_type = :udp)
|
3
|
-
@host = host
|
4
|
-
@port = port
|
5
|
-
@type = socket_type
|
6
|
-
@socket = nil
|
7
|
-
end
|
8
|
-
|
9
|
-
def write(event)
|
10
|
-
begin
|
11
|
-
connect unless @socket
|
12
|
-
|
13
|
-
@socket.write("#{event.to_hash.to_json}\n")
|
14
|
-
rescue => e
|
15
|
-
warn "#{self.class} - #{e.class} - #{e.message}"
|
16
|
-
close
|
17
|
-
@socket = nil
|
18
|
-
end
|
19
|
-
end
|
20
|
-
|
21
|
-
def close
|
22
|
-
@socket && @socket.close
|
23
|
-
rescue => e
|
24
|
-
warn "#{self.class} - #{e.class} - #{e.message}"
|
25
|
-
end
|
26
|
-
|
27
|
-
private
|
28
|
-
def connect
|
29
|
-
@socket = case @type
|
30
|
-
when :udp then UDPSocket.new.tap {|s| s.connect(@host, @port)}
|
31
|
-
when :tcp then TCPSocket.new(@host, @port)
|
32
|
-
end
|
33
|
-
end
|
34
|
-
end
|