logasm 0.9.1 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 976cb0da3fd9228fcfc8131274424fa54ea76117
4
- data.tar.gz: 638a7ed3dee8b7756b97fbc4f45c08cc2ddb6993
3
+ metadata.gz: bb7e9b0c7705fcdbfd723890c04ccbb1f5aeb944
4
+ data.tar.gz: d554034a757044f6880a9e12a8e1fad0ff83d1fb
5
5
  SHA512:
6
- metadata.gz: 53b084eeb0aec7ebaa7830d8677b295d9a4b4c31b472929df8e6c35b8ef54c7719d08879e8653335e4c4cae0e80b3cfd26d3640167e8ac8f24b08e7893150efc
7
- data.tar.gz: c054f7d41cb28d47abc5610368e9a5a918c8bd5a2d62abe07dd133c1edd8fba706c6437b9ef3c4baf96cd3f92d9c9eb9e9dd782788668be4673dd0b2f3a0aff8
6
+ metadata.gz: 2bcf5f48bb51ed0f433919b8a64b0671510b17159daea4e5cded9a7666384de6468ed3ee47531fd9ee144425f5b7de46e6c657292c2e36823e404f65b99d1958
7
+ data.tar.gz: 5e6875c898fbb2f7239ab6c471aa1016f57ba789ecb9e32753e56039c9ab7751eb95ec6c54e08cdfd1794656dea6f3238d873e7e34334893f4f7b5cce9ace5bd
data/README.md CHANGED
@@ -9,8 +9,6 @@ Logasm
9
9
  Logasm.build(application_name, logger_config)
10
10
  ```
11
11
 
12
- <b>application_name</b> is the name of the application. Only logstash logger will use this.
13
-
14
12
  <b>logger_config</b> is a hash with logger types and their configuration.
15
13
 
16
14
  #### Configuration
@@ -19,10 +17,6 @@ Logasm.build(application_name, logger_config)
19
17
  loggers:
20
18
  stdout:
21
19
  level: 'debug'
22
- logstash:
23
- level: 'info'
24
- host: 'localhost'
25
- port: 5228
26
20
  ```
27
21
  Supported log levels:
28
22
 
@@ -44,22 +38,6 @@ require 'logasm'
44
38
  logasm = Logasm.build('myApp', stdout: nil)
45
39
  ```
46
40
 
47
- Creating a new logstash logger
48
-
49
- ```ruby
50
- require 'logasm'
51
-
52
- logasm = Logasm.build('myApp', logstash: { host: "localhost", port: 5228 })
53
- ```
54
-
55
- Creating a new logger that logs into stdout and logstash at the same time
56
-
57
- ```ruby
58
- require 'logasm'
59
-
60
- logasm = Logasm.build('myApp', { stdout: nil, logstash: { host: "localhost", port: 5228 }})
61
- ```
62
-
63
41
  When no loggers are specified, it creates a stdout logger by default.
64
42
 
65
43
  ## Preprocessors
@@ -17,7 +17,10 @@ class Logasm
17
17
  def log(level, metadata = {})
18
18
  message = metadata[:message]
19
19
  data = metadata.select { |key, value| key != :message }
20
- log_data = [message, data.empty? ? nil : data.to_json].compact.join(' ')
20
+ log_data = [
21
+ message,
22
+ data.empty? ? nil : Oj.dump(data, mode: :compat, time_format: :ruby)
23
+ ].compact.join(' ')
21
24
 
22
25
  @logger.public_send level, log_data
23
26
  end
@@ -9,7 +9,7 @@ class Logasm
9
9
  def log(level, metadata = {})
10
10
  if meets_threshold?(level)
11
11
  message = Utils.build_event(metadata, level, @service_name)
12
- STDOUT.puts(JSON.dump(message))
12
+ STDOUT.puts(Oj.dump(message, mode: :compat, time_format: :ruby))
13
13
  end
14
14
  end
15
15
 
@@ -4,13 +4,7 @@ class Logasm
4
4
 
5
5
  def self.get(type, service_name, arguments)
6
6
  adapter =
7
- if type == 'rabbitmq'
8
- require_relative 'adapters/rabbitmq_adapter'
9
- RabbitmqAdapter
10
- elsif type == 'logstash'
11
- require_relative 'adapters/logstash_adapter'
12
- LogstashAdapter
13
- elsif type == 'stdout'
7
+ if type == 'stdout'
14
8
  if arguments.fetch(:json, false)
15
9
  require_relative 'adapters/stdout_json_adapter'
16
10
  StdoutJsonAdapter
data/lib/logasm/utils.rb CHANGED
@@ -1,9 +1,7 @@
1
- require 'socket'
2
1
  require 'time'
3
2
 
4
3
  class Logasm
5
4
  module Utils
6
- HOST = ::Socket.gethostname
7
5
  DECIMAL_FRACTION_OF_SECOND = 3
8
6
 
9
7
  # Build logstash json compatible event
@@ -36,8 +34,7 @@ class Logasm
36
34
 
37
35
  def self.overwritable_params
38
36
  {
39
- :@timestamp => Time.now.utc.iso8601(DECIMAL_FRACTION_OF_SECOND),
40
- host: HOST
37
+ :@timestamp => Time.now.utc.iso8601(DECIMAL_FRACTION_OF_SECOND)
41
38
  }
42
39
  end
43
40
 
data/lib/logasm.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  require 'inflecto'
2
2
  require 'logger'
3
- require 'json'
3
+ require 'oj'
4
4
  require_relative 'logasm/adapters'
5
5
  require_relative 'logasm/utils'
6
6
  require_relative 'logasm/null_logger'
data/logasm.gemspec CHANGED
@@ -4,7 +4,7 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
4
 
5
5
  Gem::Specification.new do |gem|
6
6
  gem.name = "logasm"
7
- gem.version = '0.9.1'
7
+ gem.version = '1.0.0'
8
8
  gem.authors = ["Salemove"]
9
9
  gem.email = ["support@salemove.com"]
10
10
  gem.description = %q{It's logasmic}
@@ -18,6 +18,7 @@ Gem::Specification.new do |gem|
18
18
 
19
19
  gem.add_dependency 'inflecto'
20
20
  gem.add_dependency 'lru_redux'
21
+ gem.add_dependency 'oj'
21
22
 
22
23
  gem.add_development_dependency "bundler", "~> 1.3"
23
24
  gem.add_development_dependency "rake"
@@ -12,7 +12,7 @@ describe Logasm::Adapters::StdoutJsonAdapter do
12
12
  let(:adapter) { described_class.new(debug_level_code, service_name) }
13
13
  let(:metadata) { {x: 'y'} }
14
14
  let(:event) { {a: 'b', x: 'y'} }
15
- let(:serialized_event) { JSON.dump(event) }
15
+ let(:serialized_event) { Oj.dump(event, mode: :compat, time_format: :ruby) }
16
16
  let(:service_name) { 'my-service' }
17
17
 
18
18
  before do
data/spec/logasm_spec.rb CHANGED
@@ -20,26 +20,7 @@ describe Logasm do
20
20
  described_class.build('test_service', stdout: {json: true})
21
21
  end
22
22
 
23
- it 'creates logstash logger' do
24
- expect(described_class).to receive(:new) do |adapters|
25
- expect(adapters.count).to be(1)
26
- expect(adapters.first).to be_a(described_class::Adapters::LogstashAdapter)
27
- end
28
-
29
- described_class.build('test_service', logstash: {host: 'localhost', port: 5228})
30
- end
31
-
32
- it 'creates multiple loggers' do
33
- expect(described_class).to receive(:new) do |adapters|
34
- expect(adapters.count).to be(2)
35
- expect(adapters.first).to be_a(described_class::Adapters::StdoutAdapter)
36
- expect(adapters.last).to be_a(described_class::Adapters::LogstashAdapter)
37
- end
38
-
39
- described_class.build('test_service', stdout: nil, logstash: {host: 'localhost', port: 5228})
40
- end
41
-
42
- it 'creates file logger when no loggers are specified' do
23
+ it 'creates stdout logger when no loggers are specified' do
43
24
  expect(described_class).to receive(:new) do |adapters|
44
25
  expect(adapters.count).to be(1)
45
26
  expect(adapters.first).to be_a(described_class::Adapters::StdoutAdapter)
@@ -124,14 +105,9 @@ describe Logasm do
124
105
  end
125
106
 
126
107
  context 'log level queries' do
127
- context 'when one adapter has debug level' do
108
+ context 'when adapter has debug level' do
128
109
  let(:logger) do
129
- described_class.build(
130
- 'test_service',
131
- stdout: {level: 'debug'},
132
- logstash: {level: 'info', host: '127.0.0.1', port: 5228 },
133
- rabbitmq: {level: 'fatal'},
134
- )
110
+ described_class.build('test_service', stdout: {level: 'debug'})
135
111
  end
136
112
 
137
113
  it 'responds true to debug? and higher levels' do
@@ -143,14 +119,9 @@ describe Logasm do
143
119
  end
144
120
  end
145
121
 
146
- context 'when one adapter has info level' do
122
+ context 'when adapter has info level' do
147
123
  let(:logger) do
148
- described_class.build(
149
- 'test_service',
150
- rabbitmq: {level: 'info'},
151
- stdout: {level: 'warn'},
152
- logstash: {level: 'warn', host: '127.0.0.1', port: 5228 },
153
- )
124
+ described_class.build('test_service', stdout: {level: 'info'})
154
125
  end
155
126
 
156
127
  it 'responds true to info? and higher levels' do
data/spec/utils_spec.rb CHANGED
@@ -34,10 +34,6 @@ describe Logasm::Utils do
34
34
  expect(event[:@timestamp]).to eq('2015-10-11T23:10:21.123Z')
35
35
  end
36
36
 
37
- it 'includes the host' do
38
- expect(event[:host]).to be_a(String)
39
- end
40
-
41
37
  context 'when @timestamp provided' do
42
38
  let(:metadata) { {message: 'test', :@timestamp => 'a timestamp'} }
43
39
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: logasm
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.9.1
4
+ version: 1.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Salemove
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-12-27 00:00:00.000000000 Z
11
+ date: 2018-02-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: inflecto
@@ -38,6 +38,20 @@ dependencies:
38
38
  - - ">="
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: oj
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: bundler
43
57
  requirement: !ruby/object:Gem::Requirement
@@ -111,9 +125,6 @@ files:
111
125
  - benchmark/whitelisting.rb
112
126
  - lib/logasm.rb
113
127
  - lib/logasm/adapters.rb
114
- - lib/logasm/adapters/logstash_adapter.rb
115
- - lib/logasm/adapters/logstash_adapter/formatter.rb
116
- - lib/logasm/adapters/rabbitmq_adapter.rb
117
128
  - lib/logasm/adapters/stdout_adapter.rb
118
129
  - lib/logasm/adapters/stdout_json_adapter.rb
119
130
  - lib/logasm/null_logger.rb
@@ -125,9 +136,6 @@ files:
125
136
  - lib/logasm/preprocessors/whitelist.rb
126
137
  - lib/logasm/utils.rb
127
138
  - logasm.gemspec
128
- - spec/adapters/logstash_adapter/formatter_spec.rb
129
- - spec/adapters/logstash_adapter_spec.rb
130
- - spec/adapters/rabbitmq_adapter_spec.rb
131
139
  - spec/adapters/stdout_adapter_spec.rb
132
140
  - spec/adapters/stdout_json_adapter_spec.rb
133
141
  - spec/logasm_spec.rb
@@ -162,9 +170,6 @@ signing_key:
162
170
  specification_version: 4
163
171
  summary: What description said
164
172
  test_files:
165
- - spec/adapters/logstash_adapter/formatter_spec.rb
166
- - spec/adapters/logstash_adapter_spec.rb
167
- - spec/adapters/rabbitmq_adapter_spec.rb
168
173
  - spec/adapters/stdout_adapter_spec.rb
169
174
  - spec/adapters/stdout_json_adapter_spec.rb
170
175
  - spec/logasm_spec.rb
@@ -1,16 +0,0 @@
1
- class Logasm
2
- module Adapters
3
- class LogstashAdapter
4
- class Formatter < ::Logger::Formatter
5
- def initialize(service_name)
6
- @service_name = service_name
7
- end
8
-
9
- def call(level, _time, _progname, message)
10
- event = Utils.build_event(message, level, @service_name)
11
- "#{event.to_json}\n"
12
- end
13
- end
14
- end
15
- end
16
- end
@@ -1,31 +0,0 @@
1
- require 'socket'
2
- require_relative 'logstash_adapter/formatter'
3
- require 'forwardable'
4
-
5
- class Logasm
6
- module Adapters
7
- class LogstashAdapter
8
- extend Forwardable
9
- attr_reader :logger
10
-
11
- def_delegators :@logger, :debug?, :info?, :warn?, :error?, :fatal?
12
-
13
- def initialize(level, service, arguments = {})
14
- host = arguments.fetch(:host)
15
- port = arguments.fetch(:port)
16
- device = UDPSocket.new.tap do |socket|
17
- socket.connect(host, port)
18
- end
19
-
20
- @logger = Logger.new(device).tap do |logger|
21
- logger.formatter = Formatter.new(service)
22
- logger.level = level
23
- end
24
- end
25
-
26
- def log(level, data)
27
- @logger.public_send level, data
28
- end
29
- end
30
- end
31
- end
@@ -1,75 +0,0 @@
1
- begin
2
- require 'bunny'
3
- rescue LoadError => e
4
- raise unless e.message =~ /bunny/
5
- exception = e.exception('To use RabbitMQ adapter for logging, please install bunny!')
6
- exception.set_backtrace(e.backtrace)
7
- raise exception
8
- end
9
-
10
- class Logasm
11
- module Adapters
12
- class RabbitmqAdapter
13
- CONFIGURATION_KEYS = [:host, :hosts, :user, :pass, :port]
14
-
15
- attr_reader :bunny
16
-
17
- def initialize(level, service_name, arguments = {})
18
- config = arguments.select { |key, value| CONFIGURATION_KEYS.include?(key) }
19
- @level = level
20
- @service_name = service_name
21
- @bunny = Bunny.new(config)
22
- @queue_name = arguments.fetch(:queue, 'logstash-queue')
23
- end
24
-
25
- def log(level, metadata = {})
26
- if meets_threshold?(level)
27
- message = Utils.build_event(metadata, level, @service_name)
28
- deliver_message message
29
- end
30
- end
31
-
32
- def debug?
33
- meets_threshold?(:debug)
34
- end
35
-
36
- def info?
37
- meets_threshold?(:info)
38
- end
39
-
40
- def warn?
41
- meets_threshold?(:warn)
42
- end
43
-
44
- def error?
45
- meets_threshold?(:error)
46
- end
47
-
48
- def fatal?
49
- meets_threshold?(:fatal)
50
- end
51
-
52
- private
53
-
54
- def meets_threshold?(level)
55
- LOG_LEVELS.index(level.to_s) >= @level
56
- end
57
-
58
- def deliver_message(message)
59
- exchange.publish(JSON.dump(message), {
60
- content_type: 'application/json',
61
- routing_key: @queue_name
62
- })
63
- rescue Bunny::ConnectionClosedError
64
- end
65
-
66
- def exchange
67
- @exchange ||= begin
68
- bunny.start
69
- channel = bunny.create_channel
70
- channel.default_exchange
71
- end
72
- end
73
- end
74
- end
75
- end
@@ -1,20 +0,0 @@
1
- require 'spec_helper'
2
- require_relative '../../../lib/logasm/adapters/logstash_adapter/formatter'
3
-
4
- describe Logasm::Adapters::LogstashAdapter::Formatter do
5
- subject(:event) { formatter.call(severity, Time.now, nil, message) }
6
-
7
- let(:formatter) { described_class.new(service_name) }
8
- let(:service_name) { 'test_service' }
9
- let(:severity) { 'INFO' }
10
- let(:message) { {x: 'y'} }
11
-
12
- it 'returns correct json' do
13
- hash = JSON.parse(subject)
14
- expect(hash['x']).to eq('y')
15
- expect(hash['application']).to eq('test_service')
16
- expect(hash['level']).to eq('info')
17
- expect(hash['host']).to be_a(String)
18
- expect(hash['@timestamp']).to match(/\d{4}-\d{2}-\d{2}T.*/)
19
- end
20
- end
@@ -1,13 +0,0 @@
1
- require 'spec_helper'
2
- require_relative '../../lib/logasm/adapters/logstash_adapter'
3
-
4
- describe Logasm::Adapters::LogstashAdapter do
5
- let(:logstash) { described_class.new(0, 'test_service', { host: 'localhost', port: '5228'}) }
6
- let(:logger) { logstash.logger }
7
-
8
- it 'delegates to the logger' do
9
- expect(logger).to receive(:info).with(message: 'test')
10
-
11
- logstash.log :info, message: 'test'
12
- end
13
- end
@@ -1,42 +0,0 @@
1
- require 'spec_helper'
2
- require_relative '../../lib/logasm/adapters/rabbitmq_adapter'
3
-
4
- describe Logasm::Adapters::RabbitmqAdapter do
5
- let(:adapter) do
6
- described_class.new(log_level, 'TestService', {
7
- host: 'localhost', user: 'guest', pass: 'guest', port: '5672'
8
- })
9
- end
10
- let(:bunny) { double(start: nil, create_channel: channel) }
11
- let(:channel) { double(default_exchange: exchange) }
12
- let(:exchange) { spy }
13
-
14
- before do
15
- allow(Bunny).to receive(:new) { bunny }
16
- end
17
-
18
- describe '#log' do
19
- context 'when logging a message' do
20
- let(:log_level) { 0 }
21
-
22
- it 'delegates to bunny' do
23
- adapter.log :info, message: 'test'
24
-
25
- expect(exchange).to have_received(:publish).with(
26
- match(/{"@timestamp":"\d{4}-\d{2}-\d{2}T.*","host":".+","message":"test","application":"test_service","level":"info"}/),
27
- { content_type: 'application/json', routing_key: 'logstash-queue' }
28
- )
29
- end
30
- end
31
-
32
- context 'when log level is lower than threshold' do
33
- let(:log_level) { 3 }
34
-
35
- it 'does not delegate to bunny' do
36
- adapter.log :info, message: 'test', a: 'b'
37
-
38
- expect(exchange).to_not have_received(:publish)
39
- end
40
- end
41
- end
42
- end