loggery 0.1.0 → 0.2.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: c0b7a03ec7d234a7fde324b7c5d08f01cfad7f64
4
- data.tar.gz: 89318bb7a4a045a9248d0c78a7897fca044f738f
3
+ metadata.gz: 51aab323d0268f155d0cb2d3b4706a72409dda2d
4
+ data.tar.gz: f576a02b4fcebb0a6136cc471f546613177ec4e6
5
5
  SHA512:
6
- metadata.gz: ab421d8f289c4a5a059d6f0e1d651e2020a469099bf84adc808bce618d47843451ecc14ef5998c15abcde4482b1a2f3cf537ca355e839749a4edf6ba282b60f0
7
- data.tar.gz: 3ebff63c9e25d2b0ca1e73e571b102b27985265b63dc4622d69e998277ab94b2053d8f216a3d9e30b7729cff5053df060cf6f875dc9cbbc855391f65c1c51935
6
+ metadata.gz: 70609887ea649f271a3d362be6dd3b6adce2bbbccd1a3f2ccaf05e65b7a7efe756ee4dbaccaa079d49c1d6d72fad1d861fe4cf41f25056b0e29bd40cc593898a
7
+ data.tar.gz: 9e39ac654b31a0b58778a86b1db32eabd17177af5b066d1ec87c45d78181eba90894a25a2e3599bc071f9f9913a8efae07325b1e1779b7f344e443da663c8b1b
data/.gitignore CHANGED
@@ -14,3 +14,5 @@ log
14
14
 
15
15
  # rspec failure tracking
16
16
  .rspec_status
17
+
18
+ *.gemfile.lock
@@ -7,8 +7,9 @@ Style/StringLiterals:
7
7
  Metrics/LineLength:
8
8
  Max: 120
9
9
 
10
- Style/BlockLength:
10
+ Metrics/BlockLength:
11
11
  Exclude:
12
+ - loggery-gem.gemspec
12
13
  - 'spec/**/*.rb'
13
14
 
14
15
  Documentation:
@@ -17,5 +18,13 @@ Documentation:
17
18
  Style/Lambda:
18
19
  EnforcedStyle: literal
19
20
 
20
- Style/MethodLength:
21
+ Metrics/MethodLength:
21
22
  Max: 20
23
+
24
+ Style/FrozenStringLiteralComment:
25
+ Exclude:
26
+ - gemfiles/**/*
27
+
28
+ Layout/AlignHash:
29
+ EnforcedColonStyle: table
30
+ EnforcedHashRocketStyle: table
@@ -2,6 +2,15 @@ sudo: false
2
2
  language: ruby
3
3
  rvm:
4
4
  - 2.4.2
5
+ gemfile:
6
+ - gemfiles/rails4.2.gemfile
7
+ - gemfiles/rails5.0.gemfile
8
+ - gemfiles/rails5.1.gemfile
9
+ - gemfiles/rails5.2.gemfile
10
+ before_install:
11
+ - rvm use @global
12
+ - gem uninstall bundler -x
13
+ - gem install -v 1.17.2 bundler --no-rdoc --no-ri
5
14
  script:
6
15
  - bundle exec rubocop
7
16
  - bundle exec rspec
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ appraise "rails4.2" do
4
+ gem "rails", "~> 4.2.0"
5
+ end
6
+
7
+ appraise "rails5.0" do
8
+ gem "rails", "~> 5.0.0"
9
+ end
10
+
11
+ appraise "rails5.1" do
12
+ gem "rails", "~> 5.1.0"
13
+ end
14
+
15
+ appraise "rails5.2" do
16
+ gem "rails", "5.2.0.beta2"
17
+ end
data/README.md CHANGED
@@ -24,11 +24,17 @@ And then execute:
24
24
  $ bundle
25
25
 
26
26
  ### Basic Rails integration
27
+
28
+ To enable, add
29
+
27
30
  ```ruby
28
31
  config.loggery.enabled = true
29
32
  ```
30
33
 
31
- to your `config/application.rb`. In this basic setup, Loggery will save your log output to
34
+ to your `config/application.rb` or to the environment specific `config/staging.rb` and/or
35
+ `config/production.rb`.
36
+
37
+ In this basic setup, Loggery will save your log output to
32
38
  `log/logstash-<rails-env>.log` in JSON format. It will also:
33
39
  * use [lograge](https://github.com/roidrage/lograge) to create a single-line log entry for every
34
40
  Rails request including the db / view / total duration, controller name, action, http status, etc...
@@ -0,0 +1,2 @@
1
+ ---
2
+ BUNDLE_RETRY: "1"
@@ -0,0 +1,7 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "rails", "~> 4.2.0"
6
+
7
+ gemspec path: "../"
@@ -0,0 +1,7 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "rails", "~> 5.0.0"
6
+
7
+ gemspec path: "../"
@@ -0,0 +1,7 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "rails", "~> 5.1.0"
6
+
7
+ gemspec path: "../"
@@ -0,0 +1,7 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "rails", "5.2.0.beta2"
6
+
7
+ gemspec path: "../"
@@ -1,5 +1,10 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "lograge"
4
+ require "logstash-event"
5
+ require "logstash-logger"
6
+ require "rails"
7
+
3
8
  require "loggery/gem/version"
4
9
  require "loggery/util"
5
10
  require "loggery/controller/logging_context"
@@ -11,10 +16,6 @@ require "loggery/metadata/middleware/rack"
11
16
  require "loggery/metadata/middleware/sidekiq"
12
17
  require "loggery/railtie"
13
18
 
14
- require "lograge"
15
- require "logstash-event"
16
- require "logstash-logger"
17
-
18
19
  module Loggery
19
20
  def self.setup_sidekiq
20
21
  Loggery::Sidekiq::Setup.setup
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "active_support/concern"
4
+
3
5
  # Provides a hook in Rails controllers that allows enriching log lines from within a Rails request
4
6
  # with data that is available only within a controller action, for instance user information.
5
7
 
@@ -19,6 +21,7 @@ module Loggery
19
21
 
20
22
  def loggery_set_metadata
21
23
  return unless Loggery::Metadata::Store.store
24
+
22
25
  metadata = loggery_default_metadata.merge loggery_log_context
23
26
  Loggery::Metadata::Store.store.merge!(metadata)
24
27
  end
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Loggery
4
4
  module Gem
5
- VERSION = "0.1.0"
5
+ VERSION = "0.2.0"
6
6
  end
7
7
  end
@@ -6,33 +6,32 @@
6
6
  module Loggery
7
7
  module Metadata
8
8
  module LogstashEventUtil
9
- extend self
9
+ MAGIC_FIELDS = %i[type uid _id _type _source _all _parent _fieldnames _routing
10
+ _index _size _timestamp _ttl].freeze
10
11
 
11
- MAGIC_FIELDS = %i{type uid _id _type _source _all _parent _fieldnames _routing
12
- _index _size _timestamp _ttl }.freeze
13
-
14
- def event_metadata(event)
12
+ def self.event_metadata(event)
15
13
  return unless loglevel_includes_event?(event)
14
+
16
15
  stored_metadata = Loggery::Metadata::Store.store || {}
17
16
  metadata = default_metadata.merge(stored_metadata)
18
17
  set_logstash_event_metadata(event, metadata)
19
18
  end
20
19
 
21
- def set_logstash_event_metadata(event, metadata)
20
+ def self.set_logstash_event_metadata(event, metadata)
22
21
  metadata.each { |k, v| event[k] = v }
23
22
  fail_if_magic_fields_are_used(event)
24
23
  end
25
24
 
26
- def default_metadata
25
+ def self.default_metadata
27
26
  { pid: Process.pid }
28
27
  end
29
28
 
30
- def loglevel_includes_event?(event)
31
- severity = event['severity'].downcase
29
+ def self.loglevel_includes_event?(event)
30
+ severity = event["severity"].downcase
32
31
  Rails.logger.respond_to?(severity) && Rails.logger.public_send("#{severity}?")
33
32
  end
34
33
 
35
- def fail_if_magic_fields_are_used(event)
34
+ def self.fail_if_magic_fields_are_used(event)
36
35
  MAGIC_FIELDS.each do |magic_field|
37
36
  if event[magic_field.to_s].present? || event[magic_field.to_sym].present?
38
37
  raise "'#{magic_field}' is a reserved field name of logstash. It should not be set in a custom event"
@@ -12,7 +12,7 @@ module Loggery
12
12
 
13
13
  def call(env)
14
14
  Loggery::Metadata::Store.with_metadata(worker_type: "web",
15
- request_id: env["action_dispatch.request_id"]) do
15
+ request_id: env["action_dispatch.request_id"]) do
16
16
  @app.call(env)
17
17
  end
18
18
  end
@@ -13,15 +13,12 @@ module Loggery
13
13
  attr_accessor(:error_handler) { ->(e) { Sidekiq::Logging.logger.error(e) } }
14
14
  end
15
15
 
16
- def call(_worker, msg, queue)
17
- Loggery::Metadata::Store.with_metadata(jid: msg["jid"],
18
- thread_id: Thread.current.object_id.to_s(36),
19
- worker: msg["class"],
20
- args: msg["args"].inspect,
21
- queue: queue,
22
- retry_count: msg["retry_count"],
23
- worker_type: "sidekiq") do
24
- log_job_runtime(:sidekiq_job, "#{msg['class']} (#{msg['args']})") do
16
+ def call(_worker, message, queue)
17
+ Loggery::Metadata::Store.with_metadata(build_metadata(message, queue)) do
18
+ job_instance_name = "#{message['class']} (#{message['args']})"
19
+ log_job_start(message, job_instance_name)
20
+
21
+ log_job_runtime(:sidekiq_job, job_instance_name) do
25
22
  begin
26
23
  yield
27
24
  rescue StandardError => e
@@ -33,6 +30,31 @@ module Loggery
33
30
  end
34
31
  end
35
32
  end
33
+
34
+ private
35
+
36
+ def build_metadata(message, queue)
37
+ {
38
+ jid: message["jid"],
39
+ thread_id: Thread.current.object_id.to_s(36),
40
+ worker: message["class"],
41
+ args: message["args"].inspect,
42
+ queue: queue,
43
+ retry_count: message["retry_count"],
44
+ worker_type: "sidekiq"
45
+ }
46
+ end
47
+
48
+ def log_job_start(message, job_instance_name)
49
+ execution_delay =
50
+ (Time.current - Time.zone.at(message["enqueued_at"]) if message["enqueued_at"])
51
+
52
+ Rails.logger.info(
53
+ event_type: :sidekiq_job_started,
54
+ message: "Job type sidekiq_job - #{job_instance_name} started",
55
+ execution_delay: execution_delay
56
+ )
57
+ end
36
58
  end
37
59
  end
38
60
  end
@@ -1,5 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "rails/railtie"
4
+ require "rails/rack/logger"
5
+
3
6
  module Loggery
4
7
  module LogstashSetup
5
8
  def self.setup(config)
@@ -1,11 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require "active_support/core_ext/time/calculations"
4
+
3
5
  module Loggery
4
6
  module Util
5
- def log_job_runtime(job_type, job_instance_name = nil)
6
- job_name = ["Job type #{job_type}", job_instance_name].compact.join " - "
7
-
8
- Rails.logger.info event_type: :"#{job_type}_started", message: "#{job_name} started"
7
+ def log_job_runtime(job_type, job_instance_name)
8
+ job_name = "Job type #{job_type} - #{job_instance_name}"
9
9
 
10
10
  begin
11
11
  start_time = Time.current
@@ -15,8 +15,8 @@ module Loggery
15
15
  duration = end_time - start_time
16
16
 
17
17
  Rails.logger.info event_type: :"#{job_type}_finished",
18
- message: "#{job_name} finished",
19
- duration: duration
18
+ message: "#{job_name} finished",
19
+ duration: duration
20
20
  end
21
21
  end
22
22
  end
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- lib = File.expand_path("../lib", __FILE__)
3
+ lib = File.expand_path("lib", __dir__)
4
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
5
  require "loggery/gem/version"
6
6
 
@@ -21,13 +21,17 @@ Gem::Specification.new do |spec|
21
21
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
22
22
  spec.require_paths = ["lib"]
23
23
 
24
+ spec.add_runtime_dependency "actionpack", ">= 4.2.0"
25
+ spec.add_runtime_dependency "activesupport", ">= 4.2.0"
24
26
  spec.add_runtime_dependency "lograge", "~> 0.6"
25
27
  spec.add_runtime_dependency "logstash-event", "~> 1.2"
26
28
  spec.add_runtime_dependency "logstash-logger", "~> 0.25"
27
- spec.add_runtime_dependency "rails", ">= 4.0"
29
+ spec.add_runtime_dependency "railties", ">= 4.2.0"
28
30
 
31
+ spec.add_development_dependency "appraisal"
29
32
  spec.add_development_dependency "bundler", "~> 1.14"
30
33
  spec.add_development_dependency "pry-byebug"
34
+ spec.add_development_dependency "rails", ">= 4.2.0"
31
35
  spec.add_development_dependency "rake", "~> 10.0"
32
36
  spec.add_development_dependency "rspec"
33
37
  spec.add_development_dependency "rubocop"
metadata CHANGED
@@ -1,15 +1,43 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: loggery
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.0
4
+ version: 0.2.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Simon Stemplinger
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-12-05 00:00:00.000000000 Z
11
+ date: 2019-01-16 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: actionpack
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 4.2.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 4.2.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: activesupport
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: 4.2.0
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: 4.2.0
13
41
  - !ruby/object:Gem::Dependency
14
42
  name: lograge
15
43
  requirement: !ruby/object:Gem::Requirement
@@ -53,19 +81,33 @@ dependencies:
53
81
  - !ruby/object:Gem::Version
54
82
  version: '0.25'
55
83
  - !ruby/object:Gem::Dependency
56
- name: rails
84
+ name: railties
57
85
  requirement: !ruby/object:Gem::Requirement
58
86
  requirements:
59
87
  - - ">="
60
88
  - !ruby/object:Gem::Version
61
- version: '4.0'
89
+ version: 4.2.0
62
90
  type: :runtime
63
91
  prerelease: false
64
92
  version_requirements: !ruby/object:Gem::Requirement
65
93
  requirements:
66
94
  - - ">="
67
95
  - !ruby/object:Gem::Version
68
- version: '4.0'
96
+ version: 4.2.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
  - !ruby/object:Gem::Dependency
70
112
  name: bundler
71
113
  requirement: !ruby/object:Gem::Requirement
@@ -94,6 +136,20 @@ dependencies:
94
136
  - - ">="
95
137
  - !ruby/object:Gem::Version
96
138
  version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: rails
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: 4.2.0
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: 4.2.0
97
153
  - !ruby/object:Gem::Dependency
98
154
  name: rake
99
155
  requirement: !ruby/object:Gem::Requirement
@@ -175,11 +231,17 @@ files:
175
231
  - ".rspec"
176
232
  - ".rubocop.yml"
177
233
  - ".travis.yml"
234
+ - Appraisals
178
235
  - CODE_OF_CONDUCT.md
179
236
  - Gemfile
180
237
  - LICENSE.txt
181
238
  - README.md
182
239
  - Rakefile
240
+ - gemfiles/.bundle/config
241
+ - gemfiles/rails4.2.gemfile
242
+ - gemfiles/rails5.0.gemfile
243
+ - gemfiles/rails5.1.gemfile
244
+ - gemfiles/rails5.2.gemfile
183
245
  - lib/loggery.rb
184
246
  - lib/loggery/controller/logging_context.rb
185
247
  - lib/loggery/gem/version.rb
@@ -212,7 +274,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
212
274
  version: '0'
213
275
  requirements: []
214
276
  rubyforge_project:
215
- rubygems_version: 2.5.1
277
+ rubygems_version: 2.5.2
216
278
  signing_key:
217
279
  specification_version: 4
218
280
  summary: Generate logstash compatible log output from Rails apps.