klarna-app-loggers 1.2.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 +7 -0
- data/.gitignore +13 -0
- data/.rspec +2 -0
- data/.travis.yml +5 -0
- data/CHANGELOG.md +14 -0
- data/Gemfile +5 -0
- data/README.md +54 -0
- data/Rakefile +6 -0
- data/klarna-app-loggers.gemspec +33 -0
- data/lib/app_logger.rb +31 -0
- data/lib/app_logger/faraday_middleware.rb +45 -0
- data/lib/app_logger/rack_middleware.rb +79 -0
- data/lib/app_logger/version.rb +3 -0
- metadata +181 -0
checksums.yaml
ADDED
@@ -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
|
data/.gitignore
ADDED
data/.rspec
ADDED
data/.travis.yml
ADDED
data/CHANGELOG.md
ADDED
@@ -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
data/README.md
ADDED
@@ -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/
|
data/Rakefile
ADDED
@@ -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
|
data/lib/app_logger.rb
ADDED
@@ -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
|
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: []
|