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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 573a3b8040fec85373dc5f2a00a82655e51ebe08d28b31c1a4dbfa3f18b0147f
4
- data.tar.gz: 4d7d894842e36853317062862cd99577d9f61b78ad73fbbe909315ff14f8ecd6
3
+ metadata.gz: 9e38e81bacc78dc2cab4f5883bda17d8046982278eeff8f26b24e083439de8e7
4
+ data.tar.gz: 1043a629d3441cd7058b5be4545bae2abb06ec094d68fcfaa9e9604068f1e044
5
5
  SHA512:
6
- metadata.gz: a8dea52bb2451b3bdcdce68b1ff75f5cfaa385b2321d9027b687f5b8bd27c5cef56d68fa197081a79cc0b4c11303e706867ad3ba6dd3ddba07c2f89b0a3f5004
7
- data.tar.gz: 6b1ebcc33d6b13a5e4ce19307d538f4387ccfbd0e5cf5dcbc45d4729786e7ea2f41f917e80bed39d8c4b7aadf521aacb60e49061a23737581d23cfe907baac44
6
+ metadata.gz: 53f1b8eec5fcbb81457253943e1367bd3393e81955971e1a17ceee61df5594b2072407a51ca903c7e70605eff30d5855f55634251a2874a8217db0b2a46248ee
7
+ data.tar.gz: 15446e3ae903c6a5506e2af6a6f438da7ead8087456d89cf504ddfa4c4471f0218b6d9f57a099f443c78fc80192c0f56b81ea1b669d46b5c768cfc4c67e481b1
@@ -0,0 +1 @@
1
+ github: [davidwinter]
@@ -0,0 +1,6 @@
1
+ version: 2
2
+ updates:
3
+ - package-ecosystem: "bundler"
4
+ directory: "/"
5
+ schedule:
6
+ interval: "daily"
@@ -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
@@ -1,2 +1,3 @@
1
1
  Gemfile.lock
2
2
  pkg
3
+ coverage
data/.rubocop.yml ADDED
@@ -0,0 +1,15 @@
1
+ AllCops:
2
+ NewCops: enable
3
+ SuggestExtensions: false
4
+
5
+ require: rubocop-rspec
6
+
7
+ Layout/LineLength:
8
+ Max: 120
9
+
10
+ RSpec/MultipleMemoizedHelpers:
11
+ Enabled: false
12
+
13
+ Metrics/BlockLength:
14
+ Exclude:
15
+ - 'spec/**/*.rb'
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- 2.5.0
1
+ 2.6.1
data/.simplecov ADDED
@@ -0,0 +1,9 @@
1
+ # frozen_string_literal: true
2
+
3
+ SimpleCov.start do
4
+ minimum_coverage 100
5
+ if ENV['CI']
6
+ require 'codecov'
7
+ SimpleCov.formatter = SimpleCov::Formatter::Codecov
8
+ end
9
+ end
data/README.md CHANGED
@@ -1,41 +1,148 @@
1
- # Sensible logging
1
+ # Sensible Logging
2
2
 
3
- Proof of concept for some sensible defaults for logging in a Sinatra app.
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
- Plan will be to wrap this up in a single self contained gem that can easily be dropped into existing Sinatra applications.
5
+ > A logging extension with sensible defaults for Sinatra apps.
6
6
 
7
7
  ## Features
8
8
 
9
- * Add (or use an existing) request ID for use in logs
10
- * Trim the request logs to the bare minimal (method, path, status, duration and params if a GET request) - similar to lograge with Rails
11
- * Tagged logging out of the box, with some sensible defaults; host, environment and request ID
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
- ## Demo
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
- There is an example Sinatra app included in this repo, so:
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 paramaters are not included, in this example `two` based on `config.ru`
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 hook into Sentry reports.
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
- ## Using
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
- Key thing is to wrap the Sinatra app in `sensible_logging` (as in `config.ru`) with your required options for logger, log tags and excluded parameters.
144
+ ## License
38
145
 
39
- ## Todo
146
+ MIT
40
147
 
41
- Need to ensure `sensible_logging` confirms to all of the relevant `productionisation` checklist items. Pretty much there though.
148
+ [link_lograge]: https://github.com/roidrage/lograge#lograge---taming-rails-default-request-logging
data/Rakefile CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'bundler/gem_tasks'
2
4
  require 'rspec/core/rake_task'
3
5
 
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
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative './app'
4
+
5
+ run App
@@ -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
- def sensible_logging(app:, logger:, log_tags: [], exclude_params: [], tld_length: 1)
6
- use RequestId
7
- use TaggedLogger, logger, log_tags, tld_length
8
- use RequestLogger, exclude_params
47
+ private
9
48
 
10
- app.before do
11
- env['rack.errors'] = env['rack.logger'] = env['logger']
12
- if app.settings.log_level != nil
13
- logger.level = app.settings.log_level
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
- app
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,5 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'securerandom'
2
4
 
5
+ # Captures request id
3
6
  class RequestId
4
7
  def initialize(app)
5
8
  @app = app
@@ -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
- message = "method=#{req.request_method} path=#{req.path} status=#{status} duration=#{end_time}"
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? && ! filtered_params.empty?
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.select { |x| ! @filtered_params.include?(x) }
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(app, logger = Logger.new(STDOUT), tags = [], tld_length = 1)
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
- @tags = tags
9
- @tags = default_tags if tags.empty?
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
- @tld_length = tld_length
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 subdomain(req)
30
- domain_parts = req.host.split('.')
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
- main_domain_length = @tld_length + 1
33
- subdomain_length = domain_parts.length - main_domain_length
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
- domain_parts[0...subdomain_length].join('.')
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
- tags = @tags.map do |tag|
63
+ @tags.map do |tag|
41
64
  tag.call(req)
42
65
  end
43
66
  end
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module SensibleLogging
2
- VERSION = "0.1.0"
4
+ VERSION = '0.4.2'
3
5
  end
@@ -1,31 +1,38 @@
1
+ # frozen_string_literal: true
1
2
 
2
- lib = File.expand_path('../lib', __FILE__)
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 = ['sre@madetech.com']
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/madetech/sensible_logging'
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 'sinatra', '~> 2.0'
26
- spec.add_development_dependency 'puma', '~> 3.12'
27
- spec.add_development_dependency 'bundler', '~> 1.16'
28
- spec.add_development_dependency 'rake', '~> 10.0'
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 'pry', '~> 0.12.2'
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.1.0
4
+ version: 0.4.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - David Winter
8
8
  - Mark Sta Ana
9
- autorequire:
9
+ - Anthony King
10
+ autorequire:
10
11
  bindir: bin
11
12
  cert_chain: []
12
- date: 2019-01-07 00:00:00.000000000 Z
13
+ date: 2021-06-14 00:00:00.000000000 Z
13
14
  dependencies:
14
15
  - !ruby/object:Gem::Dependency
15
- name: rack
16
+ name: activesupport
16
17
  requirement: !ruby/object:Gem::Requirement
17
18
  requirements:
18
19
  - - "~>"
19
20
  - !ruby/object:Gem::Version
20
- version: '2.0'
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.0'
28
+ version: '5.2'
28
29
  - !ruby/object:Gem::Dependency
29
- name: activesupport
30
+ name: rack
30
31
  requirement: !ruby/object:Gem::Requirement
31
32
  requirements:
32
33
  - - "~>"
33
34
  - !ruby/object:Gem::Version
34
- version: '5.2'
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: '5.2'
42
+ version: '2.0'
42
43
  - !ruby/object:Gem::Dependency
43
- name: sinatra
44
+ name: bundler
44
45
  requirement: !ruby/object:Gem::Requirement
45
46
  requirements:
46
47
  - - "~>"
47
48
  - !ruby/object:Gem::Version
48
- version: '2.0'
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: '2.0'
56
+ version: 2.2.0
56
57
  - !ruby/object:Gem::Dependency
57
- name: puma
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: '3.12'
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: '3.12'
84
+ version: 0.14.1
70
85
  - !ruby/object:Gem::Dependency
71
- name: bundler
86
+ name: puma
72
87
  requirement: !ruby/object:Gem::Requirement
73
88
  requirements:
74
89
  - - "~>"
75
90
  - !ruby/object:Gem::Version
76
- version: '1.16'
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: '1.16'
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: '10.0'
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: '10.0'
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: pry
128
+ name: rubocop
114
129
  requirement: !ruby/object:Gem::Requirement
115
130
  requirements:
116
131
  - - "~>"
117
132
  - !ruby/object:Gem::Version
118
- version: 0.12.2
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: 0.12.2
126
- description:
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
- - sre@madetech.com
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/madetech/sensible_logging
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: '0'
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
- rubyforge_project:
168
- rubygems_version: 2.7.3
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
@@ -1,11 +0,0 @@
1
- #\ --quiet
2
- require 'logger'
3
- require './app'
4
- require './lib/sensible_logging'
5
-
6
- run sensible_logging(
7
- app: App,
8
- logger: Logger.new(STDOUT),
9
- log_tags: TaggedLogger.default_tags + [lambda { |req| [req.port] }],
10
- exclude_params: ['two']
11
- )