loggerstash 0.0.5 → 1.0.1

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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: d8f736652eefc09aa22bc4a86e33d91de1d46e13c6b60bdab0a50d0be1cc2e7a
4
- data.tar.gz: f51fdcdc3c869fdc74dca9301714da16757280c1085e5537aec8788fa0acead7
3
+ metadata.gz: c4e961a1a3a243caad2487af5ef9d49ebe675d51cb85c54a615f40785ab8ad6c
4
+ data.tar.gz: befa0f4bc820cfb8340ac034796f782c72d62205a504e4f41fb7fabdab93f2c5
5
5
  SHA512:
6
- metadata.gz: c35c3dd71a70bc62a7c8a1537302fed8081890f6bd51f442534ffa431c67d0e0c55fa46a72df5d2158f8d84ddb2ff90131ec719009e92f4b895922799d9d20f2
7
- data.tar.gz: 1f8431d3d54f5bd226d36cf412922cd303ece288319835624f94e2536bddb5a699543eb219b2a3ecc4fce3453f847fb72afdc55a9f02eea7ee4d20a421d78548
6
+ metadata.gz: f67b43b36d38f959b3ebe58fc60cee20ce077813458a8fffd720216e3af123c0df9d598c4aab222a44227272a0a2c43636b7efcd703c2286b2146b4b87e90992
7
+ data.tar.gz: 5286e5307c1d7c552e08b6301e9d0ef98abd0fac340592bf1b221f7c8de73535d0b54628487bbff005ecd27cdd1501eecc15d72d5396384d3a402a8a33ff34db
data/.editorconfig ADDED
@@ -0,0 +1,7 @@
1
+ [*.rb]
2
+ indent_style = space
3
+ indent_size = 2
4
+ end_of_line = lf
5
+ insert_final_newline = true
6
+ charset = utf-8
7
+ trim_trailing_whitespace = true
@@ -0,0 +1,47 @@
1
+ ---
2
+ name: Loggerstash Tests
3
+
4
+ "on":
5
+ pull_request:
6
+ push:
7
+ branches:
8
+ - master
9
+ tags:
10
+ - v*
11
+
12
+ jobs:
13
+ build:
14
+ runs-on: ubuntu-latest
15
+ name: Ruby ${{ matrix.ruby }}
16
+ strategy:
17
+ matrix:
18
+ ruby: ["2.7", "2.6", "2.5"]
19
+ steps:
20
+ - uses: actions/checkout@v2
21
+ - uses: actions/setup-ruby@v1
22
+ with:
23
+ ruby-version: ${{ matrix.ruby }}
24
+ - name: Bundler cache
25
+ uses: actions/cache@v2
26
+ with:
27
+ path: vendor/bundle
28
+ key: ${{ runner.os }}-${{ matrix.ruby }}-gems-${{ hashFiles('**/Gemfile.lock') }}
29
+ restore-keys: |
30
+ ${{ runner.os }}-${{ matrix.ruby }}-gems-
31
+ - name: Setup gems
32
+ run: |
33
+ bundle config path vendor/bundle
34
+ bundle install --jobs 4
35
+ - name: Tests
36
+ run: bundle exec rake
37
+
38
+ publish:
39
+ if: contains(github.ref, 'refs/tags/v')
40
+ needs: build
41
+ runs-on: ubuntu-latest
42
+ steps:
43
+ - uses: actions/checkout@v2
44
+ - name: Release Gem
45
+ uses: discourse/publish-rubygems-action@main
46
+ env:
47
+ RUBYGEMS_API_KEY: ${{secrets.RUBYGEMS_API_KEY}}
data/.gitignore CHANGED
@@ -5,3 +5,7 @@ Gemfile.lock
5
5
  /coverage
6
6
  /.bundle
7
7
  /tmp
8
+ /.ruby-gemset
9
+ /.ruby-version
10
+
11
+ .rubocop-https---raw-githubusercontent-com-discourse-discourse-master--rubocop-yml
data/.rubocop.yml CHANGED
@@ -1,116 +1,7 @@
1
- AllCops:
2
- TargetRubyVersion: 2.4
3
- DisabledByDefault: true
4
- Exclude:
5
- - 'db/schema.rb'
6
- - 'bundle/**/*'
7
- - 'vendor/**/*'
8
- - 'node_modules/**/*'
9
- - 'public/**/*'
10
-
11
- # Prefer &&/|| over and/or.
12
- Style/AndOr:
13
- Enabled: true
14
-
15
- # Do not use braces for hash literals when they are the last argument of a
16
- # method call.
17
- Style/BracesAroundHashParameters:
18
- Enabled: true
19
-
20
- # Align `when` with `case`.
21
- Layout/CaseIndentation:
22
- Enabled: true
23
-
24
- # Align comments with method definitions.
25
- Layout/CommentIndentation:
26
- Enabled: true
27
-
28
- # No extra empty lines.
29
- Layout/EmptyLines:
30
- Enabled: true
31
-
32
- # Use Ruby >= 1.9 syntax for hashes. Prefer { a: :b } over { :a => :b }.
33
- Style/HashSyntax:
34
- Enabled: true
35
-
36
- # Two spaces, no tabs (for indentation).
37
- Layout/IndentationWidth:
38
- Enabled: true
39
-
40
- Layout/SpaceAfterColon:
41
- Enabled: true
42
-
43
- Layout/SpaceAfterComma:
44
- Enabled: true
45
-
46
- Layout/SpaceAroundEqualsInParameterDefault:
47
- Enabled: true
48
-
49
- Layout/SpaceAroundKeyword:
50
- Enabled: true
51
-
52
- Layout/SpaceAroundOperators:
53
- Enabled: true
54
-
55
- Layout/SpaceBeforeFirstArg:
56
- Enabled: true
57
-
58
- # Defining a method with parameters needs parentheses.
59
- Style/MethodDefParentheses:
60
- Enabled: true
61
-
62
- # Use `foo {}` not `foo{}`.
63
- Layout/SpaceBeforeBlockBraces:
64
- Enabled: true
65
-
66
- # Use `foo { bar }` not `foo {bar}`.
67
- Layout/SpaceInsideBlockBraces:
68
- Enabled: true
69
-
70
- # Use `{ a: 1 }` not `{a:1}`.
71
- Layout/SpaceInsideHashLiteralBraces:
72
- Enabled: true
73
-
74
- Layout/SpaceInsideParens:
75
- Enabled: true
76
-
77
- # Detect hard tabs, no hard tabs.
78
- Layout/Tab:
79
- Enabled: true
80
-
81
- # Blank lines should not have any spaces.
82
- Layout/TrailingBlankLines:
83
- Enabled: true
84
-
85
- # No trailing whitespace.
86
- Layout/TrailingWhitespace:
87
- Enabled: true
88
-
89
- Lint/Debugger:
90
- Enabled: true
91
-
92
- Layout/BlockAlignment:
93
- Enabled: true
94
-
95
- # Align `end` with the matching keyword or starting expression except for
96
- # assignments, where it should be aligned with the LHS.
97
- Layout/EndAlignment:
98
- Enabled: true
99
- EnforcedStyleAlignWith: variable
100
-
101
- # Use my_method(my_arg) not my_method( my_arg ) or my_method my_arg.
102
- Lint/RequireParentheses:
103
- Enabled: true
104
-
105
- Lint/ShadowingOuterLocalVariable:
106
- Enabled: true
107
-
108
- Layout/MultilineMethodCallIndentation:
109
- Enabled: true
110
- EnforcedStyle: indented
111
-
112
- Layout/AlignHash:
113
- Enabled: true
114
-
115
- Bundler/OrderedGems:
1
+ inherit_gem:
2
+ rubocop-discourse: default.yml
3
+ inherit_mode:
4
+ merge:
5
+ - Exclude
6
+ Layout/HashAlignment:
116
7
  Enabled: false
data/CONTRIBUTING.md CHANGED
@@ -1,5 +1,5 @@
1
1
  * If, heaven forbid, you find a security vulnerability, please e-mail
2
- `matt.palmer@discourse.org`.
2
+ `security@discourse.org`.
3
3
 
4
4
  * If you have found a discrepancy in documented and observed behaviour, that
5
5
  is a bug. Feel free to [report it as an
data/README.md CHANGED
@@ -135,7 +135,7 @@ conduct](CODE_OF_CONDUCT.md).
135
135
  Unless otherwise stated, everything in this repo is covered by the following
136
136
  copyright notice:
137
137
 
138
- Copyright (C) 2018 Civilized Discourse Construction Kit, Inc.
138
+ Copyright (C) 2018-2021 Civilized Discourse Construction Kit, Inc.
139
139
 
140
140
  This program is free software: you can redistribute it and/or modify it
141
141
  under the terms of the GNU General Public License version 3, as
data/lib/loggerstash.rb CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'logstash_writer'
2
4
  require 'thread'
3
5
 
@@ -14,36 +16,35 @@ class Loggerstash
14
16
  #
15
17
  class AlreadyRunningError < Error; end
16
18
 
17
- # Set the formatter proc to a new proc.
18
- #
19
- # The passed in proc must take four arguments: `severity`, `timestamp`,
20
- # `progname` and `message`. `timestamp` is a `Time`, all over arguments
21
- # are `String`s, and `progname` can possibly be `nil`. It must return a
22
- # Hash containing the parameters you wish to send to logstash.
23
- #
24
- attr_writer :formatter
25
-
26
19
  # A new Loggerstash!
27
20
  #
28
21
  # @param logstash_server [String] an address:port, hostname:port, or srvname
29
22
  # to which a `json_lines` logstash connection can be made.
23
+ #
30
24
  # @param metrics_registry [Prometheus::Client::Registry] where the metrics
31
25
  # which are used by the underlying `LogstashWriter` should be registered,
32
26
  # for later presentation by the Prometheus client.
27
+ #
33
28
  # @param formatter [Proc] a formatting proc which takes the same arguments
34
29
  # as the standard `Logger` formatter, but rather than emitting a string,
35
30
  # it should pass back a Hash containing all the fields you wish to send
36
31
  # to logstash.
32
+ #
37
33
  # @param logstash_writer [LogstashWriter] in the event that you've already
38
34
  # got a LogstashWriter instance configured, you can pass it in here. Note
39
35
  # that any values you've set for logstash_server and metrics_registry
40
36
  # will be ignored.
41
37
  #
42
- def initialize(logstash_server:, metrics_registry: nil, formatter: nil, logstash_writer: nil)
43
- @logstash_server = logstash_server
38
+ # @param logger [Logger] passed to the LogstashWriter we create. May or
39
+ # may not, itself, be attached to the Loggerstash for forwarding to
40
+ # logstash (Logception!).
41
+ #
42
+ def initialize(logstash_server:, metrics_registry: nil, formatter: nil, logstash_writer: nil, logger: nil)
43
+ @logstash_server = logstash_server
44
44
  @metrics_registry = metrics_registry
45
- @formatter = formatter
46
- @logstash_writer = logstash_writer
45
+ @formatter = formatter
46
+ @logstash_writer = logstash_writer
47
+ @logger = logger
47
48
 
48
49
  @op_mutex = Mutex.new
49
50
  end
@@ -60,20 +61,21 @@ class Loggerstash
60
61
  # benefit from the attachment; that's up to you to ensure.
61
62
  #
62
63
  def attach(obj)
64
+ run_writer
65
+
63
66
  @op_mutex.synchronize do
64
- obj.instance_variable_set(:@loggerstash, self)
67
+ obj.instance_variable_set(:@logstash_writer, @logstash_writer)
68
+ obj.instance_variable_set(:@loggerstash_formatter, @formatter)
65
69
 
66
70
  if obj.is_a?(Module)
67
71
  obj.prepend(Mixin)
68
72
  else
69
73
  obj.singleton_class.prepend(Mixin)
70
74
  end
71
-
72
- run_writer
73
75
  end
74
76
  end
75
77
 
76
- %i{logstash_server metrics_registry}.each do |sym|
78
+ %i{formatter logger logstash_server metrics_registry}.each do |sym|
77
79
  define_method(:"#{sym}=") do |v|
78
80
  @op_mutex.synchronize do
79
81
  if @logstash_writer
@@ -85,65 +87,25 @@ class Loggerstash
85
87
  end
86
88
  end
87
89
 
88
- # Send a logger message to logstash.
89
- #
90
- # @private
91
- #
92
- def log_message(s, t, p, m)
93
- @op_mutex.synchronize do
94
- if @logstash_writer.nil?
95
- #:nocov:
96
- run_writer
97
- #:nocov:
98
- end
99
-
100
- @logstash_writer.send_event((@formatter || default_formatter).call(s, t, p, m))
101
- end
102
- end
103
-
104
90
  private
105
91
 
106
92
  # Do the needful to get the writer going.
107
93
  #
108
- # This will error out unless the @op_mutex is held at the time the
109
- # method is called; we can't acquire it ourselves because some calls
110
- # to run_writer already need to hold the mutex.
111
- #
112
94
  def run_writer
113
- unless @op_mutex.owned?
114
- #:nocov:
115
- raise RuntimeError,
116
- "Must call run_writer while holding @op_mutex"
117
- #:nocov:
118
- end
119
-
120
- if @logstash_writer.nil?
121
- {}.tap do |opts|
122
- opts[:server_name] = @logstash_server
123
- if @metrics_registry
124
- opts[:metrics_registry] = @metrics_registry
95
+ @op_mutex.synchronize do
96
+ if @logstash_writer.nil?
97
+ {}.tap do |opts|
98
+ opts[:server_name] = @logstash_server
99
+ if @metrics_registry
100
+ opts[:metrics_registry] = @metrics_registry
101
+ end
102
+ if @logger
103
+ opts[:logger] = @logger
104
+ end
105
+
106
+ @logstash_writer = LogstashWriter.new(**opts)
107
+ @logstash_writer.start!
125
108
  end
126
-
127
- @logstash_writer = LogstashWriter.new(**opts)
128
- @logstash_writer.run
129
- end
130
- end
131
- end
132
-
133
- # Mangle the standard sev/time/prog/msg set into a minimal logstash
134
- # event.
135
- #
136
- def default_formatter
137
- @default_formatter ||= ->(s, t, p, m) do
138
- {
139
- "@timestamp": t.utc.strftime("%FT%T.%NZ"),
140
- "@metadata": { event_type: "loggerstash" },
141
- message: m,
142
- severity_name: s.downcase,
143
- hostname: Socket.gethostname,
144
- pid: $$,
145
- }.tap do |ev|
146
- ev[:progname] = p if p
147
109
  end
148
110
  end
149
111
  end
@@ -151,26 +113,41 @@ class Loggerstash
151
113
  # The methods needed to turn any Logger into a Loggerstash Logger.
152
114
  #
153
115
  module Mixin
116
+ attr_writer :logstash_writer, :loggerstash_formatter
117
+
154
118
  private
155
119
 
156
120
  # Hooking into this specific method may seem... unorthodox, but
157
121
  # it seemingly has an extremely stable interface and is the most
158
122
  # appropriate place to inject ourselves.
123
+ #
159
124
  def format_message(s, t, p, m)
160
- loggerstash.log_message(s, t, p, m)
125
+ loggerstash_log_message(s, t, p, m)
161
126
 
162
127
  super
163
128
  end
164
129
 
165
- # Find where our associated Loggerstash object is being held captive.
130
+ # Send a logger message to logstash.
131
+ #
132
+ def loggerstash_log_message(s, t, p, m)
133
+ logstash_writer.send_event(loggerstash_formatter.call(s, t, p, m))
134
+ end
135
+
136
+ # The current formatter for logstash-destined messages.
137
+ #
138
+ def loggerstash_formatter
139
+ @loggerstash_formatter ||= self.class.ancestors.find { |m| m.instance_variable_defined?(:@loggerstash_formatter) }.instance_variable_get(:@loggerstash_formatter) || default_loggerstash_formatter
140
+ end
141
+
142
+ # Find the relevant logstash_writer for this Logger.
166
143
  #
167
144
  # We're kinda reimplementing Ruby's method lookup logic here, but there's
168
145
  # no other way to store our object *somewhere* in the object + class
169
146
  # hierarchy and still be able to get at it from a module (class variables
170
- # don't like being accessed from modules).
171
- #
172
- def loggerstash
173
- ([self] + self.class.ancestors).find { |m| m.instance_variable_defined?(:@loggerstash) }.instance_variable_get(:@loggerstash).tap do |ls|
147
+ # don't like being accessed from modules). This is necessary because you
148
+ # can attach Loggerstash to the Logger class, not just to an instance.
149
+ def logstash_writer
150
+ @logstash_writer ||= self.class.ancestors.find { |m| m.instance_variable_defined?(:@logstash_writer) }.instance_variable_get(:@logstash_writer).tap do |ls|
174
151
  if ls.nil?
175
152
  #:nocov:
176
153
  raise RuntimeError,
@@ -179,5 +156,50 @@ class Loggerstash
179
156
  end
180
157
  end
181
158
  end
159
+
160
+ # Mangle the standard sev/time/prog/msg set into a logstash event.
161
+ #
162
+ # Caller information is a https://www.rubydoc.info/stdlib/core/Thread/Backtrace/Location
163
+ def default_loggerstash_formatter
164
+ ->(s, t, p, m) do
165
+ caller = caller_locations.find { |loc| ! [__FILE__, logger_filename].include? loc.absolute_path }
166
+
167
+ {
168
+ "@timestamp": t.utc.strftime("%FT%T.%NZ"),
169
+ "@metadata": { event_type: "loggerstash" },
170
+ message: m,
171
+ log: {
172
+ level: s.downcase,
173
+ logger: "Loggerstash",
174
+ origin: {
175
+ base_function: caller.base_label, # not in ECS
176
+ file: {
177
+ line: caller.lineno,
178
+ name: caller.absolute_path,
179
+ },
180
+ function: caller.label,
181
+ },
182
+ },
183
+ host: {
184
+ hostname: Socket.gethostname,
185
+ },
186
+ process: {
187
+ pid: $$,
188
+ thread: {
189
+ id: Thread.current.object_id,
190
+ },
191
+ },
192
+ }.tap do |ev|
193
+ ev[:process][:name] = p if p
194
+ ev[:process][:thread][:name] = Thread.current.name if Thread.current.name
195
+ end
196
+ end
197
+ end
198
+
199
+ # Identify the absolute path of the file that defines the Logger class.
200
+ #
201
+ def logger_filename
202
+ @logger_filename ||= Logger.instance_method(:format_message).source_location.first
203
+ end
182
204
  end
183
205
  end
data/loggerstash.gemspec CHANGED
@@ -1,15 +1,9 @@
1
- begin
2
- require 'git-version-bump'
3
- rescue LoadError
4
- nil
5
- end
1
+ # frozen_string_literal: true
6
2
 
7
3
  Gem::Specification.new do |s|
8
4
  s.name = "loggerstash"
9
5
 
10
- s.version = GVB.version rescue "0.0.0.1.NOGVB"
11
- s.date = GVB.date rescue Time.now.strftime("%Y-%m-%d")
12
-
6
+ s.version = "1.0.1"
13
7
  s.platform = Gem::Platform::RUBY
14
8
 
15
9
  s.summary = "Monkeypatch Logger to send log entries to logstash"
@@ -19,19 +13,17 @@ Gem::Specification.new do |s|
19
13
  however the message would have been handled otherwise.
20
14
  EOF
21
15
 
22
- s.authors = ["Matt Palmer"]
23
- s.email = ["matt.palmer@discourse.org"]
16
+ s.authors = ["Michael Brown"]
17
+ s.email = ["michael.brown@discourse.org"]
24
18
  s.homepage = "https://github.com/discourse/loggerstash"
25
19
 
26
20
  s.files = `git ls-files -z`.split("\0").reject { |f| f =~ /^(G|spec|Rakefile)/ }
27
21
 
28
- s.required_ruby_version = ">= 2.3.0"
22
+ s.required_ruby_version = ">= 2.4.0"
29
23
 
30
- s.add_runtime_dependency "logstash_writer", "~> 0.0"
24
+ s.add_runtime_dependency "logstash_writer", ">= 0.0.11"
31
25
 
32
26
  s.add_development_dependency 'bundler'
33
- s.add_development_dependency 'github-release'
34
- s.add_development_dependency 'git-version-bump'
35
27
  s.add_development_dependency 'guard-rspec'
36
28
  s.add_development_dependency 'guard-rubocop'
37
29
  s.add_development_dependency 'rack-test'
@@ -39,6 +31,7 @@ Gem::Specification.new do |s|
39
31
  s.add_development_dependency 'redcarpet'
40
32
  s.add_development_dependency 'rspec'
41
33
  s.add_development_dependency 'rubocop'
34
+ s.add_development_dependency 'rubocop-discourse'
42
35
  s.add_development_dependency 'simplecov'
43
36
  s.add_development_dependency 'yard'
44
37
  end
metadata CHANGED
@@ -1,29 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: loggerstash
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.5
4
+ version: 1.0.1
5
5
  platform: ruby
6
6
  authors:
7
- - Matt Palmer
7
+ - Michael Brown
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-10-05 00:00:00.000000000 Z
11
+ date: 2021-02-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: logstash_writer
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - "~>"
17
+ - - ">="
18
18
  - !ruby/object:Gem::Version
19
- version: '0.0'
19
+ version: 0.0.11
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - "~>"
24
+ - - ">="
25
25
  - !ruby/object:Gem::Version
26
- version: '0.0'
26
+ version: 0.0.11
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: bundler
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -39,7 +39,7 @@ dependencies:
39
39
  - !ruby/object:Gem::Version
40
40
  version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
- name: github-release
42
+ name: guard-rspec
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
45
  - - ">="
@@ -53,7 +53,7 @@ dependencies:
53
53
  - !ruby/object:Gem::Version
54
54
  version: '0'
55
55
  - !ruby/object:Gem::Dependency
56
- name: git-version-bump
56
+ name: guard-rubocop
57
57
  requirement: !ruby/object:Gem::Requirement
58
58
  requirements:
59
59
  - - ">="
@@ -67,7 +67,7 @@ dependencies:
67
67
  - !ruby/object:Gem::Version
68
68
  version: '0'
69
69
  - !ruby/object:Gem::Dependency
70
- name: guard-rspec
70
+ name: rack-test
71
71
  requirement: !ruby/object:Gem::Requirement
72
72
  requirements:
73
73
  - - ">="
@@ -81,21 +81,21 @@ dependencies:
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
83
  - !ruby/object:Gem::Dependency
84
- name: guard-rubocop
84
+ name: rake
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - ">="
87
+ - - "~>"
88
88
  - !ruby/object:Gem::Version
89
- version: '0'
89
+ version: '12.0'
90
90
  type: :development
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
- - - ">="
94
+ - - "~>"
95
95
  - !ruby/object:Gem::Version
96
- version: '0'
96
+ version: '12.0'
97
97
  - !ruby/object:Gem::Dependency
98
- name: rack-test
98
+ name: redcarpet
99
99
  requirement: !ruby/object:Gem::Requirement
100
100
  requirements:
101
101
  - - ">="
@@ -109,21 +109,7 @@ dependencies:
109
109
  - !ruby/object:Gem::Version
110
110
  version: '0'
111
111
  - !ruby/object:Gem::Dependency
112
- name: rake
113
- requirement: !ruby/object:Gem::Requirement
114
- requirements:
115
- - - "~>"
116
- - !ruby/object:Gem::Version
117
- version: '12.0'
118
- type: :development
119
- prerelease: false
120
- version_requirements: !ruby/object:Gem::Requirement
121
- requirements:
122
- - - "~>"
123
- - !ruby/object:Gem::Version
124
- version: '12.0'
125
- - !ruby/object:Gem::Dependency
126
- name: redcarpet
112
+ name: rspec
127
113
  requirement: !ruby/object:Gem::Requirement
128
114
  requirements:
129
115
  - - ">="
@@ -137,7 +123,7 @@ dependencies:
137
123
  - !ruby/object:Gem::Version
138
124
  version: '0'
139
125
  - !ruby/object:Gem::Dependency
140
- name: rspec
126
+ name: rubocop
141
127
  requirement: !ruby/object:Gem::Requirement
142
128
  requirements:
143
129
  - - ">="
@@ -151,7 +137,7 @@ dependencies:
151
137
  - !ruby/object:Gem::Version
152
138
  version: '0'
153
139
  - !ruby/object:Gem::Dependency
154
- name: rubocop
140
+ name: rubocop-discourse
155
141
  requirement: !ruby/object:Gem::Requirement
156
142
  requirements:
157
143
  - - ">="
@@ -197,20 +183,20 @@ description: |
197
183
  it to send all logged entries to a Logstash server, in addition to
198
184
  however the message would have been handled otherwise.
199
185
  email:
200
- - matt.palmer@discourse.org
186
+ - michael.brown@discourse.org
201
187
  executables: []
202
188
  extensions: []
203
189
  extra_rdoc_files: []
204
190
  files:
191
+ - ".editorconfig"
192
+ - ".github/workflows/ci.yml"
205
193
  - ".gitignore"
206
194
  - ".rubocop.yml"
207
- - ".travis.yml"
208
195
  - ".yardopts"
209
196
  - CODE_OF_CONDUCT.md
210
197
  - CONTRIBUTING.md
211
198
  - LICENCE
212
199
  - README.md
213
- - lib/filtered_debug_logger.rb
214
200
  - lib/loggerstash.rb
215
201
  - loggerstash.gemspec
216
202
  homepage: https://github.com/discourse/loggerstash
@@ -224,15 +210,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
224
210
  requirements:
225
211
  - - ">="
226
212
  - !ruby/object:Gem::Version
227
- version: 2.3.0
213
+ version: 2.4.0
228
214
  required_rubygems_version: !ruby/object:Gem::Requirement
229
215
  requirements:
230
216
  - - ">="
231
217
  - !ruby/object:Gem::Version
232
218
  version: '0'
233
219
  requirements: []
234
- rubyforge_project:
235
- rubygems_version: 2.7.7
220
+ rubygems_version: 3.0.3
236
221
  signing_key:
237
222
  specification_version: 4
238
223
  summary: Monkeypatch Logger to send log entries to logstash
data/.travis.yml DELETED
@@ -1,11 +0,0 @@
1
- language: ruby
2
- sudo: false
3
- cache: bundler
4
-
5
- rvm:
6
- - 2.5.1
7
- - 2.4.4
8
- - 2.3.7
9
-
10
- gemfile:
11
- - Gemfile
@@ -1,42 +0,0 @@
1
- require 'logger'
2
-
3
- # Filter debug-level log entries on progname
4
- #
5
- # Whilst well-thought-out debug logs are fantastic at showing you the
6
- # fine-level detail of your program's execution, they can sometimes be
7
- # "too much of a good thing". Excessively verbose debug logs can obscure
8
- # the important debug info, and turning on debug logging on a busy service
9
- # can quickly swamp all but the most overprovisioned of log aggregation
10
- # systems.
11
- #
12
- # Hence, there's this little module. Require it in your program, and then
13
- # set `logger.permitted_prognames = ['some', 'array']` on whatever logger
14
- # is likely to want some debug logging. Then, whenever debug logging is
15
- # enabled, only those calls to `logger.debug` which provide a progname exactly
16
- # matching an entry in the list you provided will actually get logged.
17
- #
18
- module FilteredDebugLogger
19
- # Set the list of prognames to log debug messages for.
20
- #
21
- # @param l [Array<String>] the (exact) prognames to log debug-level messages
22
- # for. If it's not in this list, it doesn't get emitted, even if debug
23
- # logging is enabled.
24
- #
25
- def permitted_prognames=(l)
26
- raise ArgumentError, "Must provide an array" unless l.is_a?(Array)
27
-
28
- @permitted_prognames = l
29
- end
30
-
31
- # Decorate Logger#add with our "reject by progname" logic.
32
- #
33
- def add(s, m = nil, p = nil)
34
- return if s == Logger::DEBUG && @permitted_prognames && !@permitted_prognames.include?(p)
35
-
36
- super
37
- end
38
-
39
- alias log add
40
- end
41
-
42
- Logger.prepend(FilteredDebugLogger)