sensible_logging 0.1.0 → 0.4.2
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 +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
|
+
[](https://github.com/davidwinter/sensible_logging/actions?query=workflow%3Atest) [](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