loggerstash 0.0.1 → 0.0.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: a5fd1556e489712e61e7737f1605cafae63e09a3d611d4dc2581ab0a0769e4dc
4
- data.tar.gz: 3d0c19110f5cdc49f97fc2531982f1402604b65720e76b433d7ebc32d03e7b9a
3
+ metadata.gz: 1ea3f2fdbe4dfa4604759d473ef117f7c1c1961b3c484be9b7deb1c2ed53dc74
4
+ data.tar.gz: ca16b574bdd0adfef725a7eb8a3821a541ba8f74bc7f88be0185888daf125ec3
5
5
  SHA512:
6
- metadata.gz: 45038a77ffe34f2b5e86158e9eb52955918bf75e506d4a70b6ed808c12db8c853449a859c870dc28514ca59145558d07f322138c2f79b825ab8922a461a906e5
7
- data.tar.gz: a0ae83e92b00dad48125c030d8937750fa950dcc99e867d968abd078d987c5d373e0fd2072cfd4483c6a3553f48a522d1014ca57be6091307a106eba8e584753
6
+ metadata.gz: bea707a8f38924bfac3b4c61d61fff5eff9d534c4beaa08024cc70865a79968a5f9a75399e9a4f7a06a9cc93351c539c7077ef4c7a11e0764adb6d0235107f56
7
+ data.tar.gz: 64d870fac502e29a4dc811ae0d4e83268a80e238642021b6294a2029b5b914b7b09a9595bb7347ce69c3d8312f3198aa590956cc0e5d009bbcef8deec7870cd8
@@ -0,0 +1,42 @@
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)
@@ -14,16 +14,51 @@ class Loggerstash
14
14
  #
15
15
  class AlreadyRunningError < Error; end
16
16
 
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
+ #
17
24
  attr_writer :formatter
18
25
 
19
- def initialize(logstash_server:, metrics_registry: nil, formatter: nil)
26
+ # A new Loggerstash!
27
+ #
28
+ # @param logstash_server [String] an address:port, hostname:port, or srvname
29
+ # to which a `json_lines` logstash connection can be made.
30
+ # @param metrics_registry [Prometheus::Client::Registry] where the metrics
31
+ # which are used by the underlying `LogstashWriter` should be registered,
32
+ # for later presentation by the Prometheus client.
33
+ # @param formatter [Proc] a formatting proc which takes the same arguments
34
+ # as the standard `Logger` formatter, but rather than emitting a string,
35
+ # it should pass back a Hash containing all the fields you wish to send
36
+ # to logstash.
37
+ # @param logstash_writer [LogstashWriter] in the event that you've already
38
+ # got a LogstashWriter instance configured, you can pass it in here. Note
39
+ # that any values you've set for logstash_server and metrics_registry
40
+ # will be ignored.
41
+ #
42
+ def initialize(logstash_server:, metrics_registry: nil, formatter: nil, logstash_writer: nil)
20
43
  @logstash_server = logstash_server
21
44
  @metrics_registry = metrics_registry
22
45
  @formatter = formatter
46
+ @logstash_writer = logstash_writer
23
47
 
24
48
  @op_mutex = Mutex.new
25
49
  end
26
50
 
51
+ # Associate this Loggerstash with a Logger (or class of Loggers).
52
+ #
53
+ # A single Loggerstash instance can be associated with one or more Logger
54
+ # objects, or all instances of Logger, by attaching the Loggerstash to the
55
+ # other object (or class). Attaching a Loggerstash means it can no longer
56
+ # be configured (by the setter methods).
57
+ #
58
+ # @param obj [Object] the instance or class to attach this Loggerstash to.
59
+ # We won't check that you're attaching to an object or class that will
60
+ # benefit from the attachment; that's up to you to ensure.
61
+ #
27
62
  def attach(obj)
28
63
  @op_mutex.synchronize do
29
64
  obj.instance_variable_set(:@loggerstash, self)
@@ -50,21 +85,36 @@ class Loggerstash
50
85
  end
51
86
  end
52
87
 
88
+ # Send a logger message to logstash.
89
+ #
90
+ # @private
91
+ #
53
92
  def log_message(s, t, p, m)
54
93
  @op_mutex.synchronize do
55
94
  if @logstash_writer.nil?
95
+ #:nocov:
56
96
  run_writer
97
+ #:nocov:
57
98
  end
58
99
 
59
100
  @logstash_writer.send_event((@formatter || default_formatter).call(s, t, p, m))
60
101
  end
61
102
  end
103
+
62
104
  private
63
105
 
106
+ # Do the needful to get the writer going.
107
+ #
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
+ #
64
112
  def run_writer
65
113
  unless @op_mutex.owned?
114
+ #:nocov:
66
115
  raise RuntimeError,
67
116
  "Must call run_writer while holding @op_mutex"
117
+ #:nocov:
68
118
  end
69
119
 
70
120
  if @logstash_writer.nil?
@@ -80,6 +130,9 @@ class Loggerstash
80
130
  end
81
131
  end
82
132
 
133
+ # Mangle the standard sev/time/prog/msg set into a minimal logstash
134
+ # event.
135
+ #
83
136
  def default_formatter
84
137
  @default_formatter ||= ->(s, t, p, m) do
85
138
  {
@@ -92,6 +145,8 @@ class Loggerstash
92
145
  end
93
146
  end
94
147
 
148
+ # The methods needed to turn any Logger into a Loggerstash Logger.
149
+ #
95
150
  module Mixin
96
151
  private
97
152
 
@@ -104,11 +159,20 @@ class Loggerstash
104
159
  super
105
160
  end
106
161
 
162
+ # Find where our associated Loggerstash object is being held captive.
163
+ #
164
+ # We're kinda reimplementing Ruby's method lookup logic here, but there's
165
+ # no other way to store our object *somewhere* in the object + class
166
+ # hierarchy and still be able to get at it from a module (class variables
167
+ # don't like being accessed from modules).
168
+ #
107
169
  def loggerstash
108
170
  ([self] + self.class.ancestors).find { |m| m.instance_variable_defined?(:@loggerstash) }.instance_variable_get(:@loggerstash).tap do |ls|
109
171
  if ls.nil?
172
+ #:nocov:
110
173
  raise RuntimeError,
111
174
  "Cannot find loggerstash instance. CAN'T HAPPEN."
175
+ #:nocov:
112
176
  end
113
177
  end
114
178
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: loggerstash
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Matt Palmer
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-10-02 00:00:00.000000000 Z
11
+ date: 2018-10-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: logstash_writer
@@ -210,6 +210,7 @@ files:
210
210
  - CONTRIBUTING.md
211
211
  - LICENCE
212
212
  - README.md
213
+ - lib/filtered_debug_logger.rb
213
214
  - lib/loggerstash.rb
214
215
  - loggerstash.gemspec
215
216
  homepage: https://github.com/discourse/loggerstash