paul_bunyan 1.5.0 → 2.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
- SHA1:
3
- metadata.gz: 0b7d9fd1c7ac8e2b72e82b72171ea627c9597196
4
- data.tar.gz: 270c98aa6aa254836aa244db96847b432204df92
2
+ SHA256:
3
+ metadata.gz: 99a1d7f5e1bca7051329fba1b48a4b948bec14fc627d67104628eb8518b030c9
4
+ data.tar.gz: 1baa56a528d8e90f60160241d1fc2201d3d9e9fe047ad089afbbee915ca16902
5
5
  SHA512:
6
- metadata.gz: 7cd3fb82d143d9b6fba0d2f4949ad5a15b52459a6b85fa2ff273a3d13f17754d3bf212a6c133a554a222691e2a6adc90a16a62dc5cfa325513a4e8099e869488
7
- data.tar.gz: 19f8c7c07ac6027f48302882a814b7426dcd3dad228bf4be858075aeccb32d94db72feaddfcdb2cd3019991f775d8969447c1ceb57a6cb0f7485422577bae276
6
+ metadata.gz: 9f42e5e066c935ee873ffd6ebdd1219987d62df649c99b6183492eb18bfaece06350260f33599ee3011b2c944b7186e0bc46bd357139224b0874ed83f8d9c2ac
7
+ data.tar.gz: 478483be7bd4535bc0e8a88e26e51cea389e60361b16d89db092109e8c97956684226a02f66e3889854c31561352f3585d739e13cbff90d0fc931ad5df32b584
data/.travis.yml CHANGED
@@ -1,17 +1,17 @@
1
1
  language: ruby
2
2
  rvm:
3
- - 2.2
4
- - 2.3
5
- - 2.4
3
+ - 2.5
4
+ - 2.6
5
+ - 2.7
6
6
  matrix:
7
7
  fast_finish: true
8
8
  # WWTD doesn't support allow_failures... yet
9
9
  # allow_failures:
10
10
  # - rvm: ruby-head
11
11
  gemfile:
12
- - spec/gemfiles/42.gemfile
13
- - spec/gemfiles/50.gemfile
14
- - spec/gemfiles/51.gemfile
12
+ - spec/gemfiles/52.gemfile
13
+ - spec/gemfiles/60.gemfile
14
+ - spec/gemfiles/61.gemfile
15
15
  script: bundle exec rspec
16
16
  notifications:
17
17
  email:
data/Dockerfile CHANGED
@@ -2,18 +2,14 @@ FROM instructure/rvm
2
2
  MAINTAINER Instructure
3
3
 
4
4
  WORKDIR /usr/src/app
5
- RUN /bin/bash -l -c "rvm use --default 2.4"
5
+ # Everyone use the same bundler version
6
+ RUN /bin/bash -l -c "rvm use 2.5 && gem install bundler"
7
+ RUN /bin/bash -l -c "rvm use 2.6 && gem install bundler"
8
+ RUN /bin/bash -l -c "rvm use --default 2.7 && gem install bundler"
6
9
 
7
- COPY paul_bunyan.gemspec Gemfile /usr/src/app/
8
- COPY lib/paul_bunyan/version.rb /usr/src/app/lib/paul_bunyan/
9
-
10
- USER root
11
- RUN chown -R docker:docker /usr/src/app
12
- USER docker
10
+ COPY --chown=docker:docker paul_bunyan.gemspec Gemfile /usr/src/app/
11
+ COPY --chown=docker:docker lib/paul_bunyan/version.rb /usr/src/app/lib/paul_bunyan/
13
12
  RUN /bin/bash -l -c "bundle install"
14
13
 
15
- COPY . /usr/src/app
16
- USER root
17
- RUN chown -R docker:docker /usr/src/app/*
18
- USER docker
14
+ COPY --chown=docker:docker . /usr/src/app
19
15
  CMD /bin/bash -l -c "wwtd --parallel"
data/Jenkinsfile ADDED
@@ -0,0 +1,14 @@
1
+ pipeline {
2
+ agent {
3
+ label "docker"
4
+ }
5
+ stages {
6
+ stage('Build') {
7
+ steps {
8
+ ansiColor('xterm') {
9
+ sh './build.sh'
10
+ }
11
+ }
12
+ }
13
+ }
14
+ }
data/README.md CHANGED
@@ -43,9 +43,7 @@ Or install it yourself as:
43
43
  ```
44
44
  require 'paul_bunyan'
45
45
 
46
- include PaulBunyan::Logger
47
-
48
- PaulBunyan.set_logger(STDOUT)
46
+ include PaulBunyan
49
47
 
50
48
  logger.warn "blah"
51
49
  ```
@@ -62,3 +60,7 @@ the request host to the metadata in the examples directory. There are a few
62
60
  keys that are used internally that will be overwritten when added to user
63
61
  supplied metadata, this list can be found in the `#call` method of
64
62
  `PaulBunyan::JSONFormatter`.
63
+
64
+ ### Seeing what your server logs will look like in the console
65
+ To do this set `PB_DISABLE_CONSOLE_OVERRIDE` in your environment:
66
+ `PB_DISABLE_CONSOLE_OVERRIDE=1 bundle exec rails c`
@@ -1,11 +1,31 @@
1
1
  module PaulBunyan
2
2
  module MetadataLogging
3
3
  def clear_metadata!
4
- formatter.clear_metadata!
4
+ formatter.clear_metadata! if formatter.respond_to?(:clear_metadata!)
5
5
  end
6
6
 
7
7
  def with_metadata(metadata)
8
- formatter.with_metadata(metadata) { yield self }
8
+ if formatter.respond_to?(:with_metadata)
9
+ formatter.with_metadata(metadata) { yield self }
10
+ else
11
+ yield self
12
+ end
13
+ end
14
+
15
+ def add_metadata(metadata)
16
+ formatter.add_metadata(metadata) if formatter.respond_to?(:add_metadata)
17
+ end
18
+
19
+ def remove_metadata(metadata)
20
+ formatter.remove_metadata(metadata) if formatter.respond_to?(:remove_metadata)
21
+ end
22
+
23
+ def current_metadata
24
+ if formatter.respond_to?(:current_metadata)
25
+ return formatter.current_metadata
26
+ else
27
+ return {}
28
+ end
9
29
  end
10
30
 
11
31
  def flush
@@ -17,6 +17,16 @@ module PaulBunyan
17
17
  Rails.env.development? || Rails.env.test?
18
18
  end
19
19
 
20
+ def self.rake_task?
21
+ File.basename($0) == 'rake'
22
+ end
23
+
24
+ def self.migrating?
25
+ rake_task? && ARGV.include?('db:migrate')
26
+ end
27
+
28
+ delegate :rake_task?, :migrating?, to: :class
29
+
20
30
  # Set up the config and some defaults
21
31
  config.logging = ActiveSupport::OrderedOptions.new
22
32
  config.logging.override_location = !Rails.env.test?
@@ -27,22 +37,24 @@ module PaulBunyan
27
37
  initializer 'initalize_logger.logging', group: :all, before: :initialize_logger do |app|
28
38
  logging_config = config.logging
29
39
 
30
- new_logger = PaulBunyan.add_logger(ActiveSupport::Logger.new(log_target(app.config)))
31
- new_logger.level = PaulBunyan::Level.coerce_level(ENV['LOG_LEVEL'] || ::Rails.application.config.log_level || 'INFO')
32
- new_logger.formatter = logging_config.formatter
33
- new_logger.extend(ActiveSupport::TaggedLogging) if logging_config.formatter.respond_to?(:tagged)
34
- new_logger.extend(PaulBunyan::MetadataLogging) if logging_config.formatter.respond_to?(:with_metadata)
40
+ unless migrating?
41
+ new_logger = PaulBunyan.add_logger(ActiveSupport::Logger.new(log_target(app.config)))
42
+ new_logger.level = PaulBunyan::Level.coerce_level(ENV['LOG_LEVEL'] || ::Rails.application.config.log_level || 'INFO')
43
+ new_logger.formatter = logging_config.formatter
44
+ new_logger.extend(ActiveSupport::TaggedLogging) if logging_config.formatter.respond_to?(:tagged)
45
+ new_logger.extend(PaulBunyan::MetadataLogging) if logging_config.formatter.respond_to?(:with_metadata)
35
46
 
36
- if logging_config.handle_request_logging
37
- unsubscribe_default_log_subscribers
38
- LogSubscriber.subscribe_to_events
39
- end
47
+ if logging_config.handle_request_logging
48
+ unsubscribe_default_log_subscribers
49
+ LogSubscriber.subscribe_to_events
50
+ end
40
51
 
41
- Rails.logger = PaulBunyan.logger
52
+ Rails.logger = PaulBunyan.logger
53
+ end
42
54
  end
43
55
 
44
56
  console do
45
- PaulBunyan.logger.formatter = TextFormatter.new(include_metadata: false)
57
+ PaulBunyan.logger.formatter = TextFormatter.new(include_metadata: false) unless ENV['PB_DISABLE_CONSOLE_OVERRIDE']
46
58
  end
47
59
 
48
60
  def conditionally_unsubscribe(listener)
@@ -66,8 +66,12 @@ module PaulBunyan
66
66
  subscribers << subscriber
67
67
 
68
68
  event_patterns.each do |pattern|
69
- subscriber.patterns << pattern
70
- notifier.subscribe(pattern, subscriber)
69
+ if Rails::VERSION::MAJOR >= 6
70
+ subscriber.patterns[pattern] = notifier.subscribe(pattern, subscriber)
71
+ else
72
+ subscriber.patterns << pattern
73
+ notifier.subscribe(pattern, subscriber)
74
+ end
71
75
  end
72
76
  end
73
77
 
@@ -5,7 +5,7 @@ end
5
5
 
6
6
  module PaulBunyan
7
7
  class TextFormatter < Logger::Formatter
8
- include ActiveSupport::TaggedLogging::Formatter if defined?(ActiveSupport::TaggedLogging)
8
+ include ActiveSupport::TaggedLogging::Formatter if defined?(ActiveSupport::TaggedLogging::Formatter)
9
9
 
10
10
  def initialize(include_metadata: true)
11
11
  @include_metadata = include_metadata
@@ -1,3 +1,3 @@
1
1
  module PaulBunyan
2
- VERSION = '1.5.0'
2
+ VERSION = '2.0.0'
3
3
  end
data/paul_bunyan.gemspec CHANGED
@@ -20,11 +20,11 @@ Gem::Specification.new do |spec|
20
20
 
21
21
  spec.add_dependency 'request_store'
22
22
 
23
- spec.add_development_dependency 'bundler', '~> 1.5'
23
+ spec.add_development_dependency 'bundler'
24
24
  spec.add_development_dependency 'rake'
25
25
  spec.add_development_dependency 'rspec'
26
26
  spec.add_development_dependency 'wwtd'
27
- spec.add_development_dependency 'rails', '>= 4.2'
27
+ spec.add_development_dependency 'rails', '>= 5.2'
28
28
  spec.add_development_dependency 'sqlite3'
29
29
  spec.add_development_dependency 'byebug'
30
30
  end
@@ -0,0 +1,3 @@
1
+ //= link_tree ../images
2
+ //= link_directory ../javascripts .js
3
+ //= link_directory ../stylesheets .css
@@ -19,9 +19,8 @@ module Dummy
19
19
  # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}').to_s]
20
20
  # config.i18n.default_locale = :de
21
21
 
22
- # Do not swallow errors in after_commit/after_rollback callbacks.
23
- if Rails.version > '4.2' && Rails.version < '5.0'
24
- config.active_record.raise_in_transactional_callbacks = true
22
+ if Rails.version < '6.0'
23
+ config.active_record.sqlite3.represent_boolean_as_integer = true
25
24
  end
26
25
  end
27
26
  end
@@ -18,7 +18,6 @@ Dummy::Application.configure do
18
18
  config.static_cache_control = 'public, max-age=3600'
19
19
  end
20
20
 
21
-
22
21
  # Show full error reports and disable caching.
23
22
  config.consider_all_requests_local = true
24
23
  config.action_controller.perform_caching = false
@@ -42,4 +41,13 @@ Dummy::Application.configure do
42
41
 
43
42
  # Raises error for missing translations
44
43
  # config.action_view.raise_on_missing_translations = true
44
+
45
+ # Simulate default production logging configuration
46
+ if Rails.version < '5.1'
47
+ config.log_formatter = ::Logger::Formatter.new
48
+ else
49
+ logger = ActiveSupport::Logger.new(STDOUT)
50
+ logger.formatter = config.log_formatter
51
+ config.logger = ActiveSupport::TaggedLogging.new(logger)
52
+ end
45
53
  end
@@ -2,4 +2,4 @@ source 'https://rubygems.org'
2
2
 
3
3
  gemspec path: '../../'
4
4
 
5
- gem 'rails', '~> 4.2.0'
5
+ gem 'rails', '~> 5.2.0'
@@ -2,4 +2,4 @@ source 'https://rubygems.org'
2
2
 
3
3
  gemspec path: '../../'
4
4
 
5
- gem 'rails', '~> 5.0.0'
5
+ gem 'rails', '~> 6.0.0'
@@ -2,4 +2,4 @@ source 'https://rubygems.org'
2
2
 
3
3
  gemspec path: '../../'
4
4
 
5
- gem 'rails', '~> 5.1.0'
5
+ gem 'rails', '~> 6.1.0'
@@ -1,47 +1,108 @@
1
1
  require 'spec_helper'
2
2
 
3
3
  describe PaulBunyan::MetadataLogging do
4
- subject { Object.new }
5
- let(:formatter) { double('formatter') }
4
+ context "with a formatter that supports metadata" do
5
+ subject { Object.new }
6
+ let(:formatter) { double('formatter') }
6
7
 
7
- before do
8
- subject.extend(PaulBunyan::MetadataLogging)
9
- allow(subject).to receive(:formatter).and_return(formatter)
10
- end
8
+ before do
9
+ subject.extend(PaulBunyan::MetadataLogging)
10
+ allow(subject).to receive(:formatter).and_return(formatter)
11
+ end
11
12
 
12
- it 'must delegate clear_metadata! to the formatter' do
13
- expect(formatter).to receive(:clear_metadata!)
14
- subject.clear_metadata!
15
- end
13
+ it 'must delegate clear_metadata! to the formatter' do
14
+ expect(formatter).to receive(:clear_metadata!)
15
+ subject.clear_metadata!
16
+ end
16
17
 
17
- it 'must delegate with_metadata to the formatter' do
18
- expect(formatter).to receive(:with_metadata).with(foo: 'bar').and_yield
19
- subject.with_metadata(foo: 'bar') do |logger|
20
- expect(subject).to eq logger
18
+ it 'must delegate with_metadata to the formatter' do
19
+ expect(formatter).to receive(:with_metadata).with(foo: 'bar').and_yield
20
+ subject.with_metadata(foo: 'bar') do |logger|
21
+ expect(subject).to eq logger
22
+ end
21
23
  end
22
- end
23
24
 
24
- context '#flush' do
25
- it 'clears metadata on the formatter' do
26
- expect(formatter).to receive(:clear_metadata!)
27
- subject.flush
25
+ it 'must delegate add_metadata to the formatter' do
26
+ expect(formatter).to receive(:add_metadata).with(foo: 'bar')
27
+ subject.add_metadata(foo: 'bar')
28
28
  end
29
29
 
30
- it 'sends flush to a parent' do
31
- klass = Class.new
32
- klass.class_eval do
33
- def flush
34
- flush_behavior()
30
+ it 'must delegate current_metadata to the formatter' do
31
+ expect(formatter).to receive(:current_metadata).and_return({})
32
+ subject.current_metadata
33
+ end
34
+
35
+ it 'must delegate remove_metadata to the formatter' do
36
+ expect(formatter).to receive(:remove_metadata).with(foo: 'bar')
37
+ subject.remove_metadata(foo: 'bar')
38
+ end
39
+
40
+ context '#flush' do
41
+ it 'clears metadata on the formatter' do
42
+ expect(formatter).to receive(:clear_metadata!)
43
+ subject.flush
44
+ end
45
+
46
+ it 'sends flush to a parent' do
47
+ klass = Class.new
48
+ klass.class_eval do
49
+ def flush
50
+ flush_behavior()
51
+ end
35
52
  end
53
+
54
+ metadata_logger = klass.new
55
+ metadata_logger.extend(PaulBunyan::MetadataLogging)
56
+ allow(metadata_logger).to receive(:formatter).and_return(formatter)
57
+ allow(formatter).to receive(:clear_metadata!)
58
+
59
+ expect(metadata_logger).to receive(:flush_behavior)
60
+ metadata_logger.flush
36
61
  end
62
+ end
63
+ end
64
+
65
+ context "with a formatter that does not support metadata" do
66
+ subject { Object.new }
67
+ let(:formatter) { PaulBunyan::TextFormatter.new }
68
+
69
+ before do
70
+ subject.extend(PaulBunyan::MetadataLogging)
71
+ allow(subject).to receive(:formatter).and_return(formatter)
72
+ end
73
+
74
+ it 'must not call clear_metadata! on the formatter' do
75
+ expect(formatter).to_not respond_to(:clear_metadata!)
76
+ subject.clear_metadata!
77
+ end
78
+
79
+ it 'must delegate with_metadata to the formatter' do
80
+ expect(formatter).to_not respond_to(:with_metadata)
81
+ subject.with_metadata(foo: 'bar') do |logger|
82
+ expect(subject).to eq logger
83
+ end
84
+ end
85
+
86
+ it 'must delegate add_metadata to the formatter' do
87
+ expect(formatter).to_not respond_to(:add_metadata)
88
+ subject.add_metadata(foo: 'bar')
89
+ end
37
90
 
38
- metadata_logger = klass.new
39
- metadata_logger.extend(PaulBunyan::MetadataLogging)
40
- allow(metadata_logger).to receive(:formatter).and_return(formatter)
41
- allow(formatter).to receive(:clear_metadata!)
91
+ it 'must delegate current_metadata to the formatter' do
92
+ expect(formatter).to_not respond_to(:current_metadata)
93
+ subject.current_metadata
94
+ end
95
+
96
+ it 'must delegate remove_metadata to the formatter' do
97
+ expect(formatter).to_not respond_to(:remove_metadata)
98
+ subject.remove_metadata(foo: 'bar')
99
+ end
42
100
 
43
- expect(metadata_logger).to receive(:flush_behavior)
44
- metadata_logger.flush
101
+ context '#flush' do
102
+ it 'clears metadata on the formatter' do
103
+ expect(formatter).to_not respond_to(:clear_metadata!)
104
+ subject.flush
105
+ end
45
106
  end
46
107
  end
47
108
  end
@@ -32,10 +32,10 @@ module PaulBunyan
32
32
  end
33
33
 
34
34
  it 'must leave the ActionController::LogSubscriber subscription to deep_munge.action_controller in place' do
35
- # I don't expect that we'll ever care to unsubcribe the logger
36
- # non-event so we'll use it as a check to ensure we don't
37
- # clobber all of the listeners, only the ones we care about
38
- expect(subscriber_classes_for('logger.action_controller')).
35
+ # We do not currently support fragment cache logging so we'll use it as
36
+ # a check to ensure we don't clobber all of the listeners, only the
37
+ # ones we care about
38
+ expect(subscriber_classes_for('write_fragment.action_controller')).
39
39
  to include ActionController::LogSubscriber
40
40
  end
41
41
  end
metadata CHANGED
@@ -1,17 +1,17 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: paul_bunyan
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.0
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Duane Johnson
8
8
  - Kenneth Romney
9
9
  - Mark Severson
10
10
  - Tyler Pickett
11
- autorequire:
11
+ autorequire:
12
12
  bindir: bin
13
13
  cert_chain: []
14
- date: 2017-09-26 00:00:00.000000000 Z
14
+ date: 2021-03-16 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: request_store
@@ -31,16 +31,16 @@ dependencies:
31
31
  name: bundler
32
32
  requirement: !ruby/object:Gem::Requirement
33
33
  requirements:
34
- - - "~>"
34
+ - - ">="
35
35
  - !ruby/object:Gem::Version
36
- version: '1.5'
36
+ version: '0'
37
37
  type: :development
38
38
  prerelease: false
39
39
  version_requirements: !ruby/object:Gem::Requirement
40
40
  requirements:
41
- - - "~>"
41
+ - - ">="
42
42
  - !ruby/object:Gem::Version
43
- version: '1.5'
43
+ version: '0'
44
44
  - !ruby/object:Gem::Dependency
45
45
  name: rake
46
46
  requirement: !ruby/object:Gem::Requirement
@@ -89,14 +89,14 @@ dependencies:
89
89
  requirements:
90
90
  - - ">="
91
91
  - !ruby/object:Gem::Version
92
- version: '4.2'
92
+ version: '5.2'
93
93
  type: :development
94
94
  prerelease: false
95
95
  version_requirements: !ruby/object:Gem::Requirement
96
96
  requirements:
97
97
  - - ">="
98
98
  - !ruby/object:Gem::Version
99
- version: '4.2'
99
+ version: '5.2'
100
100
  - !ruby/object:Gem::Dependency
101
101
  name: sqlite3
102
102
  requirement: !ruby/object:Gem::Requirement
@@ -144,6 +144,7 @@ files:
144
144
  - Dockerfile
145
145
  - Gemfile
146
146
  - Guardfile
147
+ - Jenkinsfile
147
148
  - LICENSE.txt
148
149
  - README.md
149
150
  - Rakefile
@@ -169,6 +170,7 @@ files:
169
170
  - lib/tasks/paul_bunyan_tasks.rake
170
171
  - paul_bunyan.gemspec
171
172
  - spec/dummy/Rakefile
173
+ - spec/dummy/app/assets/config/manifest.js
172
174
  - spec/dummy/app/assets/images/.keep
173
175
  - spec/dummy/app/assets/javascripts/application.js
174
176
  - spec/dummy/app/assets/stylesheets/application.css
@@ -209,9 +211,9 @@ files:
209
211
  - spec/dummy/public/422.html
210
212
  - spec/dummy/public/500.html
211
213
  - spec/dummy/public/favicon.ico
212
- - spec/gemfiles/42.gemfile
213
- - spec/gemfiles/50.gemfile
214
- - spec/gemfiles/51.gemfile
214
+ - spec/gemfiles/52.gemfile
215
+ - spec/gemfiles/60.gemfile
216
+ - spec/gemfiles/61.gemfile
215
217
  - spec/lib/paul_bunyan/json_formatter_spec.rb
216
218
  - spec/lib/paul_bunyan/level_spec.rb
217
219
  - spec/lib/paul_bunyan/log_relayer_spec.rb
@@ -227,7 +229,7 @@ homepage: https://github.com/instructure/paul_bunyan
227
229
  licenses:
228
230
  - MIT
229
231
  metadata: {}
230
- post_install_message:
232
+ post_install_message:
231
233
  rdoc_options: []
232
234
  require_paths:
233
235
  - lib
@@ -242,13 +244,13 @@ required_rubygems_version: !ruby/object:Gem::Requirement
242
244
  - !ruby/object:Gem::Version
243
245
  version: '0'
244
246
  requirements: []
245
- rubyforge_project:
246
- rubygems_version: 2.6.13
247
- signing_key:
247
+ rubygems_version: 3.0.3
248
+ signing_key:
248
249
  specification_version: 4
249
250
  summary: Logging for all the things
250
251
  test_files:
251
252
  - spec/dummy/Rakefile
253
+ - spec/dummy/app/assets/config/manifest.js
252
254
  - spec/dummy/app/assets/images/.keep
253
255
  - spec/dummy/app/assets/javascripts/application.js
254
256
  - spec/dummy/app/assets/stylesheets/application.css
@@ -289,9 +291,9 @@ test_files:
289
291
  - spec/dummy/public/422.html
290
292
  - spec/dummy/public/500.html
291
293
  - spec/dummy/public/favicon.ico
292
- - spec/gemfiles/42.gemfile
293
- - spec/gemfiles/50.gemfile
294
- - spec/gemfiles/51.gemfile
294
+ - spec/gemfiles/52.gemfile
295
+ - spec/gemfiles/60.gemfile
296
+ - spec/gemfiles/61.gemfile
295
297
  - spec/lib/paul_bunyan/json_formatter_spec.rb
296
298
  - spec/lib/paul_bunyan/level_spec.rb
297
299
  - spec/lib/paul_bunyan/log_relayer_spec.rb