klarna-app-loggers 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 6affdfa7906777baf322efc677477f4ff3d49aad
4
+ data.tar.gz: f40ebc08390ecf369e6eb890a7a2e2ab33112b8c
5
+ SHA512:
6
+ metadata.gz: 28bb60116338f429e6a41d26dd9875ddd98c8d07b197c937ed9fe6943d8959994dce7444a6b9d18258aba8ce4d02424521c4bf1aa5b13770ec68f5a7e0e46ebb
7
+ data.tar.gz: d4ef861c388ff242a1c9fe5352a3f6e63ebe52ed2c151db9588e501237963eb1a610a0568ad384356feef2352ca4e75d2a506a9af56f6e16286e371c0d6b11b8
@@ -0,0 +1,13 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+ /log/
11
+
12
+ # rspec failure tracking
13
+ .rspec_status
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --format documentation
2
+ --color
@@ -0,0 +1,5 @@
1
+ sudo: false
2
+ language: ruby
3
+ rvm:
4
+ - 2.3.3
5
+ before_install: gem install bundler -v 1.14.4
@@ -0,0 +1,14 @@
1
+ # CHANGELOG for Klarna App Loggers
2
+ You should follow the [keepachangelog](http://keepachangelog.com/) format
3
+
4
+ ## 1.2.0 (2017-10-18)
5
+ * [Mathias Klippinge & Tommy Gustafsson] Make it possible to set layout format to json for stdout
6
+
7
+ ## 1.1.0 (2017-02-20)
8
+ * [Mathias Klippinge] Fix the NoMethodError by not mutating the root log level, see https://github.com/TwP/logging/issues/61
9
+
10
+ ## 1.0.1 (2017-02-18)
11
+ * [Mathias Klippinge] Update readme and unlock gems
12
+
13
+ ## 1.0.0 (2017-02-17)
14
+ * [Mathias Klippinge] Extracted AppLogger into a gem
data/Gemfile ADDED
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+ source 'https://nexus.int.klarna.net/content/groups/publicgems'
3
+
4
+ # Specify your gem's dependencies in klarna-app-loggers.gemspec
5
+ gemspec
@@ -0,0 +1,54 @@
1
+ # Klarna App Loggers
2
+
3
+ Logger plugins for Faraday middleware and rack
4
+
5
+ ## Installation
6
+
7
+ Add this line to your application's Gemfile:
8
+
9
+ ```ruby
10
+ gem 'klarna-app-loggers'
11
+ ```
12
+
13
+ And then execute:
14
+
15
+ $ bundle
16
+
17
+ ## Usage
18
+ Require the libs:
19
+
20
+ ```
21
+ require 'app_logger'
22
+ require 'app_logger/faraday_middleware'
23
+ require 'app_logger/rack_middleware'
24
+ ```
25
+
26
+ To use with Faraday:
27
+
28
+ ```
29
+ Faraday::Request.register_middleware faraday_app_logger: AppLogger::FaradayMiddleware
30
+ ```
31
+
32
+ To use with Sinatra/Rack:
33
+
34
+ ```
35
+ class App < Sinatra::Base
36
+ configure do
37
+ use AppLogger::RackMiddleware
38
+ end
39
+ end
40
+ ```
41
+
42
+ ## Output format
43
+
44
+ The output format is json to file and human readable stdout by default. To change layout format for stdout to json, use `AppLogger.output_format = :json`
45
+
46
+ ## Development
47
+
48
+ After checking out the repo, run `bundle` to install dependencies. Then, run `rake spec` to run the tests.
49
+
50
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
51
+
52
+ ## Contributing
53
+
54
+ Bug reports and pull requests are welcome, https://stash.int.klarna.net/projects/GEMS/repos/klarna-app-loggers/
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
@@ -0,0 +1,33 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'app_logger/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = 'klarna-app-loggers'
8
+ spec.version = AppLogger::VERSION
9
+ spec.authors = ['Team Panda']
10
+ spec.email = ['panda.e@klarna.com']
11
+
12
+ spec.summary = %q{Helpful app loggers for Rack and Faraday}
13
+ spec.description = %q{Helpful app loggers for Rack and Faraday}
14
+ spec.homepage = 'https://stash.int.klarna.net/projects/GEMS/repos/klarna-app-loggers/'
15
+
16
+ spec.files = `git ls-files -z`.split("\x0").reject do |f|
17
+ f.match(%r{^(test|spec|features)/})
18
+ end
19
+ spec.bindir = 'exe'
20
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
21
+ spec.require_paths = ['lib']
22
+
23
+ spec.add_dependency 'logging'
24
+ spec.add_dependency 'faraday'
25
+ spec.add_dependency 'rack'
26
+
27
+ spec.add_development_dependency 'bundler', '~> 1.14'
28
+ spec.add_development_dependency 'rake', '~> 10.0'
29
+ spec.add_development_dependency 'rspec', '~> 3.0'
30
+ spec.add_development_dependency 'pry-byebug', '~> 3.0'
31
+ spec.add_development_dependency 'rack-test', '~> 0.6'
32
+ spec.add_development_dependency 'rspec-benchmark', '~> 0.2'
33
+ end
@@ -0,0 +1,31 @@
1
+ require 'logging'
2
+
3
+ module AppLogger
4
+ DATE_PATTERN = '%Y-%m-%dT%H:%M:%S:%L%zZ'
5
+ LOG_PATH = "log/#{ENV['RACK_ENV']}.log"
6
+
7
+ class << self
8
+ attr_accessor :silence_stdout
9
+ attr_accessor :output_format
10
+ end
11
+
12
+ def create_logger(level: :info)
13
+ FileUtils.mkdir_p(File.dirname(LOG_PATH))
14
+ Logging.backtrace(true)
15
+
16
+ json_layout = Logging.layouts.json(date_pattern: DATE_PATTERN)
17
+ stdout_layout = if AppLogger.output_format == :json
18
+ json_layout
19
+ else
20
+ Logging.layouts.pattern(date_pattern: DATE_PATTERN)
21
+ end
22
+
23
+ Logging.logger['App'].tap do |logger|
24
+ logger.appenders = if AppLogger.silence_stdout
25
+ [Logging.appenders.file(LOG_PATH, layout: json_layout)]
26
+ else
27
+ [Logging.appenders.file(LOG_PATH, layout: json_layout), Logging.appenders.stdout(layout: stdout_layout)]
28
+ end
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,45 @@
1
+ require 'faraday'
2
+
3
+ module AppLogger
4
+ class FaradayMiddleware < ::Faraday::Response::Middleware
5
+ include AppLogger
6
+
7
+ def initialize(app)
8
+ super(app)
9
+ @logger = create_logger
10
+ end
11
+
12
+ def call(env)
13
+ began_at = Time.now
14
+ response = @app.call(env)
15
+ status = env[:status]
16
+ log_method = success?(status) ? :info : :error
17
+
18
+ payload = {
19
+ request_method: env[:method].to_s.upcase,
20
+ url: env[:url].to_s,
21
+ status: status,
22
+ request_time: "#{Time.now - began_at}s",
23
+ x_request_id: env[:response_headers]['x-request-id']
24
+ }
25
+
26
+ if Object.const_defined?(:KlarnaCorrelationId)
27
+ payload.merge!({
28
+ klarna_correlation_id: KlarnaCorrelationId.current
29
+ })
30
+ end
31
+
32
+ @logger.public_send(log_method, payload)
33
+
34
+ response
35
+ end
36
+
37
+ private
38
+
39
+ def success?(status)
40
+ status >= 200 && status < 400
41
+ end
42
+ end
43
+ end
44
+
45
+ Faraday::Request.register_middleware faraday_app_logger: AppLogger::FaradayMiddleware
@@ -0,0 +1,79 @@
1
+ require 'rack'
2
+
3
+ module AppLogger
4
+ class RackMiddleware
5
+ include AppLogger
6
+
7
+ MASK = '***'.freeze
8
+ RACK_LOGGER = 'rack.logger'.freeze
9
+ SINATRA_ERROR = 'sinatra.error'.freeze
10
+ KLARNA_CORRELATION_ID = 'Klarna-Correlation-Id'.freeze
11
+
12
+ def initialize(app, options = {})
13
+ @app = app
14
+ @path_filter = options[:path_filter]
15
+ @masked_params = options[:masked_params]
16
+ @logger = create_logger
17
+ end
18
+
19
+ def call(env)
20
+ began_at = Time.now
21
+ env[RACK_LOGGER] = @logger
22
+ status, headers, body = @app.call(env)
23
+ body = Rack::BodyProxy.new(body) do
24
+ log(env, status, headers, began_at)
25
+ end
26
+ [status, headers, body]
27
+ end
28
+
29
+ private
30
+
31
+ def log(env, status, headers, began_at)
32
+ request = Rack::Request.new(env)
33
+ return if skip_path?(request)
34
+ headers_hash = Rack::Utils::HeaderHash.new(headers)
35
+ error = env[SINATRA_ERROR]
36
+
37
+ payload = {
38
+ remote_address: request.ip,
39
+ remote_user: env['REMOTE_USER'],
40
+ request_method: request.request_method,
41
+ path: request.fullpath,
42
+ status: status.to_s[0..3],
43
+ request_time: "#{Time.now - began_at}s",
44
+ params: mask_params(request)
45
+ }
46
+
47
+ if Object.const_defined?(:KlarnaCorrelationId)
48
+ payload.merge!({
49
+ klarna_correlation_id: headers_hash[KLARNA_CORRELATION_ID]
50
+ })
51
+ end
52
+
53
+ if error
54
+ @logger.error(payload.merge(
55
+ exception_class: error.class.to_s,
56
+ exception_message: error.message,
57
+ backtrace: error.backtrace
58
+ ))
59
+ else
60
+ @logger.info(payload)
61
+ end
62
+ end
63
+
64
+ def mask_params(request)
65
+ params = request.params
66
+ return params unless @masked_params
67
+
68
+ masked_params = params.map do |k, v|
69
+ @masked_params.include?(k) ? [k, MASK] : [k, v]
70
+ end
71
+
72
+ Hash[masked_params]
73
+ end
74
+
75
+ def skip_path?(request)
76
+ @path_filter && request.fullpath =~ @path_filter
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,3 @@
1
+ module AppLogger
2
+ VERSION = '1.2.0'
3
+ end
metadata ADDED
@@ -0,0 +1,181 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: klarna-app-loggers
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.2.0
5
+ platform: ruby
6
+ authors:
7
+ - Team Panda
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2017-10-18 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: logging
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: faraday
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rack
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'
55
+ - !ruby/object:Gem::Dependency
56
+ name: bundler
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.14'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1.14'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rake
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '10.0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '10.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rspec
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '3.0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '3.0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: pry-byebug
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '3.0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '3.0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: rack-test
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '0.6'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '0.6'
125
+ - !ruby/object:Gem::Dependency
126
+ name: rspec-benchmark
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - "~>"
130
+ - !ruby/object:Gem::Version
131
+ version: '0.2'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - "~>"
137
+ - !ruby/object:Gem::Version
138
+ version: '0.2'
139
+ description: Helpful app loggers for Rack and Faraday
140
+ email:
141
+ - panda.e@klarna.com
142
+ executables: []
143
+ extensions: []
144
+ extra_rdoc_files: []
145
+ files:
146
+ - ".gitignore"
147
+ - ".rspec"
148
+ - ".travis.yml"
149
+ - CHANGELOG.md
150
+ - Gemfile
151
+ - README.md
152
+ - Rakefile
153
+ - klarna-app-loggers.gemspec
154
+ - lib/app_logger.rb
155
+ - lib/app_logger/faraday_middleware.rb
156
+ - lib/app_logger/rack_middleware.rb
157
+ - lib/app_logger/version.rb
158
+ homepage: https://stash.int.klarna.net/projects/GEMS/repos/klarna-app-loggers/
159
+ licenses: []
160
+ metadata: {}
161
+ post_install_message:
162
+ rdoc_options: []
163
+ require_paths:
164
+ - lib
165
+ required_ruby_version: !ruby/object:Gem::Requirement
166
+ requirements:
167
+ - - ">="
168
+ - !ruby/object:Gem::Version
169
+ version: '0'
170
+ required_rubygems_version: !ruby/object:Gem::Requirement
171
+ requirements:
172
+ - - ">="
173
+ - !ruby/object:Gem::Version
174
+ version: '0'
175
+ requirements: []
176
+ rubyforge_project:
177
+ rubygems_version: 2.6.13
178
+ signing_key:
179
+ specification_version: 4
180
+ summary: Helpful app loggers for Rack and Faraday
181
+ test_files: []