sensible_logging 0.1.0 → 0.4.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/FUNDING.yml +1 -0
- data/.github/dependabot.yml +6 -0
- data/.github/workflows/test.yml +27 -0
- data/.gitignore +1 -0
- data/.rubocop.yml +15 -0
- data/.ruby-version +1 -1
- data/.simplecov +9 -0
- data/README.md +123 -16
- data/Rakefile +2 -0
- data/examples/app.rb +38 -0
- data/examples/config.ru +5 -0
- data/lib/sensible_logging.rb +62 -9
- data/lib/sensible_logging/helpers/logger_io_wrap.rb +23 -0
- data/lib/sensible_logging/helpers/subdomain_parser.rb +25 -0
- data/lib/sensible_logging/middlewares/request_id.rb +3 -0
- data/lib/sensible_logging/middlewares/request_logger.rb +9 -4
- data/lib/sensible_logging/middlewares/tagged_logger.rb +40 -17
- data/lib/sensible_logging/version.rb +3 -1
- data/sensible_logging.gemspec +17 -10
- metadata +96 -33
- data/app.rb +0 -22
- data/config.ru +0 -11
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 9e38e81bacc78dc2cab4f5883bda17d8046982278eeff8f26b24e083439de8e7
|
4
|
+
data.tar.gz: 1043a629d3441cd7058b5be4545bae2abb06ec094d68fcfaa9e9604068f1e044
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 53f1b8eec5fcbb81457253943e1367bd3393e81955971e1a17ceee61df5594b2072407a51ca903c7e70605eff30d5855f55634251a2874a8217db0b2a46248ee
|
7
|
+
data.tar.gz: 15446e3ae903c6a5506e2af6a6f438da7ead8087456d89cf504ddfa4c4471f0218b6d9f57a099f443c78fc80192c0f56b81ea1b669d46b5c768cfc4c67e481b1
|
data/.github/FUNDING.yml
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
github: [davidwinter]
|
@@ -0,0 +1,27 @@
|
|
1
|
+
name: test
|
2
|
+
|
3
|
+
on:
|
4
|
+
push:
|
5
|
+
branches: [ main ]
|
6
|
+
pull_request:
|
7
|
+
branches: [ main ]
|
8
|
+
|
9
|
+
jobs:
|
10
|
+
test:
|
11
|
+
|
12
|
+
runs-on: ubuntu-latest
|
13
|
+
strategy:
|
14
|
+
matrix:
|
15
|
+
ruby-version: ['2.6', '2.7', '3.0']
|
16
|
+
|
17
|
+
steps:
|
18
|
+
- uses: actions/checkout@v2
|
19
|
+
- name: Set up Ruby
|
20
|
+
uses: ruby/setup-ruby@v1
|
21
|
+
with:
|
22
|
+
ruby-version: ${{ matrix.ruby-version }}
|
23
|
+
bundler-cache: true
|
24
|
+
- name: Run tests
|
25
|
+
run: bundle exec rspec --backtrace
|
26
|
+
- name: Run linting
|
27
|
+
run: bundle exec rubocop
|
data/.gitignore
CHANGED
data/.rubocop.yml
ADDED
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.
|
1
|
+
2.6.1
|
data/.simplecov
ADDED
data/README.md
CHANGED
@@ -1,41 +1,148 @@
|
|
1
|
-
# Sensible
|
1
|
+
# Sensible Logging
|
2
2
|
|
3
|
-
|
3
|
+
[![test](https://github.com/davidwinter/sensible_logging/workflows/test/badge.svg)](https://github.com/davidwinter/sensible_logging/actions?query=workflow%3Atest) [![Gem](https://img.shields.io/gem/dtv/sensible_logging)](https://rubygems.org/gems/sensible_logging)
|
4
4
|
|
5
|
-
|
5
|
+
> A logging extension with sensible defaults for Sinatra apps.
|
6
6
|
|
7
7
|
## Features
|
8
8
|
|
9
|
-
* Add (or use an existing
|
10
|
-
* Trim the request logs to the bare minimal (
|
11
|
-
*
|
9
|
+
* Add a request UUID (or use an existing one if present in the `X-Request-Id` HTTP header) for use in logs, your app or other middlewares
|
10
|
+
* Trim the request logs to the bare minimal (inspired by lograge):
|
11
|
+
* method
|
12
|
+
* path
|
13
|
+
* requesting IP address
|
14
|
+
* status
|
15
|
+
* duration
|
16
|
+
* params if a `GET` request
|
12
17
|
|
13
|
-
|
18
|
+
Example log line:
|
19
|
+
```
|
20
|
+
method=GET path=/contact client=192.168.1.254 status=200 duration=0.124 params={"category"=>"question"}
|
21
|
+
```
|
22
|
+
* Tagged logging, with some sensible defaults:
|
23
|
+
* severity
|
24
|
+
* subdomain
|
25
|
+
* environment
|
26
|
+
* request UUID
|
14
27
|
|
15
|
-
|
28
|
+
Example log line:
|
29
|
+
```
|
30
|
+
[INFO] [www.gb] [staging] [6004bb70-7b6d-43b6-a2cf-72d0336663ba] @todo tidy sql query
|
31
|
+
```
|
16
32
|
|
17
|
-
|
33
|
+
## Usage
|
34
|
+
|
35
|
+
1. Add `sensible_logging` to your `Gemfile` and install with `bundle install`:
|
36
|
+
|
37
|
+
```ruby
|
38
|
+
gem 'sensible_logging'
|
39
|
+
```
|
40
|
+
2. In your `app.rb` register the module and then define your logging configuration:
|
41
|
+
|
42
|
+
```ruby
|
43
|
+
require 'sensible_logging'
|
44
|
+
|
45
|
+
class App < Sinatra::Base
|
46
|
+
register Sinatra::SensibleLogging
|
47
|
+
|
48
|
+
# Initialise Sensible Logging to add our middlewares.
|
49
|
+
sensible_logging(
|
50
|
+
logger: Logger.new($stdout)
|
51
|
+
)
|
52
|
+
|
53
|
+
# Configure the log level for different environments
|
54
|
+
configure :production do
|
55
|
+
set :log_level, Logger::INFO
|
56
|
+
end
|
57
|
+
|
58
|
+
# Requests will be logged in a minimal format
|
59
|
+
get '/' do
|
60
|
+
'Hello!'
|
61
|
+
end
|
62
|
+
|
63
|
+
get '/about' do
|
64
|
+
# The standard Sinatra logger helper will use the Sensible Logging gem
|
65
|
+
logger.info('About page')
|
66
|
+
end
|
67
|
+
|
68
|
+
get '/contact' do
|
69
|
+
# In addition to the default tags, you can add additional ones by using the `tagged` block on the `logger` helper
|
70
|
+
# [INFO] [localhost] [development] [a9d0183d-a3c3-4081-b502-38dcf4c3c4d7] [todo] Contact page
|
71
|
+
logger.tagged('todo') do |logger|
|
72
|
+
logger.info('Contact page')
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
# rest of code omitted
|
77
|
+
```
|
78
|
+
|
79
|
+
### Available options
|
80
|
+
|
81
|
+
There are a number of options that you can pass into `sensible_logging`:
|
82
|
+
|
83
|
+
* `logger`: The logging object.
|
84
|
+
**Default**: `Logger.new($stdout)`
|
85
|
+
* `use_default_log_tags`: Includes the subdomain, `RACK_ENV` and unique request ID in the log tags.
|
86
|
+
**Default**: `true`
|
87
|
+
* `tld_length`: For example, if your domain was `www.google.com` this would result in `www` being tagged as your subdomain. If your domain is `www.google.co.uk`, set this value to `2` to correctly identify the subdomain as `www` rather than `www.google`.
|
88
|
+
**Default**: `1`.
|
89
|
+
* `log_tags`: An array of additional log tags to include. This can be strings, or you can include a `lambda` that will be evaluated. The `lambda` is passed a Rack `Request` object, and it must return an array of string values.
|
90
|
+
**Default**: `[]`
|
91
|
+
* `exclude_params`: An array of parameter names to be excluded from `GET` requests. By default, `GET` parameters are outputted in logs. If for example with the request `http://google.com/?one=dog&two=cat` you didn't want the `one` logged, you would set `exclude_params` to be `['one']`
|
92
|
+
**Default**: `[]`
|
93
|
+
* `include_log_severity`: Includes the log severity in the tagged output, such as `INFO`, `DEBUG` etc
|
94
|
+
**Default**: `true`
|
95
|
+
|
96
|
+
Sensible Logger will also respect the following Sinatra settings:
|
97
|
+
|
98
|
+
* `log_level`: The level at which your logger object should respect logs. See above example.
|
99
|
+
**Default**: `Logger::DEBUG`
|
100
|
+
|
101
|
+
## Examples
|
102
|
+
|
103
|
+
There is an example Sinatra app included in this repo. Here's how to use it:
|
104
|
+
|
105
|
+
```shell
|
18
106
|
bundle install
|
107
|
+
cd examples
|
19
108
|
rackup
|
20
109
|
```
|
21
110
|
|
22
111
|
With the app running, run some curl commands against it:
|
23
112
|
|
24
|
-
```
|
113
|
+
```shell
|
25
114
|
curl 'localhost:9292/hello?one=two&two=three'
|
26
115
|
```
|
27
116
|
|
28
117
|
You should notice in the logs:
|
29
118
|
|
30
119
|
* Standard Sinatra `logger` helper works out of the box within apps with tags.
|
31
|
-
* Excluded
|
120
|
+
* Excluded parameters are not included, in this example `two` based on `config.ru`
|
32
121
|
* The request log is minimal compared to out of the box Sinatra.
|
33
|
-
* `env['request_id']` is now available to
|
122
|
+
* `env['request_id']` is now available to group log lines from the same request together, or to use in additional services such as Sentry.
|
123
|
+
|
124
|
+
## FAQ
|
125
|
+
|
126
|
+
### Why is the timestamp absent?
|
127
|
+
|
128
|
+
To quote [lograge][link_lograge] (which was the inspiration for this library):
|
129
|
+
|
130
|
+
> The syntax is heavily inspired by the log output of the Heroku router. It doesn't include any timestamp by default, instead, it assumes you use a proper log formatter instead.
|
131
|
+
|
132
|
+
## Releasing
|
133
|
+
|
134
|
+
1. Update the version number `lib/sensible_logging/version.rb`
|
135
|
+
2. Create a git commit and tag with the new version number
|
136
|
+
3. Create a new PR with this change and once approved, merge to `main`
|
137
|
+
4. Create a new PR with changes in `main` to be merged into `stable` since the last release
|
138
|
+
5. Once approved and merged in, locally, run: `bundle exec rake release` which will build and push the new gem to Rubygems
|
139
|
+
|
140
|
+
## Authors
|
34
141
|
|
35
|
-
|
142
|
+
By [David Winter](https://github.com/davidwinter) with contributions from [Mark Sta Ana](https://github.com/booyaa) & [Anthony King](https://github.com/cybojenix)
|
36
143
|
|
37
|
-
|
144
|
+
## License
|
38
145
|
|
39
|
-
|
146
|
+
MIT
|
40
147
|
|
41
|
-
|
148
|
+
[link_lograge]: https://github.com/roidrage/lograge#lograge---taming-rails-default-request-logging
|
data/Rakefile
CHANGED
data/examples/app.rb
ADDED
@@ -0,0 +1,38 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'sinatra/base'
|
4
|
+
require 'logger'
|
5
|
+
|
6
|
+
require_relative '../lib/sensible_logging'
|
7
|
+
|
8
|
+
# Example Sinatra app
|
9
|
+
class App < Sinatra::Base
|
10
|
+
register Sinatra::SensibleLogging
|
11
|
+
|
12
|
+
sensible_logging(
|
13
|
+
logger: Logger.new($stdout),
|
14
|
+
log_tags: [->(req) { [req.port] }],
|
15
|
+
exclude_params: ['two']
|
16
|
+
)
|
17
|
+
|
18
|
+
configure do
|
19
|
+
set :log_level, Logger::DEBUG
|
20
|
+
end
|
21
|
+
|
22
|
+
configure :production do
|
23
|
+
set :log_level, Logger::INFO
|
24
|
+
end
|
25
|
+
|
26
|
+
get '/hello' do
|
27
|
+
logger.tagged('todo') do |logger|
|
28
|
+
logger.debug('test')
|
29
|
+
env['rack.errors'].puts('This is an example error')
|
30
|
+
end
|
31
|
+
'test'
|
32
|
+
end
|
33
|
+
|
34
|
+
post '/' do
|
35
|
+
logger.debug('posting')
|
36
|
+
'posted'
|
37
|
+
end
|
38
|
+
end
|
data/examples/config.ru
ADDED
data/lib/sensible_logging.rb
CHANGED
@@ -1,18 +1,71 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'sinatra/base'
|
4
|
+
|
1
5
|
require_relative './sensible_logging/middlewares/request_id'
|
2
6
|
require_relative './sensible_logging/middlewares/tagged_logger'
|
3
7
|
require_relative './sensible_logging/middlewares/request_logger'
|
8
|
+
require_relative './sensible_logging/helpers/logger_io_wrap'
|
9
|
+
|
10
|
+
module Rack
|
11
|
+
# Disable Rack::CommonLogger
|
12
|
+
class CommonLogger
|
13
|
+
def call(env)
|
14
|
+
@app.call(env)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
# Sinatra extension
|
20
|
+
module Sinatra
|
21
|
+
# Sensible logging library for Sinatra based Apps
|
22
|
+
module SensibleLogging
|
23
|
+
def sensible_logging( # rubocop:disable Metrics/MethodLength, Metrics/ParameterLists
|
24
|
+
logger: Logger.new($stdout),
|
25
|
+
log_tags: [],
|
26
|
+
use_default_log_tags: true,
|
27
|
+
exclude_params: [],
|
28
|
+
tld_length: 1,
|
29
|
+
include_log_severity: true
|
30
|
+
)
|
31
|
+
setup_middlewares(
|
32
|
+
logger: logger,
|
33
|
+
log_tags: log_tags,
|
34
|
+
use_default_log_tags: use_default_log_tags,
|
35
|
+
exclude_params: exclude_params,
|
36
|
+
tld_length: tld_length,
|
37
|
+
include_log_severity: include_log_severity
|
38
|
+
)
|
39
|
+
|
40
|
+
before do
|
41
|
+
env['rack.logger'] = env['logger']
|
42
|
+
env['rack.errors'] = IOWrap.new(logger, level: Logger::ERROR)
|
43
|
+
logger.level = settings.log_level unless settings.log_level.nil?
|
44
|
+
end
|
45
|
+
end
|
4
46
|
|
5
|
-
|
6
|
-
use RequestId
|
7
|
-
use TaggedLogger, logger, log_tags, tld_length
|
8
|
-
use RequestLogger, exclude_params
|
47
|
+
private
|
9
48
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
49
|
+
def setup_middlewares( # rubocop:disable Metrics/ParameterLists
|
50
|
+
logger:,
|
51
|
+
log_tags:,
|
52
|
+
use_default_log_tags:,
|
53
|
+
exclude_params:,
|
54
|
+
tld_length:,
|
55
|
+
include_log_severity:
|
56
|
+
)
|
57
|
+
use RequestId
|
58
|
+
use(
|
59
|
+
TaggedLogger,
|
60
|
+
logger: logger,
|
61
|
+
tags: log_tags,
|
62
|
+
use_default_tags: use_default_log_tags,
|
63
|
+
tld_length: tld_length,
|
64
|
+
include_log_severity: include_log_severity
|
65
|
+
)
|
66
|
+
use RequestLogger, exclude_params
|
14
67
|
end
|
15
68
|
end
|
16
69
|
|
17
|
-
|
70
|
+
register SensibleLogging
|
18
71
|
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'logger'
|
4
|
+
|
5
|
+
# Wrap Logger objects to behave as IO objects in Rack
|
6
|
+
class IOWrap
|
7
|
+
def initialize(logger, level: Logger::INFO)
|
8
|
+
@logger = logger
|
9
|
+
@level = level
|
10
|
+
end
|
11
|
+
|
12
|
+
def flush
|
13
|
+
# No-Op
|
14
|
+
end
|
15
|
+
|
16
|
+
def puts(message)
|
17
|
+
logger.add(level, message)
|
18
|
+
end
|
19
|
+
|
20
|
+
private
|
21
|
+
|
22
|
+
attr_reader :logger, :level
|
23
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Returns subdomains from a full qualified domain name
|
4
|
+
class SubdomainParser
|
5
|
+
attr_reader :tld_length
|
6
|
+
|
7
|
+
def initialize(tld_length: 1)
|
8
|
+
@tld_length = tld_length
|
9
|
+
end
|
10
|
+
|
11
|
+
def parse(host)
|
12
|
+
domain_parts = host.split('.')
|
13
|
+
|
14
|
+
return domain_parts[0] if domain_parts.size == 1
|
15
|
+
|
16
|
+
main_domain_length = tld_length + 1
|
17
|
+
subdomain_length = domain_parts.size - main_domain_length
|
18
|
+
|
19
|
+
subdomain_parts = domain_parts[0...subdomain_length]
|
20
|
+
|
21
|
+
return nil if subdomain_parts.empty?
|
22
|
+
|
23
|
+
subdomain_parts.join('.')
|
24
|
+
end
|
25
|
+
end
|
@@ -1,20 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'rack/request'
|
2
4
|
|
5
|
+
# Captures information around request
|
3
6
|
class RequestLogger
|
4
7
|
def initialize(app, filtered_params = [])
|
5
8
|
@app = app
|
6
9
|
@filtered_params = filtered_params
|
7
10
|
end
|
8
11
|
|
9
|
-
def call(env)
|
12
|
+
def call(env) # rubocop:disable Metrics/AbcSize
|
10
13
|
req = Rack::Request.new(env)
|
11
14
|
start_time = Time.now
|
12
15
|
status, headers, body = @app.call(env)
|
13
16
|
end_time = Time.now - start_time
|
14
17
|
|
15
|
-
|
18
|
+
client_ip = req.ip || 'n/a'
|
19
|
+
|
20
|
+
message = "method=#{req.request_method} path=#{req.path} client=#{client_ip} status=#{status} duration=#{end_time}"
|
16
21
|
filtered_params = filter_params(req)
|
17
|
-
message += " params=#{filtered_params}" if req.get? && !
|
22
|
+
message += " params=#{filtered_params}" if req.get? && !filtered_params.empty?
|
18
23
|
env['logger'].info(message)
|
19
24
|
[status, headers, body]
|
20
25
|
end
|
@@ -22,6 +27,6 @@ class RequestLogger
|
|
22
27
|
private
|
23
28
|
|
24
29
|
def filter_params(req)
|
25
|
-
req.params.
|
30
|
+
req.params.reject { |x| @filtered_params.include?(x) }
|
26
31
|
end
|
27
32
|
end
|
@@ -1,14 +1,31 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'ipaddr'
|
1
4
|
require 'active_support/tagged_logging'
|
5
|
+
require_relative '../helpers/subdomain_parser'
|
2
6
|
|
7
|
+
# Allow custom tags to be captured
|
3
8
|
class TaggedLogger
|
4
|
-
def initialize(
|
9
|
+
def initialize( # rubocop:disable Metrics/MethodLength
|
10
|
+
app,
|
11
|
+
options = {}
|
12
|
+
)
|
5
13
|
@app = app
|
6
|
-
@logger = ActiveSupport::TaggedLogging.new(logger)
|
7
14
|
|
8
|
-
|
9
|
-
|
15
|
+
options = {
|
16
|
+
logger: Logger.new($stdout),
|
17
|
+
tags: [],
|
18
|
+
use_default_tags: true,
|
19
|
+
tld_length: 1,
|
20
|
+
include_log_severity: true
|
21
|
+
}.merge(options)
|
22
|
+
|
23
|
+
options[:logger] = setup_severity_tag(options[:logger]) if options[:include_log_severity]
|
10
24
|
|
11
|
-
@
|
25
|
+
@logger = ActiveSupport::TaggedLogging.new(options[:logger])
|
26
|
+
@tags = []
|
27
|
+
@tags += default_tags(tld_length: options[:tld_length]) if options[:use_default_tags]
|
28
|
+
@tags += options[:tags]
|
12
29
|
end
|
13
30
|
|
14
31
|
def call(env)
|
@@ -18,26 +35,32 @@ class TaggedLogger
|
|
18
35
|
end
|
19
36
|
end
|
20
37
|
|
21
|
-
def default_tags
|
22
|
-
[lambda { |req|
|
23
|
-
[subdomain(req), ENV['RACK_ENV'], req.env['request_id']]
|
24
|
-
}]
|
25
|
-
end
|
26
|
-
|
27
38
|
private
|
28
39
|
|
29
|
-
def
|
30
|
-
|
40
|
+
def setup_severity_tag(logger)
|
41
|
+
original_formatter = logger.formatter || ActiveSupport::Logger::SimpleFormatter.new
|
42
|
+
logger.formatter = proc do |severity, *args|
|
43
|
+
"[#{severity}] #{original_formatter.call(severity, *args)}"
|
44
|
+
end
|
45
|
+
logger
|
46
|
+
end
|
31
47
|
|
32
|
-
|
33
|
-
|
48
|
+
def default_tags(tld_length: 1)
|
49
|
+
[lambda { |req|
|
50
|
+
[subdomain(req.host, tld_length) || 'n/a', ENV['RACK_ENV'], req.env['request_id']]
|
51
|
+
}]
|
52
|
+
end
|
34
53
|
|
35
|
-
|
54
|
+
def subdomain(host, tld_length)
|
55
|
+
IPAddr.new(host)
|
56
|
+
rescue IPAddr::InvalidAddressError
|
57
|
+
subdomain_parser = SubdomainParser.new(tld_length: tld_length)
|
58
|
+
subdomain_parser.parse(host)
|
36
59
|
end
|
37
60
|
|
38
61
|
def generate_tags(env)
|
39
62
|
req = Rack::Request.new(env)
|
40
|
-
|
63
|
+
@tags.map do |tag|
|
41
64
|
tag.call(req)
|
42
65
|
end
|
43
66
|
end
|
data/sensible_logging.gemspec
CHANGED
@@ -1,31 +1,38 @@
|
|
1
|
+
# frozen_string_literal: true
|
1
2
|
|
2
|
-
lib = File.expand_path('
|
3
|
+
lib = File.expand_path('lib', __dir__)
|
3
4
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
5
|
require 'sensible_logging/version'
|
5
6
|
|
6
7
|
Gem::Specification.new do |spec|
|
7
8
|
spec.name = 'sensible_logging'
|
8
9
|
spec.version = SensibleLogging::VERSION
|
9
|
-
spec.authors = ['David Winter', 'Mark Sta Ana']
|
10
|
-
spec.email = ['
|
10
|
+
spec.authors = ['David Winter', 'Mark Sta Ana', 'Anthony King']
|
11
|
+
spec.email = ['i@djw.me']
|
11
12
|
|
12
13
|
spec.summary = 'Sensible logging defaults for your Sinatra app'
|
13
|
-
spec.homepage = 'https://github.com/
|
14
|
+
spec.homepage = 'https://github.com/davidwinter/sensible_logging'
|
14
15
|
spec.license = 'MIT'
|
15
16
|
|
16
17
|
spec.files = `git ls-files -z`.split("\x0").reject do |f|
|
17
18
|
f.match(%r{^(test|spec|features)/})
|
18
19
|
end
|
19
20
|
|
21
|
+
spec.required_ruby_version = '>= 2.6'
|
22
|
+
|
20
23
|
spec.require_paths = ['lib']
|
21
24
|
|
22
|
-
spec.add_runtime_dependency 'rack', '~> 2.0'
|
23
25
|
spec.add_runtime_dependency 'activesupport', '~> 5.2'
|
26
|
+
spec.add_runtime_dependency 'rack', '~> 2.0'
|
24
27
|
|
25
|
-
spec.add_development_dependency '
|
26
|
-
spec.add_development_dependency '
|
27
|
-
spec.add_development_dependency '
|
28
|
-
spec.add_development_dependency '
|
28
|
+
spec.add_development_dependency 'bundler', '~> 2.2.0'
|
29
|
+
spec.add_development_dependency 'codecov'
|
30
|
+
spec.add_development_dependency 'pry', '~> 0.14.1'
|
31
|
+
spec.add_development_dependency 'puma', '~> 5.3'
|
32
|
+
spec.add_development_dependency 'rake', '~> 12.3'
|
29
33
|
spec.add_development_dependency 'rspec', '~> 3.0'
|
30
|
-
spec.add_development_dependency '
|
34
|
+
spec.add_development_dependency 'rubocop', '~> 1.16.1'
|
35
|
+
spec.add_development_dependency 'rubocop-rspec', '~> 2.4.0'
|
36
|
+
spec.add_development_dependency 'simplecov'
|
37
|
+
spec.add_development_dependency 'sinatra', '~> 2.0'
|
31
38
|
end
|
metadata
CHANGED
@@ -1,100 +1,115 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sensible_logging
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Winter
|
8
8
|
- Mark Sta Ana
|
9
|
-
|
9
|
+
- Anthony King
|
10
|
+
autorequire:
|
10
11
|
bindir: bin
|
11
12
|
cert_chain: []
|
12
|
-
date:
|
13
|
+
date: 2021-06-14 00:00:00.000000000 Z
|
13
14
|
dependencies:
|
14
15
|
- !ruby/object:Gem::Dependency
|
15
|
-
name:
|
16
|
+
name: activesupport
|
16
17
|
requirement: !ruby/object:Gem::Requirement
|
17
18
|
requirements:
|
18
19
|
- - "~>"
|
19
20
|
- !ruby/object:Gem::Version
|
20
|
-
version: '2
|
21
|
+
version: '5.2'
|
21
22
|
type: :runtime
|
22
23
|
prerelease: false
|
23
24
|
version_requirements: !ruby/object:Gem::Requirement
|
24
25
|
requirements:
|
25
26
|
- - "~>"
|
26
27
|
- !ruby/object:Gem::Version
|
27
|
-
version: '2
|
28
|
+
version: '5.2'
|
28
29
|
- !ruby/object:Gem::Dependency
|
29
|
-
name:
|
30
|
+
name: rack
|
30
31
|
requirement: !ruby/object:Gem::Requirement
|
31
32
|
requirements:
|
32
33
|
- - "~>"
|
33
34
|
- !ruby/object:Gem::Version
|
34
|
-
version: '
|
35
|
+
version: '2.0'
|
35
36
|
type: :runtime
|
36
37
|
prerelease: false
|
37
38
|
version_requirements: !ruby/object:Gem::Requirement
|
38
39
|
requirements:
|
39
40
|
- - "~>"
|
40
41
|
- !ruby/object:Gem::Version
|
41
|
-
version: '
|
42
|
+
version: '2.0'
|
42
43
|
- !ruby/object:Gem::Dependency
|
43
|
-
name:
|
44
|
+
name: bundler
|
44
45
|
requirement: !ruby/object:Gem::Requirement
|
45
46
|
requirements:
|
46
47
|
- - "~>"
|
47
48
|
- !ruby/object:Gem::Version
|
48
|
-
version:
|
49
|
+
version: 2.2.0
|
49
50
|
type: :development
|
50
51
|
prerelease: false
|
51
52
|
version_requirements: !ruby/object:Gem::Requirement
|
52
53
|
requirements:
|
53
54
|
- - "~>"
|
54
55
|
- !ruby/object:Gem::Version
|
55
|
-
version:
|
56
|
+
version: 2.2.0
|
56
57
|
- !ruby/object:Gem::Dependency
|
57
|
-
name:
|
58
|
+
name: codecov
|
59
|
+
requirement: !ruby/object:Gem::Requirement
|
60
|
+
requirements:
|
61
|
+
- - ">="
|
62
|
+
- !ruby/object:Gem::Version
|
63
|
+
version: '0'
|
64
|
+
type: :development
|
65
|
+
prerelease: false
|
66
|
+
version_requirements: !ruby/object:Gem::Requirement
|
67
|
+
requirements:
|
68
|
+
- - ">="
|
69
|
+
- !ruby/object:Gem::Version
|
70
|
+
version: '0'
|
71
|
+
- !ruby/object:Gem::Dependency
|
72
|
+
name: pry
|
58
73
|
requirement: !ruby/object:Gem::Requirement
|
59
74
|
requirements:
|
60
75
|
- - "~>"
|
61
76
|
- !ruby/object:Gem::Version
|
62
|
-
version:
|
77
|
+
version: 0.14.1
|
63
78
|
type: :development
|
64
79
|
prerelease: false
|
65
80
|
version_requirements: !ruby/object:Gem::Requirement
|
66
81
|
requirements:
|
67
82
|
- - "~>"
|
68
83
|
- !ruby/object:Gem::Version
|
69
|
-
version:
|
84
|
+
version: 0.14.1
|
70
85
|
- !ruby/object:Gem::Dependency
|
71
|
-
name:
|
86
|
+
name: puma
|
72
87
|
requirement: !ruby/object:Gem::Requirement
|
73
88
|
requirements:
|
74
89
|
- - "~>"
|
75
90
|
- !ruby/object:Gem::Version
|
76
|
-
version: '
|
91
|
+
version: '5.3'
|
77
92
|
type: :development
|
78
93
|
prerelease: false
|
79
94
|
version_requirements: !ruby/object:Gem::Requirement
|
80
95
|
requirements:
|
81
96
|
- - "~>"
|
82
97
|
- !ruby/object:Gem::Version
|
83
|
-
version: '
|
98
|
+
version: '5.3'
|
84
99
|
- !ruby/object:Gem::Dependency
|
85
100
|
name: rake
|
86
101
|
requirement: !ruby/object:Gem::Requirement
|
87
102
|
requirements:
|
88
103
|
- - "~>"
|
89
104
|
- !ruby/object:Gem::Version
|
90
|
-
version: '
|
105
|
+
version: '12.3'
|
91
106
|
type: :development
|
92
107
|
prerelease: false
|
93
108
|
version_requirements: !ruby/object:Gem::Requirement
|
94
109
|
requirements:
|
95
110
|
- - "~>"
|
96
111
|
- !ruby/object:Gem::Version
|
97
|
-
version: '
|
112
|
+
version: '12.3'
|
98
113
|
- !ruby/object:Gem::Dependency
|
99
114
|
name: rspec
|
100
115
|
requirement: !ruby/object:Gem::Requirement
|
@@ -110,46 +125,95 @@ dependencies:
|
|
110
125
|
- !ruby/object:Gem::Version
|
111
126
|
version: '3.0'
|
112
127
|
- !ruby/object:Gem::Dependency
|
113
|
-
name:
|
128
|
+
name: rubocop
|
114
129
|
requirement: !ruby/object:Gem::Requirement
|
115
130
|
requirements:
|
116
131
|
- - "~>"
|
117
132
|
- !ruby/object:Gem::Version
|
118
|
-
version:
|
133
|
+
version: 1.16.1
|
119
134
|
type: :development
|
120
135
|
prerelease: false
|
121
136
|
version_requirements: !ruby/object:Gem::Requirement
|
122
137
|
requirements:
|
123
138
|
- - "~>"
|
124
139
|
- !ruby/object:Gem::Version
|
125
|
-
version:
|
126
|
-
|
140
|
+
version: 1.16.1
|
141
|
+
- !ruby/object:Gem::Dependency
|
142
|
+
name: rubocop-rspec
|
143
|
+
requirement: !ruby/object:Gem::Requirement
|
144
|
+
requirements:
|
145
|
+
- - "~>"
|
146
|
+
- !ruby/object:Gem::Version
|
147
|
+
version: 2.4.0
|
148
|
+
type: :development
|
149
|
+
prerelease: false
|
150
|
+
version_requirements: !ruby/object:Gem::Requirement
|
151
|
+
requirements:
|
152
|
+
- - "~>"
|
153
|
+
- !ruby/object:Gem::Version
|
154
|
+
version: 2.4.0
|
155
|
+
- !ruby/object:Gem::Dependency
|
156
|
+
name: simplecov
|
157
|
+
requirement: !ruby/object:Gem::Requirement
|
158
|
+
requirements:
|
159
|
+
- - ">="
|
160
|
+
- !ruby/object:Gem::Version
|
161
|
+
version: '0'
|
162
|
+
type: :development
|
163
|
+
prerelease: false
|
164
|
+
version_requirements: !ruby/object:Gem::Requirement
|
165
|
+
requirements:
|
166
|
+
- - ">="
|
167
|
+
- !ruby/object:Gem::Version
|
168
|
+
version: '0'
|
169
|
+
- !ruby/object:Gem::Dependency
|
170
|
+
name: sinatra
|
171
|
+
requirement: !ruby/object:Gem::Requirement
|
172
|
+
requirements:
|
173
|
+
- - "~>"
|
174
|
+
- !ruby/object:Gem::Version
|
175
|
+
version: '2.0'
|
176
|
+
type: :development
|
177
|
+
prerelease: false
|
178
|
+
version_requirements: !ruby/object:Gem::Requirement
|
179
|
+
requirements:
|
180
|
+
- - "~>"
|
181
|
+
- !ruby/object:Gem::Version
|
182
|
+
version: '2.0'
|
183
|
+
description:
|
127
184
|
email:
|
128
|
-
-
|
185
|
+
- i@djw.me
|
129
186
|
executables: []
|
130
187
|
extensions: []
|
131
188
|
extra_rdoc_files: []
|
132
189
|
files:
|
190
|
+
- ".github/FUNDING.yml"
|
191
|
+
- ".github/dependabot.yml"
|
192
|
+
- ".github/workflows/test.yml"
|
133
193
|
- ".gitignore"
|
134
194
|
- ".rspec"
|
195
|
+
- ".rubocop.yml"
|
135
196
|
- ".ruby-version"
|
197
|
+
- ".simplecov"
|
136
198
|
- Gemfile
|
137
199
|
- LICENSE.txt
|
138
200
|
- README.md
|
139
201
|
- Rakefile
|
140
|
-
- app.rb
|
141
|
-
- config.ru
|
202
|
+
- examples/app.rb
|
203
|
+
- examples/config.ru
|
142
204
|
- lib/sensible_logging.rb
|
205
|
+
- lib/sensible_logging/helpers/logger_io_wrap.rb
|
206
|
+
- lib/sensible_logging/helpers/subdomain_parser.rb
|
143
207
|
- lib/sensible_logging/middlewares/request_id.rb
|
144
208
|
- lib/sensible_logging/middlewares/request_logger.rb
|
145
209
|
- lib/sensible_logging/middlewares/tagged_logger.rb
|
146
210
|
- lib/sensible_logging/version.rb
|
147
211
|
- sensible_logging.gemspec
|
148
|
-
homepage: https://github.com/
|
212
|
+
homepage: https://github.com/davidwinter/sensible_logging
|
149
213
|
licenses:
|
150
214
|
- MIT
|
151
215
|
metadata: {}
|
152
|
-
post_install_message:
|
216
|
+
post_install_message:
|
153
217
|
rdoc_options: []
|
154
218
|
require_paths:
|
155
219
|
- lib
|
@@ -157,16 +221,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
157
221
|
requirements:
|
158
222
|
- - ">="
|
159
223
|
- !ruby/object:Gem::Version
|
160
|
-
version: '
|
224
|
+
version: '2.6'
|
161
225
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
162
226
|
requirements:
|
163
227
|
- - ">="
|
164
228
|
- !ruby/object:Gem::Version
|
165
229
|
version: '0'
|
166
230
|
requirements: []
|
167
|
-
|
168
|
-
|
169
|
-
signing_key:
|
231
|
+
rubygems_version: 3.2.15
|
232
|
+
signing_key:
|
170
233
|
specification_version: 4
|
171
234
|
summary: Sensible logging defaults for your Sinatra app
|
172
235
|
test_files: []
|
data/app.rb
DELETED
@@ -1,22 +0,0 @@
|
|
1
|
-
require 'sinatra/base'
|
2
|
-
require 'logger'
|
3
|
-
|
4
|
-
class App < Sinatra::Base
|
5
|
-
configure do
|
6
|
-
set :log_level, Logger::DEBUG
|
7
|
-
end
|
8
|
-
|
9
|
-
configure :production do
|
10
|
-
set :log_level, Logger::INFO
|
11
|
-
end
|
12
|
-
|
13
|
-
get '/hello' do
|
14
|
-
logger.debug('test')
|
15
|
-
'test'
|
16
|
-
end
|
17
|
-
|
18
|
-
post '/' do
|
19
|
-
logger.debug('posting')
|
20
|
-
'posted'
|
21
|
-
end
|
22
|
-
end
|
data/config.ru
DELETED