logasm 0.9.1 → 1.0.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 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