loga 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (102) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +25 -0
  3. data/.rspec +2 -0
  4. data/.rubocop.yml +19 -0
  5. data/.rubocop_todo.yml +33 -0
  6. data/Appraisals +14 -0
  7. data/Gemfile +8 -0
  8. data/README.md +147 -0
  9. data/Rakefile +9 -0
  10. data/circle.yml +23 -0
  11. data/gemfiles/rails32.gemfile +11 -0
  12. data/gemfiles/rails40.gemfile +11 -0
  13. data/gemfiles/sinatra14.gemfile +11 -0
  14. data/gemfiles/unit.gemfile +9 -0
  15. data/lib/loga.rb +33 -0
  16. data/lib/loga/configuration.rb +96 -0
  17. data/lib/loga/event.rb +21 -0
  18. data/lib/loga/ext/rails/rack/logger3.rb +21 -0
  19. data/lib/loga/ext/rails/rack/logger4.rb +13 -0
  20. data/lib/loga/formatter.rb +104 -0
  21. data/lib/loga/parameter_filter.rb +65 -0
  22. data/lib/loga/rack/logger.rb +102 -0
  23. data/lib/loga/rack/request.rb +77 -0
  24. data/lib/loga/rack/request_id.rb +44 -0
  25. data/lib/loga/railtie.rb +139 -0
  26. data/lib/loga/tagged_logging.rb +76 -0
  27. data/lib/loga/utilities.rb +7 -0
  28. data/lib/loga/version.rb +3 -0
  29. data/loga.gemspec +31 -0
  30. data/spec/fixtures/README.md +8 -0
  31. data/spec/fixtures/rails32/Rakefile +7 -0
  32. data/spec/fixtures/rails32/app/controllers/application_controller.rb +28 -0
  33. data/spec/fixtures/rails32/app/helpers/application_helper.rb +2 -0
  34. data/spec/fixtures/rails32/app/views/layouts/application.html.erb +14 -0
  35. data/spec/fixtures/rails32/app/views/user.html.erb +1 -0
  36. data/spec/fixtures/rails32/config.ru +4 -0
  37. data/spec/fixtures/rails32/config/application.rb +71 -0
  38. data/spec/fixtures/rails32/config/boot.rb +6 -0
  39. data/spec/fixtures/rails32/config/environment.rb +5 -0
  40. data/spec/fixtures/rails32/config/environments/development.rb +26 -0
  41. data/spec/fixtures/rails32/config/environments/production.rb +50 -0
  42. data/spec/fixtures/rails32/config/environments/test.rb +35 -0
  43. data/spec/fixtures/rails32/config/initializers/backtrace_silencers.rb +7 -0
  44. data/spec/fixtures/rails32/config/initializers/inflections.rb +15 -0
  45. data/spec/fixtures/rails32/config/initializers/mime_types.rb +5 -0
  46. data/spec/fixtures/rails32/config/initializers/secret_token.rb +7 -0
  47. data/spec/fixtures/rails32/config/initializers/session_store.rb +8 -0
  48. data/spec/fixtures/rails32/config/initializers/wrap_parameters.rb +10 -0
  49. data/spec/fixtures/rails32/config/locales/en.yml +5 -0
  50. data/spec/fixtures/rails32/config/routes.rb +64 -0
  51. data/spec/fixtures/rails32/public/404.html +26 -0
  52. data/spec/fixtures/rails32/public/422.html +26 -0
  53. data/spec/fixtures/rails32/public/500.html +25 -0
  54. data/spec/fixtures/rails32/public/favicon.ico +0 -0
  55. data/spec/fixtures/rails32/public/index.html +241 -0
  56. data/spec/fixtures/rails32/public/robots.txt +5 -0
  57. data/spec/fixtures/rails32/script/rails +6 -0
  58. data/spec/fixtures/rails40/Rakefile +6 -0
  59. data/spec/fixtures/rails40/app/controllers/application_controller.rb +30 -0
  60. data/spec/fixtures/rails40/app/helpers/application_helper.rb +2 -0
  61. data/spec/fixtures/rails40/app/views/layouts/application.html.erb +14 -0
  62. data/spec/fixtures/rails40/app/views/user.html.erb +1 -0
  63. data/spec/fixtures/rails40/bin/bundle +3 -0
  64. data/spec/fixtures/rails40/bin/rails +4 -0
  65. data/spec/fixtures/rails40/bin/rake +4 -0
  66. data/spec/fixtures/rails40/config.ru +4 -0
  67. data/spec/fixtures/rails40/config/application.rb +37 -0
  68. data/spec/fixtures/rails40/config/boot.rb +4 -0
  69. data/spec/fixtures/rails40/config/environment.rb +5 -0
  70. data/spec/fixtures/rails40/config/environments/development.rb +24 -0
  71. data/spec/fixtures/rails40/config/environments/production.rb +65 -0
  72. data/spec/fixtures/rails40/config/environments/test.rb +39 -0
  73. data/spec/fixtures/rails40/config/initializers/backtrace_silencers.rb +7 -0
  74. data/spec/fixtures/rails40/config/initializers/filter_parameter_logging.rb +4 -0
  75. data/spec/fixtures/rails40/config/initializers/inflections.rb +16 -0
  76. data/spec/fixtures/rails40/config/initializers/mime_types.rb +5 -0
  77. data/spec/fixtures/rails40/config/initializers/secret_token.rb +12 -0
  78. data/spec/fixtures/rails40/config/initializers/session_store.rb +3 -0
  79. data/spec/fixtures/rails40/config/initializers/wrap_parameters.rb +9 -0
  80. data/spec/fixtures/rails40/config/locales/en.yml +23 -0
  81. data/spec/fixtures/rails40/config/routes.rb +62 -0
  82. data/spec/fixtures/rails40/public/404.html +58 -0
  83. data/spec/fixtures/rails40/public/422.html +58 -0
  84. data/spec/fixtures/rails40/public/500.html +57 -0
  85. data/spec/fixtures/rails40/public/favicon.ico +0 -0
  86. data/spec/fixtures/rails40/public/robots.txt +5 -0
  87. data/spec/integration/rails/railtie_spec.rb +64 -0
  88. data/spec/integration/rails/request_spec.rb +42 -0
  89. data/spec/integration/sinatra_spec.rb +54 -0
  90. data/spec/spec_helper.rb +39 -0
  91. data/spec/support/helpers.rb +16 -0
  92. data/spec/support/request_spec.rb +183 -0
  93. data/spec/support/timecop_shared.rb +7 -0
  94. data/spec/unit/loga/configuration_spec.rb +123 -0
  95. data/spec/unit/loga/event_spec.rb +20 -0
  96. data/spec/unit/loga/formatter_spec.rb +186 -0
  97. data/spec/unit/loga/parameter_filter_spec.rb +76 -0
  98. data/spec/unit/loga/rack/logger_spec.rb +114 -0
  99. data/spec/unit/loga/rack/request_spec.rb +70 -0
  100. data/spec/unit/loga/utilities_spec.rb +16 -0
  101. data/spec/unit/loga_spec.rb +41 -0
  102. metadata +357 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: feb7e0fc4418e6763bb4cbe7cd0a381e8f0edf09
4
+ data.tar.gz: 7ee939ed4ba16283823ca2ca8f77bd9148e145b3
5
+ SHA512:
6
+ metadata.gz: 71a379ec8c9659592d58dc1c0fae6096d00c6ed457368d26013970108ee4957141a5323620d931824768c2304ff04d95a1b707d90e893f3a2c0c3751054cb725
7
+ data.tar.gz: 3d71749a93556d196ea112fefa59cf26544a5b883dbda8044238ee759dde6dee71956ff74c4cbf1caaa06a088fd514de7f584ffdef6cc4699e7ae7984e661578
@@ -0,0 +1,25 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ *.bundle
19
+ *.so
20
+ *.o
21
+ *.a
22
+ *.gem
23
+ mkmf.log
24
+ spec/fixtures/**/*.log
25
+ gemfiles/*.lock
data/.rspec ADDED
@@ -0,0 +1,2 @@
1
+ --color
2
+ --require spec_helper
@@ -0,0 +1,19 @@
1
+ inherit_from: .rubocop_todo.yml
2
+
3
+ AllCops:
4
+ Exclude:
5
+ - 'spec/fixtures/**/*'
6
+ - '*.gemspec'
7
+
8
+ Style/TrailingComma:
9
+ Enabled: true
10
+ EnforcedStyleForMultiline: comma
11
+
12
+ Style/BlockDelimiters:
13
+ Enabled: false
14
+
15
+ Style/FormatString:
16
+ Enabled: false
17
+
18
+ Style/PerlBackrefs:
19
+ Enabled: false
@@ -0,0 +1,33 @@
1
+ # This configuration was generated by `rubocop --auto-gen-config`
2
+ # on 2015-06-18 23:19:09 +0100 using RuboCop version 0.30.1.
3
+ # The point is for the user to remove these configuration records
4
+ # one by one as the offenses are removed from the code base.
5
+ # Note that changes in the inspected code, or installation of new
6
+ # versions of RuboCop, may require this file to be generated again.
7
+
8
+ # Offense count: 2
9
+ Lint/HandleExceptions:
10
+ Enabled: false
11
+
12
+ # Offense count: 2
13
+ Lint/RescueException:
14
+ Enabled: false
15
+
16
+ # Offense count: 4
17
+ Metrics/AbcSize:
18
+ Max: 29
19
+
20
+ # Offense count: 16
21
+ # Configuration parameters: AllowURI, URISchemes.
22
+ Metrics/LineLength:
23
+ Max: 93
24
+
25
+ # Offense count: 8
26
+ # Configuration parameters: CountComments.
27
+ Metrics/MethodLength:
28
+ Max: 22
29
+
30
+ # Offense count: 14
31
+ Style/Documentation:
32
+ Enabled: false
33
+
@@ -0,0 +1,14 @@
1
+ appraise 'rails32' do
2
+ gem 'rails', '~> 3.2.0'
3
+ end
4
+
5
+ appraise 'rails40' do
6
+ gem 'rails', '~> 4.0.0'
7
+ end
8
+
9
+ appraise 'sinatra14' do
10
+ gem 'sinatra', '~> 1.4.0'
11
+ end
12
+
13
+ appraise 'unit' do
14
+ end
data/Gemfile ADDED
@@ -0,0 +1,8 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in loga.gemspec
4
+ gemspec
5
+
6
+ group :test do
7
+ gem 'codeclimate-test-reporter', require: false
8
+ end
@@ -0,0 +1,147 @@
1
+ # Loga [![Build Status](https://circleci.com/gh/FundingCircle/loga/tree/master.svg?style=shield&circle-token=9b81c3cf8468a8c3dc760f4c0398cf8914cb27d4)](https://circleci.com/gh/FundingCircle/loga/tree/master) [![Code Quality](https://codeclimate.com/repos/5563694f6956805723005d2f/badges/8eecb9144730614fb39e/gpa.svg)](https://codeclimate.com/repos/5563694f6956805723005d2f/feed) [![Test Coverage](https://codeclimate.com/repos/5563694f6956805723005d2f/badges/8eecb9144730614fb39e/coverage.svg)](https://codeclimate.com/repos/5563694f6956805723005d2f/coverage)
2
+
3
+ ## Description
4
+
5
+ Loga defines a single log format, logger and middleware logger
6
+ to faciliate log aggregation.
7
+
8
+ It provides:
9
+ - Rack logger middleware to log HTTP requests
10
+ - Ruby logger
11
+
12
+ ## Installation
13
+
14
+ Add this line to your application's Gemfile:
15
+
16
+ gem 'loga', git: 'git@github.com:FundingCircle/loga.git'
17
+
18
+ And then execute:
19
+
20
+ $ bundle
21
+
22
+ ## Usage
23
+
24
+ Loga integrates well with Rails and Sinatra frameworks. It also works in projects
25
+ using plain Ruby.
26
+
27
+ ### Rails applications
28
+
29
+ In Rails applications initialization and middleware insertion is catered by
30
+ the Railtie.
31
+
32
+ ```ruby
33
+ # config/environments/production.rb
34
+ ...
35
+ config.loga.configure do |loga|
36
+ # See configuration section
37
+ end
38
+ ...
39
+ ```
40
+
41
+ ### Ruby and Sinatra/Rack applications
42
+
43
+ In Ruby applications Loga must be required and configured.
44
+
45
+ ```ruby
46
+ # .../initializers/loga.rb
47
+ require 'loga'
48
+
49
+ Loga.configure do |loga|
50
+ # See configuration section
51
+ end
52
+ Loga.initialize!
53
+ ```
54
+ Log requests in Rack applications with Loga middleware.
55
+
56
+ `RequestId` and `Logger` must be inserted early in the middleware chain.
57
+
58
+ ```ruby
59
+ # config.ru
60
+ use Loga::Rack::RequestId
61
+ use Loga::Rack::Logger, Loga.logger
62
+
63
+ user Marketplace
64
+ run Sinatra::Application
65
+ ```
66
+
67
+ ### Configuration
68
+
69
+ | Option | Type | Default | Description |
70
+ |-----------------|---------------|---------|----------------------------------------------------------------------------------------------------|
71
+ | host | String | nil | Service hostname. When nil the hostname is computed with `Socket.gethostname` |
72
+ | service_version | String/Symbol | :git | Service version is embedded in every message. When Symbol the version is computed with a strategy. |
73
+ | service_name | String | nil | Service name is embedded in every message |
74
+ | device | IO | nil | The device the logger writes to |
75
+ | sync | Boolean | true | Sync IO |
76
+ | level | Symbol | :info | The level to logger logs at |
77
+ | enabled | Boolean | true | Enable/Disable Loga in Rails |
78
+
79
+ ## Sample output
80
+
81
+ ```ruby
82
+ # Anywhere in your application
83
+ Loga.logger.info('Hello World')
84
+ ```
85
+ ```json
86
+ //GELF Output
87
+ {
88
+ "version": "1.1",
89
+ "host": "example.com",
90
+ "short_message": "Hello World",
91
+ "timestamp": 1450150205.123,
92
+ "level": 6,
93
+ "_service.name": "marketplace",
94
+ "_service.version": "v1.0.0",
95
+ "_tags": []
96
+ }
97
+ ```
98
+
99
+ ## Event types
100
+
101
+ Middleware augment payload with the `type` key to label events.
102
+
103
+ | event type | description | middleware |
104
+ |-------------------|-----------------------------------|-------------------------|
105
+ | request | HTTP request and response | Rack |
106
+
107
+ ## Caveat
108
+
109
+ - Loga formats timestamps in seconds since UNIX epoch with 3 decimal places
110
+ for milliseconds. Which is in accordance with GELF 1.1 specification.
111
+
112
+
113
+ ## Road Map
114
+
115
+ Consult the [milestones](https://github.com/FundingCircle/loga/milestones).
116
+
117
+ ## Contributing
118
+
119
+ ### Overview
120
+
121
+ 1. Fork it ( https://github.com/FundingCircle/loga/fork )
122
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
123
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
124
+ 4. Push to the branch (`git push origin my-new-feature`)
125
+ 5. Create a new Pull Request
126
+
127
+ ### Running tests
128
+
129
+ This project uses [`appraisal`](https://github.com/thoughtbot/appraisal/tree/v2.0.2) to run tests against different versions of dependencies (e.g. Rails, Sinatra).
130
+
131
+ Once you have run bundle, you can install the test dependencies with `bundle exec appraisal install`.
132
+
133
+ Run all tests with `bundle exec appraisal rspec`.
134
+
135
+ You can run tests for one appraisal with `bundle exec appraisal appraisal-name rspec`.
136
+
137
+ With Rack applications prepend RACK\_ENV to switch between environments `RACK_ENV=production bundle exec appraisal rspec`
138
+
139
+ Refer to the [Appraisals](https://github.com/FundingCircle/loga/blob/master/Appraisals) file for a complete lists of appraisals.
140
+
141
+ ## Credits
142
+
143
+ - [LogStashLogger](https://github.com/dwbutler/logstash-logger)
144
+ - [Rails](https://github.com/rails/rails)
145
+ - [RackLogstasher](https://github.com/alphagov/rack-logstasher)
146
+
147
+ Copyright (c) 2015 Funding Circle. All rights reserved.
@@ -0,0 +1,9 @@
1
+ require 'bundler/gem_tasks'
2
+
3
+ require 'rspec/core/rake_task'
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ require 'rubocop/rake_task'
7
+ RuboCop::RakeTask.new(:rubocop)
8
+
9
+ task default: [:rubocop, :spec]
@@ -0,0 +1,23 @@
1
+ dependencies:
2
+ override:
3
+ - rvm-exec 1.9.3-p392 bundle install -j 4
4
+ - rvm-exec 1.9.3-p392 bundle exec appraisal install -j 4
5
+ - rvm-exec 2.0.0-p353 bundle install -j 4
6
+ - rvm-exec 2.0.0-p353 bundle exec appraisal install -j 4
7
+ - rvm-exec 2.2.2 bundle install -j 4
8
+ - rvm-exec 2.2.2 bundle exec appraisal install -j 4
9
+ test:
10
+ override:
11
+ - RACK_ENV=development rvm-exec 1.9.3-p392 bundle exec appraisal rspec
12
+ - RACK_ENV=production rvm-exec 1.9.3-p392 bundle exec appraisal rspec
13
+ - RACK_ENV=development rvm-exec 2.0.0-p353 bundle exec appraisal rspec
14
+ - RACK_ENV=production rvm-exec 2.0.0-p353 bundle exec appraisal rspec
15
+ - RACK_ENV=development rvm-exec 2.2.2 bundle exec appraisal rspec
16
+ - RACK_ENV=production rvm-exec 2.2.2 bundle exec appraisal rspec
17
+ - rvm-exec 2.2.2 bundle exec rubocop
18
+ deployment:
19
+ gemfury:
20
+ tag: /.*/
21
+ commands:
22
+ - "gem build loga.gemspec"
23
+ - "curl -F package=@$(ls -t1 loga-*.gem | head -1) ${GEMFURY_PUSH_URI}"
@@ -0,0 +1,11 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "rails", "~> 3.2.0"
6
+
7
+ group :test do
8
+ gem "codeclimate-test-reporter", :require => false
9
+ end
10
+
11
+ gemspec :path => "../"
@@ -0,0 +1,11 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "rails", "~> 4.0.0"
6
+
7
+ group :test do
8
+ gem "codeclimate-test-reporter", :require => false
9
+ end
10
+
11
+ gemspec :path => "../"
@@ -0,0 +1,11 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ gem "sinatra", "~> 1.4.0"
6
+
7
+ group :test do
8
+ gem "codeclimate-test-reporter", :require => false
9
+ end
10
+
11
+ gemspec :path => "../"
@@ -0,0 +1,9 @@
1
+ # This file was generated by Appraisal
2
+
3
+ source "https://rubygems.org"
4
+
5
+ group :test do
6
+ gem "codeclimate-test-reporter", :require => false
7
+ end
8
+
9
+ gemspec :path => "../"
@@ -0,0 +1,33 @@
1
+ require 'loga/version'
2
+ require 'loga/tagged_logging'
3
+ require 'loga/configuration'
4
+ require 'loga/utilities'
5
+ require 'loga/event'
6
+ require 'loga/formatter'
7
+ require 'loga/parameter_filter'
8
+ require 'loga/rack/logger'
9
+ require 'loga/rack/request'
10
+ require 'loga/rack/request_id'
11
+ require 'loga/railtie' if defined?(Rails)
12
+
13
+ module Loga
14
+ def self.configuration
15
+ @configuration ||= Configuration.new
16
+ end
17
+
18
+ def self.configure
19
+ yield configuration
20
+ end
21
+
22
+ def self.initialize!
23
+ configuration.initialize!
24
+ end
25
+
26
+ def self.logger
27
+ configuration.logger
28
+ end
29
+
30
+ def self.reset
31
+ @configuration = nil
32
+ end
33
+ end
@@ -0,0 +1,96 @@
1
+ require 'logger'
2
+ require 'socket'
3
+ require 'active_support'
4
+ require 'active_support/core_ext/object/blank'
5
+
6
+ module Loga
7
+ class Configuration
8
+ attr_accessor :service_name,
9
+ :service_version,
10
+ :device,
11
+ :sync,
12
+ :filter_parameters,
13
+ :level,
14
+ :host,
15
+ :enabled,
16
+ :silence_rails_rack_logger
17
+
18
+ attr_reader :logger
19
+
20
+ def initialize
21
+ @host = gethostname
22
+ @device = nil
23
+ @sync = true
24
+ @level = :info
25
+ @filter_parameters = []
26
+ @service_version = :git
27
+
28
+ # Rails specific configuration
29
+ @enabled = true
30
+ @silence_rails_rack_logger = true
31
+ end
32
+
33
+ def initialize!
34
+ @service_name.to_s.strip!
35
+ @service_version = compute_service_version
36
+
37
+ initialize_logger
38
+ end
39
+
40
+ def configure
41
+ yield self
42
+ end
43
+
44
+ private
45
+
46
+ class GitRevisionStrategy
47
+ DEFAULT_REVISION = 'unknown.sha'.freeze
48
+
49
+ def self.call
50
+ revision = fetch_revision if binary_available?
51
+ revision = DEFAULT_REVISION if revision.blank?
52
+ revision
53
+ end
54
+
55
+ def self.binary_available?
56
+ system 'which git'
57
+ end
58
+
59
+ def self.fetch_revision
60
+ `git rev-parse HEAD`.strip
61
+ end
62
+ end
63
+
64
+ def compute_service_version
65
+ service_version == :git ? GitRevisionStrategy.call : service_version.strip
66
+ end
67
+
68
+ def initialize_logger
69
+ device.sync = sync
70
+
71
+ logger = Logger.new(device)
72
+ logger.formatter = Formatter.new(
73
+ service_name: service_name,
74
+ service_version: service_version,
75
+ host: host,
76
+ )
77
+ logger.level = constantized_log_level
78
+ rescue
79
+ logger = Logger.new(STDERR)
80
+ logger.level = Logger::ERROR
81
+ logger.error 'Loga could not be initialized'
82
+ ensure
83
+ @logger = TaggedLogging.new(logger)
84
+ end
85
+
86
+ def constantized_log_level
87
+ Logger.const_get(level.to_s.upcase)
88
+ end
89
+
90
+ def gethostname
91
+ Socket.gethostname
92
+ rescue Exception
93
+ 'unknown.host'
94
+ end
95
+ end
96
+ end