loggability 0.15.0.pre20190714094638 → 0.15.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/ChangeLog +2 -19
- data/History.rdoc +23 -0
- data/Manifest.txt +1 -1
- data/{README.rdoc → README.md} +78 -71
- data/Rakefile +5 -78
- data/lib/loggability.rb +4 -15
- data/lib/loggability/formatter/structured.rb +35 -0
- data/lib/loggability/logger.rb +33 -4
- data/spec/helpers.rb +2 -0
- data/spec/loggability/formatter/default_spec.rb +50 -0
- data/spec/loggability/formatter/structured_spec.rb +61 -0
- data/spec/loggability_spec.rb +0 -12
- metadata +34 -109
- metadata.gz.sig +0 -0
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4dd5d6f5605a1a639a0143107b4079272e35bb7ffba9e2b76b150c1fab57e11f
|
4
|
+
data.tar.gz: aef9016eb5f208d0d168d8e4aac0b03047851b582f8afcb437b37bb9f9b5ad4d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e14c6919279635835bd126a7c878ef69149811640cd4c632022e1677c18abfb3ebadc67fe8a12e9d35e35a94296e2c3ca32614c0c998ed9089b8e9b72d25ec56
|
7
|
+
data.tar.gz: d2481edb5e1a26dcc7f2a78420831d127b9951dd36e02e898bbd7fded829895083071627d9d78616fbad692937eb05edbdd39456efa0034aae4647cce597c484
|
checksums.yaml.gz.sig
ADDED
Binary file
|
data.tar.gz.sig
ADDED
Binary file
|
data/ChangeLog
CHANGED
@@ -1,23 +1,6 @@
|
|
1
|
-
2019-07-14 Michael Granger <ged@FaerieMUD.org>
|
2
|
-
|
3
|
-
@ * .gems, Manifest.txt, Rakefile, lib/loggability/formatter.rb,
|
4
|
-
| lib/loggability/formatter/default.rb,
|
5
|
-
| lib/loggability/formatter/html.rb,
|
6
|
-
| lib/loggability/formatter/structured.rb, lib/loggability/logger.rb,
|
7
|
-
| loggability.gemspec, spec/helpers.rb,
|
8
|
-
| spec/loggability/formatter/color_spec.rb,
|
9
|
-
| spec/loggability/formatter/default_spec.rb,
|
10
|
-
| spec/loggability/formatter/html_spec.rb,
|
11
|
-
| spec/loggability/formatter/structured_spec.rb,
|
12
|
-
| spec/loggability/formatter_spec.rb, spec/loggability/logger_spec.rb,
|
13
|
-
| spec/loggability/override_spec.rb,
|
14
|
-
| spec/loggability/spechelpers_spec.rb:
|
15
|
-
| Add a structured log formatter.
|
16
|
-
| [55ea9e745f4d] [tip]
|
17
|
-
|
|
18
1
|
2019-07-13 Michael Granger <ged@FaerieMUD.org>
|
19
2
|
|
20
|
-
|
3
|
+
@ * .ruby-version, lib/loggability.rb, lib/loggability/constants.rb,
|
21
4
|
| lib/loggability/formatter.rb, lib/loggability/formatter/color.rb,
|
22
5
|
| lib/loggability/formatter/default.rb,
|
23
6
|
| lib/loggability/formatter/html.rb, lib/loggability/logclient.rb,
|
@@ -29,7 +12,7 @@ o * .ruby-version, lib/loggability.rb, lib/loggability/constants.rb,
|
|
29
12
|
| spec/loggability/loghost_spec.rb, spec/loggability/override_spec.rb,
|
30
13
|
| spec/loggability/spechelpers_spec.rb, spec/loggability_spec.rb:
|
31
14
|
| Make literal strings frozen by default
|
32
|
-
| [0933e9ab9c01]
|
15
|
+
| [0933e9ab9c01] [tip]
|
33
16
|
|
|
34
17
|
2018-10-10 Michael Granger <ged@FaerieMUD.org>
|
35
18
|
|
data/History.rdoc
CHANGED
@@ -1,3 +1,26 @@
|
|
1
|
+
= Release History for loggability
|
2
|
+
|
3
|
+
---
|
4
|
+
|
5
|
+
== v0.15.1 [2020-01-09] Michael Granger <ged@faeriemud.org>
|
6
|
+
|
7
|
+
Bugfixes:
|
8
|
+
|
9
|
+
- Change the spec to require Ruby 2.5 or greater. This was because
|
10
|
+
of the use methods that are only public in newer versions.
|
11
|
+
|
12
|
+
|
13
|
+
== v0.15.0 [2020-01-08] Michael Granger <ged@faeriemud.org>
|
14
|
+
|
15
|
+
(Yanked)
|
16
|
+
|
17
|
+
Enhancements:
|
18
|
+
|
19
|
+
- Make literal strings frozen by default
|
20
|
+
- Add a structured log formatter.
|
21
|
+
- Add fixes for Ruby 2.6 and 2.7
|
22
|
+
|
23
|
+
|
1
24
|
== v0.14.0 [2017-01-30] Michael Granger <ged@FaerieMUD.org>
|
2
25
|
|
3
26
|
Enhancements:
|
data/Manifest.txt
CHANGED
data/{README.rdoc → README.md}
RENAMED
@@ -1,12 +1,19 @@
|
|
1
|
-
|
1
|
+
# loggability
|
2
2
|
|
3
|
-
home
|
4
|
-
|
5
|
-
docs :: http://deveiate.org/code/loggability
|
6
|
-
github :: http://github.com/ged/loggability
|
3
|
+
home
|
4
|
+
: https://hg.sr.ht/~ged/Loggability
|
7
5
|
|
6
|
+
code
|
7
|
+
: https://hg.sr.ht/~ged/Loggability/browse
|
8
8
|
|
9
|
-
|
9
|
+
docs
|
10
|
+
: https://deveiate.org/code/loggability
|
11
|
+
|
12
|
+
github
|
13
|
+
: https://github.com/ged/loggability
|
14
|
+
|
15
|
+
|
16
|
+
## Description
|
10
17
|
|
11
18
|
A composable logging system built on the standard Logger library.
|
12
19
|
|
@@ -21,23 +28,23 @@ An example:
|
|
21
28
|
require 'inversion'
|
22
29
|
require 'treequel'
|
23
30
|
require 'loggability'
|
24
|
-
|
31
|
+
|
25
32
|
# Set up our own library
|
26
33
|
module MyProject
|
27
34
|
extend Loggability
|
28
35
|
log_as :my_project
|
29
|
-
|
36
|
+
|
30
37
|
class Server
|
31
38
|
extend Loggability
|
32
39
|
log_to :my_project
|
33
|
-
|
40
|
+
|
34
41
|
def initialize
|
35
42
|
self.log.debug "Listening."
|
36
43
|
end
|
37
44
|
end
|
38
|
-
|
45
|
+
|
39
46
|
end
|
40
|
-
|
47
|
+
|
41
48
|
# Now tell everything that's using Loggability to log to an HTML
|
42
49
|
# log file at INFO level
|
43
50
|
Loggability.write_to( '/usr/local/www/htdocs/log.html' )
|
@@ -45,30 +52,30 @@ An example:
|
|
45
52
|
Loggability.level = :info
|
46
53
|
|
47
54
|
|
48
|
-
|
55
|
+
## Prerequisites
|
49
56
|
|
50
|
-
* Ruby
|
57
|
+
* Ruby 2.4+
|
51
58
|
|
52
59
|
It will probably work under any other interpreter in which Logger works, but
|
53
60
|
it's only tested in the above.
|
54
61
|
|
55
62
|
|
56
|
-
|
63
|
+
## Installation
|
57
64
|
|
58
65
|
$ gem install loggability
|
59
66
|
|
60
67
|
|
61
|
-
|
68
|
+
## Usage
|
62
69
|
|
63
|
-
Loggability is split up into two parts:
|
64
|
-
and
|
70
|
+
Loggability is split up into two parts: [log hosts](rdoc-ref:Loggability::LogHost)
|
71
|
+
and [log clients](rdoc-ref:Loggability::LogClient). A <b>log
|
65
72
|
host</b> is an object that contains a Logger instance that will be used to
|
66
73
|
log stuff. A <b>log client</b> is an object that will write logging messages to a
|
67
74
|
particular <b>log host</b>'s Logger.
|
68
75
|
|
69
76
|
Both parts require that you extend the object with Loggability.
|
70
77
|
|
71
|
-
|
78
|
+
### Setting Up A 'Log Host'
|
72
79
|
|
73
80
|
To install a Logger into an object, you use the +log_as+ declaration with a
|
74
81
|
Symbol that will be used as the key for the object's Logger:
|
@@ -116,10 +123,10 @@ or use a few new convenience methods for changing the logging level:
|
|
116
123
|
log_messages = []
|
117
124
|
MyProject.logger.output_to( log_messages )
|
118
125
|
|
119
|
-
...
|
126
|
+
...[and more](rdoc-ref:Loggability::Logger).
|
120
127
|
|
121
128
|
|
122
|
-
|
129
|
+
### Setting Up A 'Log Client'
|
123
130
|
|
124
131
|
To add an object that will log to your log host, after you <tt>extend Loggability</tt>,
|
125
132
|
use the +log_to+ declaration to hook up the object (and instances of the object if
|
@@ -153,7 +160,7 @@ You can also use the <b>log host</b> itself as the argument to +log_to+:
|
|
153
160
|
end
|
154
161
|
|
155
162
|
|
156
|
-
|
163
|
+
### Aggregate Logging
|
157
164
|
|
158
165
|
If you have several <b>log hosts</b>, and you want to affect them all simultaneously,
|
159
166
|
you can do that using the aggregate functions of Loggability. They're the same as the
|
@@ -161,15 +168,15 @@ methods on Loggability::Logger:
|
|
161
168
|
|
162
169
|
# Set all logs to log at INFO level
|
163
170
|
Loggability.level = :info
|
164
|
-
|
171
|
+
|
165
172
|
# Write HTML logs
|
166
173
|
Loggability.format_with( :html )
|
167
|
-
|
174
|
+
|
168
175
|
# Log everything to the same logfile
|
169
176
|
Loggability.output_to( "/tmp/my_project_log.html" )
|
170
177
|
|
171
178
|
|
172
|
-
|
179
|
+
### Temporarily Overriding Logging Behavior
|
173
180
|
|
174
181
|
Sometimes you want to log one particular chunk of code at a different
|
175
182
|
level, or to a different destination, and then restore everything back
|
@@ -187,7 +194,7 @@ Loggability has a few ways of doing that:
|
|
187
194
|
Loggability.outputting_to( logs ) do
|
188
195
|
...
|
189
196
|
end
|
190
|
-
|
197
|
+
|
191
198
|
# Log using the HTML formatter
|
192
199
|
Loggability.formatted_with( :html ) do
|
193
200
|
...
|
@@ -210,7 +217,7 @@ You can also make the override only apply to the loggers for a subset of log hos
|
|
210
217
|
ACME.start_up
|
211
218
|
end
|
212
219
|
|
213
|
-
|
220
|
+
### Configurability
|
214
221
|
|
215
222
|
Loggability has support for the Configurability[https://rubygems.org/gems/configurability]
|
216
223
|
library, which does the same thing for configuration that Loggability does for
|
@@ -230,39 +237,41 @@ The format of the value of each logger is:
|
|
230
237
|
|
231
238
|
where:
|
232
239
|
|
233
|
-
|
234
|
-
The log level; one of: +debug+, +info+, +warn+, +error+, or +fatal+
|
235
|
-
[+TARGET+]
|
236
|
-
The destination for log messages. This can be the path to a log file, or
|
237
|
-
one of <tt>'STDOUT'</tt> or <tt>'STDERR'</tt>, which get mapped to the
|
238
|
-
equivalent filehandle. Optional.
|
239
|
-
[+FORMAT+]
|
240
|
-
The name of one of the formatters. Loggability comes with +default+ (plaintext),
|
241
|
-
+color+ (ANSI colored text), and +html+ formatters. Optional.
|
240
|
+
+SEVERITY+
|
241
|
+
: The log level; one of: +debug+, +info+, +warn+, +error+, or +fatal+
|
242
242
|
|
243
|
-
|
244
|
-
|
243
|
+
+TARGET+
|
244
|
+
: The destination for log messages. This can be the path to a log file, or
|
245
|
+
one of <tt>'STDOUT'</tt> or <tt>'STDERR'</tt>, which get mapped to the
|
246
|
+
equivalent filehandle. Optional.
|
245
247
|
|
246
|
-
|
247
|
-
|
248
|
+
+FORMAT+
|
249
|
+
: The name of one of the formatters. Loggability comes with +default+
|
250
|
+
(plaintext), +color+ (ANSI colored text), and +html+ formatters. Optional.
|
248
251
|
|
252
|
+
If the special key <tt>__default__</tt> is included, its config will be used to
|
253
|
+
set global defaults before the individual configs are applied.
|
249
254
|
|
250
|
-
|
255
|
+
If either of the optional values is unspecified, it is left unchanged from what
|
256
|
+
it was before configuration.
|
251
257
|
|
252
|
-
Loggability includes a couple of helper functions for RSpec that allow you to control
|
253
|
-
log levels for particular specs.
|
254
258
|
|
255
|
-
|
256
|
-
spec helpers file) and then include the helpers from your RSpec config:
|
259
|
+
### RSpec Helpers
|
257
260
|
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
261
|
+
Loggability includes a couple of helper functions for RSpec that allow you to
|
262
|
+
control log levels for particular specs.
|
263
|
+
|
264
|
+
To use it, require <tt>loggability/spechelpers</tt> in your specs (we put it in
|
265
|
+
the spec helpers file) and then include the helpers from your RSpec config:
|
263
266
|
|
264
|
-
|
265
|
-
|
267
|
+
require 'loggability/spechelpers'
|
268
|
+
RSpec.configure do |c|
|
269
|
+
# ...
|
270
|
+
c.include( Loggability::SpecHelpers )
|
271
|
+
end
|
272
|
+
|
273
|
+
This will install a before and after `:all` hook to set the logging levels
|
274
|
+
before each example group and then reset it before moving on to the next group.
|
266
275
|
|
267
276
|
You can also access the bodies of those hooks manually:
|
268
277
|
|
@@ -270,31 +279,31 @@ You can also access the bodies of those hooks manually:
|
|
270
279
|
reset_logging()
|
271
280
|
|
272
281
|
The helpers also allow you to set logging levels for a whole example group, for
|
273
|
-
particular contexts, or even for individual examples using RSpec's metadata
|
274
|
-
syntax:
|
282
|
+
particular contexts, or even for individual examples using RSpec's metadata
|
283
|
+
hash syntax:
|
275
284
|
|
276
285
|
# Set logging to 'error' level for each example in this group
|
277
286
|
describe MyClass, logging: :error do
|
278
|
-
|
287
|
+
|
279
288
|
# ...but for examples in this context, set it to 'fatal'
|
280
289
|
context 'created with a target', log: :fatal do
|
281
|
-
|
290
|
+
|
282
291
|
# ...except for this one, which logs at 'debug' level
|
283
292
|
it "does something to it", logging: :debug do
|
284
|
-
|
293
|
+
|
285
294
|
end
|
286
|
-
|
295
|
+
|
287
296
|
it "does some other stuff, too"
|
288
|
-
|
297
|
+
|
289
298
|
end
|
290
|
-
|
299
|
+
|
291
300
|
end
|
292
301
|
|
293
|
-
The
|
302
|
+
The [setup_logging](rdoc-ref:Loggability::SpecHelpers.setup_logging) helper
|
294
303
|
also provides support for displaying the logs inline with spec formatters for
|
295
304
|
which outputting the logs to STDERR isn't optimal. The only one that's
|
296
|
-
currently uses it is the
|
297
|
-
|
305
|
+
currently uses it is the
|
306
|
+
['webkit' formatter](https://rubygems.org/gems/rspec-formatter-webkit), but
|
298
307
|
it should be easy to adapt to other HTML displays as well.
|
299
308
|
|
300
309
|
It looks for either an +HTML_LOGGING+ environment variable, or for the
|
@@ -307,23 +316,21 @@ This can be used to append logs to each example when the formatter
|
|
307
316
|
builds the output.
|
308
317
|
|
309
318
|
|
310
|
-
|
319
|
+
## Contributing
|
311
320
|
|
312
321
|
You can check out the current development source with
|
313
|
-
Mercurial[http://
|
314
|
-
|
322
|
+
Mercurial[http://hg.sr.ht/~ged/Loggability], or if you prefer Git, via
|
323
|
+
[its Github mirror](https://github.com/ged/loggability).
|
315
324
|
|
316
|
-
After checking out the source, run:
|
317
325
|
|
318
|
-
|
326
|
+
## Author
|
319
327
|
|
320
|
-
|
321
|
-
and generate the API documentation.
|
328
|
+
- Michael Granger <ged@faeriemud.org>
|
322
329
|
|
323
330
|
|
324
|
-
|
331
|
+
## License
|
325
332
|
|
326
|
-
Copyright (c) 2012-
|
333
|
+
Copyright (c) 2012-2020, Michael Granger
|
327
334
|
All rights reserved.
|
328
335
|
|
329
336
|
Redistribution and use in source and binary forms, with or without
|
data/Rakefile
CHANGED
@@ -1,82 +1,9 @@
|
|
1
|
-
#!/usr/bin/env rake
|
1
|
+
#!/usr/bin/env ruby -S rake
|
2
2
|
|
3
|
-
require 'rake/
|
3
|
+
require 'rake/deveiate'
|
4
4
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
abort "This Rakefile requires 'hoe' (gem install hoe)"
|
5
|
+
Rake::DevEiate.setup( 'loggability' ) do |project|
|
6
|
+
project.required_ruby_version = '~> 2.5'
|
7
|
+
project.publish_to = 'deveiate:/usr/local/www/public/code'
|
9
8
|
end
|
10
9
|
|
11
|
-
GEMSPEC = 'loggability.gemspec'
|
12
|
-
|
13
|
-
Hoe.plugin :mercurial
|
14
|
-
Hoe.plugin :signing
|
15
|
-
Hoe.plugin :deveiate
|
16
|
-
|
17
|
-
Hoe.plugins.delete :rubyforge
|
18
|
-
|
19
|
-
hoespec = Hoe.spec 'loggability' do
|
20
|
-
self.readme_file = 'README.rdoc'
|
21
|
-
self.history_file = 'History.rdoc'
|
22
|
-
self.extra_rdoc_files = FileList[ '*.rdoc' ]
|
23
|
-
|
24
|
-
self.developer 'Michael Granger', 'ged@FaerieMUD.org'
|
25
|
-
|
26
|
-
self.dependency 'hoe-deveiate', '~> 0.4', :developer
|
27
|
-
self.dependency 'hoe-bundler', '~> 1.2', :developer
|
28
|
-
self.dependency 'simplecov', '~> 0.7', :developer
|
29
|
-
self.dependency 'configurability', '~> 3.1', :developer
|
30
|
-
self.dependency 'timecop', '~> 0.9', :developer
|
31
|
-
|
32
|
-
self.license "BSD-3-Clause"
|
33
|
-
self.require_ruby_version( '>=1.9.3' )
|
34
|
-
self.hg_sign_tags = true if self.respond_to?( :hg_sign_tags= )
|
35
|
-
self.check_history_on_release = true if self.respond_to?( :check_history_on_release= )
|
36
|
-
|
37
|
-
self.rdoc_locations << "deveiate:/usr/local/www/public/code/#{remote_rdoc_dir}"
|
38
|
-
end
|
39
|
-
|
40
|
-
ENV['VERSION'] ||= hoespec.spec.version.to_s
|
41
|
-
|
42
|
-
# Ensure the specs pass before checking in
|
43
|
-
task 'hg:precheckin' => [ :check_history, :check_manifest, :gemspec, :spec ]
|
44
|
-
|
45
|
-
|
46
|
-
desc "Build a coverage report"
|
47
|
-
task :coverage do
|
48
|
-
ENV["COVERAGE"] = 'yes'
|
49
|
-
Rake::Task[:spec].invoke
|
50
|
-
end
|
51
|
-
CLOBBER.include( 'coverage' )
|
52
|
-
|
53
|
-
|
54
|
-
# Use the fivefish formatter for docs generated from development checkout
|
55
|
-
if File.directory?( '.hg' )
|
56
|
-
require 'rdoc/task'
|
57
|
-
|
58
|
-
Rake::Task[ 'docs' ].clear
|
59
|
-
RDoc::Task.new( 'docs' ) do |rdoc|
|
60
|
-
rdoc.main = "README.rdoc"
|
61
|
-
rdoc.rdoc_files.include( "*.rdoc", "ChangeLog", "lib/**/*.rb" )
|
62
|
-
rdoc.generator = :fivefish
|
63
|
-
rdoc.title = 'Loggability'
|
64
|
-
rdoc.rdoc_dir = 'doc'
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
task :gemspec => GEMSPEC
|
69
|
-
file GEMSPEC => [ __FILE__, 'lib/loggability.rb' ]
|
70
|
-
task GEMSPEC do |task|
|
71
|
-
hoespec = $hoespec.spec
|
72
|
-
hoespec.files.delete( '.gemtest' )
|
73
|
-
hoespec.signing_key = nil
|
74
|
-
hoespec.version = "#{hoespec.version.bump}.0.pre#{Time.now.strftime("%Y%m%d%H%M%S")}"
|
75
|
-
hoespec.cert_chain = [ 'certs/ged.pem' ]
|
76
|
-
File.open( task.name, 'w' ) do |fh|
|
77
|
-
fh.write( hoespec.to_ruby )
|
78
|
-
end
|
79
|
-
end
|
80
|
-
|
81
|
-
CLOBBER.include( GEMSPEC.to_s )
|
82
|
-
|
data/lib/loggability.rb
CHANGED
@@ -9,10 +9,7 @@ require 'date'
|
|
9
9
|
module Loggability
|
10
10
|
|
11
11
|
# Package version constant
|
12
|
-
VERSION = '0.
|
13
|
-
|
14
|
-
# VCS revision
|
15
|
-
REVISION = %q$Revision$
|
12
|
+
VERSION = '0.15.1'
|
16
13
|
|
17
14
|
# The key for the global logger (Loggability's own logger)
|
18
15
|
GLOBAL_KEY = :__global__
|
@@ -29,13 +26,13 @@ module Loggability
|
|
29
26
|
LOGSPEC_PATTERN = %r{
|
30
27
|
^
|
31
28
|
\s*
|
32
|
-
((?i:debug|info|warn|error|fatal))
|
29
|
+
(?<severity>(?i:debug|info|warn|error|fatal))
|
33
30
|
(?:
|
34
31
|
\s+
|
35
|
-
((?:[\w\-/:\.]|\\[ ])+)
|
32
|
+
(?<target>(?:[\w\-/:\.]|\\[ ])+)
|
36
33
|
)?
|
37
34
|
(?: \s+\(
|
38
|
-
(
|
35
|
+
(?<format>\w+)
|
39
36
|
\) )?
|
40
37
|
\s*
|
41
38
|
$
|
@@ -64,14 +61,6 @@ module Loggability
|
|
64
61
|
autoload :Override, 'loggability/override'
|
65
62
|
|
66
63
|
|
67
|
-
### Return the library's version string
|
68
|
-
def self::version_string( include_buildnum=false )
|
69
|
-
vstring = "%s %s" % [ self.name, VERSION ]
|
70
|
-
vstring << " (build %s)" % [ REVISION[/: ([[:xdigit:]]+)/, 1] || '0' ] if include_buildnum
|
71
|
-
return vstring
|
72
|
-
end
|
73
|
-
|
74
|
-
|
75
64
|
### Cast the given +device+ to a Loggability::Logger, if possible, and return it. If
|
76
65
|
### it can't be converted, raises a ArgumentError.
|
77
66
|
def self::Logger( device )
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# -*- ruby -*-
|
2
|
+
# vim: set nosta noet ts=4 sw=4:
|
3
|
+
# frozen_string_literal: true
|
4
|
+
|
5
|
+
require 'time'
|
6
|
+
require 'json'
|
7
|
+
|
8
|
+
require 'loggability/formatter' unless defined?( Loggability::Formatter )
|
9
|
+
|
10
|
+
|
11
|
+
# Output logs as JSON.
|
12
|
+
class Loggability::Formatter::Structured < Loggability::Formatter
|
13
|
+
|
14
|
+
# The version of the format output
|
15
|
+
LOG_FORMAT_VERSION = 1
|
16
|
+
|
17
|
+
|
18
|
+
### Format a message of the specified +severity+ using the given +time+,
|
19
|
+
### +progname+, and +message+.
|
20
|
+
def call( severity, time, progname, message )
|
21
|
+
severity ||= 'DEBUG'
|
22
|
+
time ||= Time.now
|
23
|
+
entry = {
|
24
|
+
'@version' => LOG_FORMAT_VERSION,
|
25
|
+
'@timestamp' => time.iso8601( 3 ),
|
26
|
+
'level' => severity,
|
27
|
+
'progname' => progname,
|
28
|
+
'message' => message,
|
29
|
+
}
|
30
|
+
|
31
|
+
return JSON.generate( entry )
|
32
|
+
end
|
33
|
+
|
34
|
+
end # class Loggability::Formatter::Default
|
35
|
+
|
data/lib/loggability/logger.rb
CHANGED
@@ -28,7 +28,8 @@ class Loggability::Logger < ::Logger
|
|
28
28
|
# to a file descriptor or a file.
|
29
29
|
class AppendingLogDevice
|
30
30
|
|
31
|
-
### Create a new AppendingLogDevice that will append content to +
|
31
|
+
### Create a new AppendingLogDevice that will append content to +target+ (a
|
32
|
+
### object that responds to #>>).
|
32
33
|
def initialize( target )
|
33
34
|
@target = target
|
34
35
|
end
|
@@ -182,6 +183,28 @@ class Loggability::Logger < ::Logger
|
|
182
183
|
end
|
183
184
|
|
184
185
|
|
186
|
+
### Log a message if the +severity+ is high enough. Overridden to account for
|
187
|
+
### the overridden #level.
|
188
|
+
def add( severity, message=nil, progname=nil )
|
189
|
+
return true if severity < self.sev_threshold
|
190
|
+
progname ||= @progname
|
191
|
+
|
192
|
+
unless message
|
193
|
+
if block_given?
|
194
|
+
message = yield
|
195
|
+
else
|
196
|
+
message = progname
|
197
|
+
progname = @progname
|
198
|
+
end
|
199
|
+
end
|
200
|
+
|
201
|
+
msg = self.format_message( self.format_severity(severity), Time.now, progname, message )
|
202
|
+
self.logdev.write( msg )
|
203
|
+
|
204
|
+
return true
|
205
|
+
end
|
206
|
+
|
207
|
+
|
185
208
|
### Append operator -- Override Logger's append so log messages always have
|
186
209
|
### formatting, and are always appended at :debug level.
|
187
210
|
def <<( message )
|
@@ -224,8 +247,7 @@ class Loggability::Logger < ::Logger
|
|
224
247
|
|
225
248
|
### Return the logger's level as a Symbol.
|
226
249
|
def level
|
227
|
-
|
228
|
-
return LOG_LEVEL_NAMES[ numeric_level ]
|
250
|
+
return LOG_LEVEL_NAMES[ self.sev_threshold ]
|
229
251
|
end
|
230
252
|
|
231
253
|
|
@@ -256,7 +278,7 @@ class Loggability::Logger < ::Logger
|
|
256
278
|
self.logdev = target
|
257
279
|
elsif target.respond_to?( :write ) || target.is_a?( String )
|
258
280
|
opts = { :shift_age => args.shift || 0, :shift_size => args.shift || 1048576 }
|
259
|
-
self.logdev = Logger::LogDevice.new( target, opts )
|
281
|
+
self.logdev = Logger::LogDevice.new( target, **opts )
|
260
282
|
elsif target.respond_to?( :<< )
|
261
283
|
self.logdev = AppendingLogDevice.new( target )
|
262
284
|
else
|
@@ -282,6 +304,13 @@ class Loggability::Logger < ::Logger
|
|
282
304
|
end
|
283
305
|
|
284
306
|
|
307
|
+
### Return the formatted name of the given +severity+.
|
308
|
+
def format_severity( severity )
|
309
|
+
name = LOG_LEVEL_NAMES[ severity ] || severity.to_s
|
310
|
+
return name.upcase
|
311
|
+
end
|
312
|
+
|
313
|
+
|
285
314
|
### Set a new +formatter+ for the logger. If +formatter+ is +nil+ or +:default+, this causes the
|
286
315
|
### logger to fall back to its default formatter. If it's a Symbol other than +:default+, it looks
|
287
316
|
### for a similarly-named formatter under loggability/formatter/ and uses that. If +formatter+ is
|
data/spec/helpers.rb
CHANGED
@@ -0,0 +1,50 @@
|
|
1
|
+
# -*- ruby -*-
|
2
|
+
# vim: set nosta noet ts=4 sw=4:
|
3
|
+
# frozen_string_literal: true
|
4
|
+
|
5
|
+
require_relative '../../helpers'
|
6
|
+
|
7
|
+
require 'loggability/formatter/default'
|
8
|
+
|
9
|
+
|
10
|
+
describe Loggability::Formatter::Default do
|
11
|
+
|
12
|
+
it "formats messages with the pattern it's constructed with" do
|
13
|
+
formatter = described_class.new( '[%5$s] %7$s' )
|
14
|
+
result = formatter.call( 'INFO', Time.at(1336286481), nil, 'Foom.' )
|
15
|
+
expect( result ).to match(/\[INFO\] Foom./i)
|
16
|
+
end
|
17
|
+
|
18
|
+
|
19
|
+
it "formats exceptions into useful messages" do
|
20
|
+
formatter = described_class.new( '[%5$s] %7$s' )
|
21
|
+
msg = nil
|
22
|
+
|
23
|
+
begin
|
24
|
+
raise ArgumentError, "invalid argument"
|
25
|
+
rescue => err
|
26
|
+
msg = formatter.call( 'INFO', Time.at(1336286481), nil, err )
|
27
|
+
end
|
28
|
+
|
29
|
+
expect( msg ).to match(/\[INFO\] ArgumentError: invalid argument/i)
|
30
|
+
end
|
31
|
+
|
32
|
+
|
33
|
+
it "formats regular objects into useful messages" do
|
34
|
+
formatter = described_class.new( '[%5$s] %7$s' )
|
35
|
+
result = formatter.call( 'INFO', Time.at(1336286481), nil, Object.new )
|
36
|
+
|
37
|
+
expect( result ).to match(/\[INFO\] #<Object:0x[[:xdigit:]]+>/i)
|
38
|
+
end
|
39
|
+
|
40
|
+
|
41
|
+
it "includes the thread ID if logging from a thread other than the main thread" do
|
42
|
+
formatter = described_class.new( '%4$d' )
|
43
|
+
thr = Thread.new do
|
44
|
+
formatter.call( 'INFO', Time.now, nil, 'Foom.' )
|
45
|
+
end
|
46
|
+
expect( thr.value ).to eq( thr.object_id.to_s )
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
|
@@ -0,0 +1,61 @@
|
|
1
|
+
# -*- ruby -*-
|
2
|
+
# vim: set nosta noet ts=4 sw=4:
|
3
|
+
# frozen_string_literal: true
|
4
|
+
|
5
|
+
require_relative '../../helpers'
|
6
|
+
|
7
|
+
require 'loggability/formatter/structured'
|
8
|
+
|
9
|
+
|
10
|
+
describe Loggability::Formatter::Structured do
|
11
|
+
|
12
|
+
before( :each ) do
|
13
|
+
ENV['TZ'] = 'UTC'
|
14
|
+
end
|
15
|
+
|
16
|
+
|
17
|
+
it "outputs a stream of JSON objects" do
|
18
|
+
expect(
|
19
|
+
subject.call('INFO', Time.at(1336286481), nil, "Foom.")
|
20
|
+
).to eq(
|
21
|
+
%q|{"@version":1,"@timestamp":"2012-05-06T06:41:21.000+00:00"| +
|
22
|
+
%q|,"level":"INFO","progname":null,"message":"Foom."}|
|
23
|
+
)
|
24
|
+
end
|
25
|
+
|
26
|
+
|
27
|
+
it "includes a time even if called without one" do
|
28
|
+
Timecop.freeze( Time.at(1563114765.123) ) do
|
29
|
+
expect(
|
30
|
+
subject.call('WARN', nil, nil, "Right.")
|
31
|
+
).to match( %r(
|
32
|
+
\{
|
33
|
+
"@version":1,
|
34
|
+
"@timestamp":"2019-07-14T14:32:45\.\d{3}\+00:00",
|
35
|
+
"level":"WARN",
|
36
|
+
"progname":null,
|
37
|
+
"message":"Right\."
|
38
|
+
\}
|
39
|
+
)x )
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
|
44
|
+
it "defaults to DEBUG severity" do
|
45
|
+
Timecop.freeze( Time.at(1563114765.123) ) do
|
46
|
+
expect(
|
47
|
+
subject.call(nil, nil, nil, "Crane.")
|
48
|
+
).to match( %r(
|
49
|
+
\{
|
50
|
+
"@version":1,
|
51
|
+
"@timestamp":"2019-07-14T14:32:45\.\d{3}\+00:00",
|
52
|
+
"level":"DEBUG",
|
53
|
+
"progname":null,
|
54
|
+
"message":"Crane\."
|
55
|
+
\}
|
56
|
+
)x )
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
end
|
61
|
+
|
data/spec/loggability_spec.rb
CHANGED
@@ -23,18 +23,6 @@ describe Loggability do
|
|
23
23
|
end
|
24
24
|
|
25
25
|
|
26
|
-
describe "version methods" do
|
27
|
-
it "returns a version string if asked" do
|
28
|
-
expect( described_class.version_string ).to match( /\w+ [\d.]+/ )
|
29
|
-
end
|
30
|
-
|
31
|
-
it "returns a version string with a build number if asked" do
|
32
|
-
expect( described_class.version_string(true) ).
|
33
|
-
to match(/\w+ [\d.]+ \(build [[:xdigit:]]+\)/)
|
34
|
-
end
|
35
|
-
end
|
36
|
-
|
37
|
-
|
38
26
|
context "installed in a class as a log host" do
|
39
27
|
|
40
28
|
before( :each ) do
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: loggability
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.15.
|
4
|
+
version: 0.15.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michael Granger
|
@@ -11,8 +11,8 @@ cert_chain:
|
|
11
11
|
- |
|
12
12
|
-----BEGIN CERTIFICATE-----
|
13
13
|
MIIENDCCApygAwIBAgIBATANBgkqhkiG9w0BAQsFADAiMSAwHgYDVQQDDBdnZWQv
|
14
|
-
|
15
|
-
|
14
|
+
REM9RmFlcmllTVVEL0RDPW9yZzAeFw0xOTEwMDkwMDM2NTdaFw0yMDEwMDgwMDM2
|
15
|
+
NTdaMCIxIDAeBgNVBAMMF2dlZC9EQz1GYWVyaWVNVUQvREM9b3JnMIIBojANBgkq
|
16
16
|
hkiG9w0BAQEFAAOCAY8AMIIBigKCAYEAvyVhkRzvlEs0fe7145BYLfN6njX9ih5H
|
17
17
|
L60U0p0euIurpv84op9CNKF9tx+1WKwyQvQP7qFGuZxkSUuWcP/sFhDXL1lWUuIl
|
18
18
|
M4uHbGCRmOshDrF4dgnBeOvkHr1fIhPlJm5FO+Vew8tSQmlDsosxLUx+VB7DrVFO
|
@@ -24,74 +24,32 @@ cert_chain:
|
|
24
24
|
N2I4L/ZOIe2DIVuYH7aLHfjZDQv/mNgpAgMBAAGjdTBzMAkGA1UdEwQCMAAwCwYD
|
25
25
|
VR0PBAQDAgSwMB0GA1UdDgQWBBRyjf55EbrHagiRLqt5YAd3yb8k4DAcBgNVHREE
|
26
26
|
FTATgRFnZWRARmFlcmllTVVELm9yZzAcBgNVHRIEFTATgRFnZWRARmFlcmllTVVE
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
27
|
+
Lm9yZzANBgkqhkiG9w0BAQsFAAOCAYEAFqsr6o0SvQRgjQVmhbQvExRnCMCoW1yb
|
28
|
+
FJiN7A5RA2Iy2E61OG1Ul5nGmaDmx/PNB/6JIbIV3B9Uq8aTZx4uOjK7r8vMl1/t
|
29
|
+
ZfY7r6HejJfXlcO2m6JDMbpdyEVv916LncBkzZRz6vnnNCx+31f15FKddxujpAFd
|
30
|
+
qpn3JRQY+oj7ZkoccL/IUiDpxQWeS3oOoz9qr2kVTp8R50InZimt79FqCl/1m66W
|
31
|
+
kdOuf+wM3DDx7Rt4IVNHrhGlyfMr7xjKW1Q3gll+pMN1DT6Ajx/t3JDSEg7BnnEW
|
32
|
+
r7AciSO6J4ApUdqyG+coLFlGdtgFTgRHv7ihbQtDI7Z/LV7A4Spn1j2PK3j0Omri
|
33
|
+
kSl1hPVigRytfgdVGiLXzvkkrkgj9EknCaj5UHbac7XvVBrljXj9hsnnqTANaKsg
|
34
|
+
jBZSA+N+xUTgUWpXjjwsLZjzJkhWATJWq+krNXcqpwXo6HsjmdUxoFMt63RBb+sI
|
35
|
+
XrxOxp8o0uOkU7FdLSGsyqJ2LzsR4obN
|
36
36
|
-----END CERTIFICATE-----
|
37
|
-
date:
|
37
|
+
date: 2020-01-09 00:00:00.000000000 Z
|
38
38
|
dependencies:
|
39
39
|
- !ruby/object:Gem::Dependency
|
40
|
-
name:
|
40
|
+
name: rake-deveiate
|
41
41
|
requirement: !ruby/object:Gem::Requirement
|
42
42
|
requirements:
|
43
43
|
- - "~>"
|
44
44
|
- !ruby/object:Gem::Version
|
45
|
-
version: '
|
46
|
-
type: :development
|
47
|
-
prerelease: false
|
48
|
-
version_requirements: !ruby/object:Gem::Requirement
|
49
|
-
requirements:
|
50
|
-
- - "~>"
|
51
|
-
- !ruby/object:Gem::Version
|
52
|
-
version: '1.4'
|
53
|
-
- !ruby/object:Gem::Dependency
|
54
|
-
name: hoe-deveiate
|
55
|
-
requirement: !ruby/object:Gem::Requirement
|
56
|
-
requirements:
|
57
|
-
- - "~>"
|
58
|
-
- !ruby/object:Gem::Version
|
59
|
-
version: '0.10'
|
60
|
-
type: :development
|
61
|
-
prerelease: false
|
62
|
-
version_requirements: !ruby/object:Gem::Requirement
|
63
|
-
requirements:
|
64
|
-
- - "~>"
|
65
|
-
- !ruby/object:Gem::Version
|
66
|
-
version: '0.10'
|
67
|
-
- !ruby/object:Gem::Dependency
|
68
|
-
name: hoe-highline
|
69
|
-
requirement: !ruby/object:Gem::Requirement
|
70
|
-
requirements:
|
71
|
-
- - "~>"
|
72
|
-
- !ruby/object:Gem::Version
|
73
|
-
version: '0.2'
|
74
|
-
type: :development
|
75
|
-
prerelease: false
|
76
|
-
version_requirements: !ruby/object:Gem::Requirement
|
77
|
-
requirements:
|
78
|
-
- - "~>"
|
79
|
-
- !ruby/object:Gem::Version
|
80
|
-
version: '0.2'
|
81
|
-
- !ruby/object:Gem::Dependency
|
82
|
-
name: hoe-bundler
|
83
|
-
requirement: !ruby/object:Gem::Requirement
|
84
|
-
requirements:
|
85
|
-
- - "~>"
|
86
|
-
- !ruby/object:Gem::Version
|
87
|
-
version: '1.2'
|
45
|
+
version: '0.7'
|
88
46
|
type: :development
|
89
47
|
prerelease: false
|
90
48
|
version_requirements: !ruby/object:Gem::Requirement
|
91
49
|
requirements:
|
92
50
|
- - "~>"
|
93
51
|
- !ruby/object:Gem::Version
|
94
|
-
version: '
|
52
|
+
version: '0.7'
|
95
53
|
- !ruby/object:Gem::Dependency
|
96
54
|
name: simplecov
|
97
55
|
requirement: !ruby/object:Gem::Requirement
|
@@ -135,65 +93,31 @@ dependencies:
|
|
135
93
|
- !ruby/object:Gem::Version
|
136
94
|
version: '0.9'
|
137
95
|
- !ruby/object:Gem::Dependency
|
138
|
-
name: rdoc
|
139
|
-
requirement: !ruby/object:Gem::Requirement
|
140
|
-
requirements:
|
141
|
-
- - ">="
|
142
|
-
- !ruby/object:Gem::Version
|
143
|
-
version: '4.0'
|
144
|
-
- - "<"
|
145
|
-
- !ruby/object:Gem::Version
|
146
|
-
version: '7'
|
147
|
-
type: :development
|
148
|
-
prerelease: false
|
149
|
-
version_requirements: !ruby/object:Gem::Requirement
|
150
|
-
requirements:
|
151
|
-
- - ">="
|
152
|
-
- !ruby/object:Gem::Version
|
153
|
-
version: '4.0'
|
154
|
-
- - "<"
|
155
|
-
- !ruby/object:Gem::Version
|
156
|
-
version: '7'
|
157
|
-
- !ruby/object:Gem::Dependency
|
158
|
-
name: hoe
|
96
|
+
name: rdoc-generator-fivefish
|
159
97
|
requirement: !ruby/object:Gem::Requirement
|
160
98
|
requirements:
|
161
99
|
- - "~>"
|
162
100
|
- !ruby/object:Gem::Version
|
163
|
-
version: '
|
101
|
+
version: '0.4'
|
164
102
|
type: :development
|
165
103
|
prerelease: false
|
166
104
|
version_requirements: !ruby/object:Gem::Requirement
|
167
105
|
requirements:
|
168
106
|
- - "~>"
|
169
107
|
- !ruby/object:Gem::Version
|
170
|
-
version: '
|
171
|
-
description:
|
172
|
-
can add Loggability to large libraries and systems, then hook everything\nup later
|
173
|
-
when you know where you want logs to be written, at what level of\nseverity, and
|
174
|
-
in which format.\n\nAn example:\n\n # Load a bunch of libraries that use Loggability\n
|
175
|
-
\ require 'strelka'\n require 'inversion'\n require 'treequel'\n require
|
176
|
-
'loggability'\n \n # Set up our own library\n module MyProject\n extend
|
177
|
-
Loggability\n log_as :my_project\n \n class Server\n extend
|
178
|
-
Loggability\n log_to :my_project\n \n def initialize\n
|
179
|
-
\ self.log.debug \"Listening.\"\n end\n end\n \n
|
180
|
-
\ end\n \n # Now tell everything that's using Loggability to log to an HTML\n
|
181
|
-
\ # log file at INFO level\n Loggability.write_to( '/usr/local/www/htdocs/log.html'
|
182
|
-
)\n Loggability.format_as( :html )\n Loggability.level = :info"
|
108
|
+
version: '0.4'
|
109
|
+
description: A composable logging system built on the standard Logger library.
|
183
110
|
email:
|
184
|
-
- ged@
|
111
|
+
- ged@faeriemud.org
|
185
112
|
executables: []
|
186
113
|
extensions: []
|
187
|
-
extra_rdoc_files:
|
188
|
-
- History.rdoc
|
189
|
-
- Manifest.txt
|
190
|
-
- README.rdoc
|
114
|
+
extra_rdoc_files: []
|
191
115
|
files:
|
192
116
|
- ".simplecov"
|
193
117
|
- ChangeLog
|
194
118
|
- History.rdoc
|
195
119
|
- Manifest.txt
|
196
|
-
- README.
|
120
|
+
- README.md
|
197
121
|
- Rakefile
|
198
122
|
- lib/loggability.rb
|
199
123
|
- lib/loggability/constants.rb
|
@@ -201,6 +125,7 @@ files:
|
|
201
125
|
- lib/loggability/formatter/color.rb
|
202
126
|
- lib/loggability/formatter/default.rb
|
203
127
|
- lib/loggability/formatter/html.rb
|
128
|
+
- lib/loggability/formatter/structured.rb
|
204
129
|
- lib/loggability/logclient.rb
|
205
130
|
- lib/loggability/logger.rb
|
206
131
|
- lib/loggability/loghost.rb
|
@@ -208,36 +133,36 @@ files:
|
|
208
133
|
- lib/loggability/spechelpers.rb
|
209
134
|
- spec/helpers.rb
|
210
135
|
- spec/loggability/formatter/color_spec.rb
|
136
|
+
- spec/loggability/formatter/default_spec.rb
|
211
137
|
- spec/loggability/formatter/html_spec.rb
|
138
|
+
- spec/loggability/formatter/structured_spec.rb
|
212
139
|
- spec/loggability/formatter_spec.rb
|
213
140
|
- spec/loggability/logger_spec.rb
|
214
141
|
- spec/loggability/loghost_spec.rb
|
215
142
|
- spec/loggability/override_spec.rb
|
216
143
|
- spec/loggability/spechelpers_spec.rb
|
217
144
|
- spec/loggability_spec.rb
|
218
|
-
homepage:
|
145
|
+
homepage: https://hg.sr.ht/~ged/Loggability
|
219
146
|
licenses:
|
220
147
|
- BSD-3-Clause
|
221
148
|
metadata: {}
|
222
149
|
post_install_message:
|
223
|
-
rdoc_options:
|
224
|
-
- "--main"
|
225
|
-
- README.rdoc
|
150
|
+
rdoc_options: []
|
226
151
|
require_paths:
|
227
152
|
- lib
|
228
153
|
required_ruby_version: !ruby/object:Gem::Requirement
|
229
154
|
requirements:
|
230
|
-
- - "
|
155
|
+
- - "~>"
|
231
156
|
- !ruby/object:Gem::Version
|
232
|
-
version:
|
157
|
+
version: '2.5'
|
233
158
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
234
159
|
requirements:
|
235
|
-
- - "
|
160
|
+
- - ">="
|
236
161
|
- !ruby/object:Gem::Version
|
237
|
-
version:
|
162
|
+
version: '0'
|
238
163
|
requirements: []
|
239
|
-
rubygems_version: 3.
|
164
|
+
rubygems_version: 3.1.2
|
240
165
|
signing_key:
|
241
166
|
specification_version: 4
|
242
|
-
summary: A composable logging system built on the standard Logger library
|
167
|
+
summary: A composable logging system built on the standard Logger library.
|
243
168
|
test_files: []
|
metadata.gz.sig
ADDED
Binary file
|