scrolls 0.3.7 → 0.9.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/Gemfile +2 -0
- data/README.md +52 -14
- data/Rakefile +4 -2
- data/docs/global-context.md +1 -1
- data/docs/syslog.md +14 -1
- data/lib/scrolls.rb +62 -83
- data/lib/scrolls/iologger.rb +14 -0
- data/lib/scrolls/logger.rb +318 -0
- data/lib/scrolls/parser.rb +3 -1
- data/lib/scrolls/sysloglogger.rb +17 -0
- data/lib/scrolls/utils.rb +55 -13
- data/lib/scrolls/version.rb +1 -1
- data/test/test_helper.rb +4 -1
- data/test/test_parser.rb +11 -2
- data/test/test_scrolls.rb +78 -41
- metadata +6 -9
- data/lib/scrolls/atomic.rb +0 -59
- data/lib/scrolls/log.rb +0 -274
- data/lib/scrolls/syslog.rb +0 -46
- data/test/test_atomic.rb +0 -33
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: ef35d7cda907156c55fc36b1486539ac755beb03fc91fd686e396f06609dc9f3
|
4
|
+
data.tar.gz: aa19774eeb977616f7e5e64b713bd612c870357ed640134c9dc9ad50d33e7c46
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: fab8615f38a24e2767bb2f4b1d291f744130af82ee3326109e2c74b8d769d525cfeb761c021f4dc5c95e7fbf859a9bb5db21b29a90c11b948107e11bfc935245
|
7
|
+
data.tar.gz: 37b338406b11a641ec6afb8ae28384d0460d3bf3970dd9c083cdc8eaa999d4bd4cf7b5c0dd2929719bda7751ea03cb2f7771dc06fe8911a306a0c74bedc355f0
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -20,26 +20,64 @@ Or install it yourself as:
|
|
20
20
|
|
21
21
|
Scrolls follows the belief that logs should be treated as data. One way to think of them is the blood of your infrastructure. Logs are a realtime view of what is happening on your systems.
|
22
22
|
|
23
|
-
##
|
23
|
+
## Usage
|
24
|
+
|
25
|
+
### 0.9.0 and later
|
24
26
|
|
25
|
-
|
27
|
+
```ruby
|
28
|
+
require 'scrolls'
|
26
29
|
|
27
|
-
|
30
|
+
Scrolls.init(
|
31
|
+
timestamp: true,
|
32
|
+
global_context: {app: "scrolls", deploy: "production"},
|
33
|
+
exceptions: "multi"
|
34
|
+
)
|
28
35
|
|
29
|
-
|
36
|
+
Scrolls.log(at: "test")
|
30
37
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
* Misc Features
|
38
|
+
Scrolls.context(context: "block") do
|
39
|
+
Scrolls.log(at: "exec")
|
40
|
+
end
|
35
41
|
|
36
|
-
|
42
|
+
begin
|
43
|
+
raise
|
44
|
+
rescue Exception => e
|
45
|
+
Scrolls.log_exception(e, at: "raise")
|
46
|
+
end
|
47
|
+
```
|
48
|
+
|
49
|
+
You can also use `Scrolls#log` and `Scrolls#log_exception` without initalizing:
|
50
|
+
|
51
|
+
```ruby
|
52
|
+
require 'scrolls'
|
53
|
+
|
54
|
+
Scrolls.log(test: "test")
|
55
|
+
```
|
56
|
+
|
57
|
+
### Defaults
|
58
|
+
|
59
|
+
Here are the defaults `Scrolls#init`:
|
60
|
+
|
61
|
+
```
|
62
|
+
stream: STDOUT
|
63
|
+
facility: Syslog::LOG_USER
|
64
|
+
time_unit: "seconds"
|
65
|
+
timestamp: false
|
66
|
+
exceptions: "single"
|
67
|
+
global_context: {}
|
68
|
+
syslog_options: Syslog::LOG_PID|Syslog::LOG_CONS
|
69
|
+
escape_keys: false
|
70
|
+
```
|
71
|
+
|
72
|
+
## Older Versions
|
73
|
+
|
74
|
+
### Pre 0.9.0
|
37
75
|
|
38
76
|
```ruby
|
39
77
|
require 'scrolls'
|
40
78
|
|
41
79
|
Scrolls.add_timestamp = true
|
42
|
-
Scrolls.global_context(:app => "scrolls", :deploy =>
|
80
|
+
Scrolls.global_context(:app => "scrolls", :deploy => "production")
|
43
81
|
|
44
82
|
Scrolls.log(:at => "test")
|
45
83
|
|
@@ -57,10 +95,10 @@ end
|
|
57
95
|
Produces:
|
58
96
|
|
59
97
|
```
|
60
|
-
now="
|
61
|
-
now="
|
62
|
-
now="
|
63
|
-
now="
|
98
|
+
now="2017-09-01T00:37:13Z" app=scrolls deploy=production at=test
|
99
|
+
now="2017-09-01T00:37:13Z" app=scrolls deploy=production context=block at=exec
|
100
|
+
now="2017-09-01T00:37:13Z" app=scrolls deploy=production at=exception class=RuntimeError exception_id=70149797587080
|
101
|
+
now="2017-09-01T00:37:13Z" app=scrolls deploy=production at=exception class=RuntimeError exception_id=70149797587080 site="./test-scrolls.rb:16:in <main>"
|
64
102
|
```
|
65
103
|
|
66
104
|
## History
|
data/Rakefile
CHANGED
@@ -1,11 +1,13 @@
|
|
1
1
|
#!/usr/bin/env rake
|
2
|
+
|
2
3
|
require "bundler/gem_tasks"
|
4
|
+
require "rake/testtask"
|
3
5
|
|
4
6
|
ENV['TESTOPTS'] = "-v"
|
5
7
|
|
6
|
-
require "rake/testtask"
|
7
8
|
Rake::TestTask.new do |t|
|
8
|
-
t.
|
9
|
+
t.test_files = FileList["test/**/test_*.rb"]
|
10
|
+
t.verbose = true
|
9
11
|
end
|
10
12
|
|
11
13
|
task :default => :test
|
data/docs/global-context.md
CHANGED
data/docs/syslog.md
CHANGED
@@ -6,6 +6,14 @@ By default Scrolls writes log messages to `STDOUT`. With the release of [v0.2.8]
|
|
6
6
|
Scrolls.stream = "syslog"
|
7
7
|
```
|
8
8
|
|
9
|
+
Or using `Scrolls#init` in versions 0.9.0 and after:
|
10
|
+
|
11
|
+
```ruby
|
12
|
+
Scrolls.init(
|
13
|
+
stream: "syslog"
|
14
|
+
)
|
15
|
+
```
|
16
|
+
|
9
17
|
This defaults to syslog facility USER and log level ERROR. You can adjust the log facility like so:
|
10
18
|
|
11
19
|
```ruby
|
@@ -14,4 +22,9 @@ Scrolls.facility = "local7"
|
|
14
22
|
|
15
23
|
Scrolls generally doesn't care about log levels. The library defaults to ERROR (or 3), but ultimately is of the opinion that levels are useless. The reasoning behind this is that applications should log useful data, all of the time. Debugging data is great for development, but should never be deployed. The richness of structured logging allows exceptions and error messages to sit along side the context of the data in which the error was thrown, there is no need to send to an "emergency" level.
|
16
24
|
|
17
|
-
With that said, if one wanted to adjust the log level, you can set an environment variable `LOG_LEVEL
|
25
|
+
With that said, if one wanted to adjust the log level, you can set an environment variable `LOG_LEVEL` or use one of the level methods. This allows this particular feature to be rather fluid throughout your application.
|
26
|
+
|
27
|
+
```ruby
|
28
|
+
Scrolls.info(d: "data")
|
29
|
+
Scrolls.warn(d: "data")
|
30
|
+
```
|
data/lib/scrolls.rb
CHANGED
@@ -1,6 +1,4 @@
|
|
1
|
-
require "
|
2
|
-
require "scrolls/atomic"
|
3
|
-
require "scrolls/log"
|
1
|
+
require "scrolls/logger"
|
4
2
|
require "scrolls/version"
|
5
3
|
|
6
4
|
module Scrolls
|
@@ -8,33 +6,26 @@ module Scrolls
|
|
8
6
|
|
9
7
|
# Public: Initialize a Scrolls logger
|
10
8
|
#
|
11
|
-
# Convienence method to prepare for future releases. Currently mimics
|
12
|
-
# behavior found in other methods. This prepares the developer for a future
|
13
|
-
# backward incompatible change, see:
|
14
|
-
# https://github.com/asenchi/scrolls/pull/54
|
15
|
-
#
|
16
9
|
# options - A hash of key/values for configuring Scrolls
|
17
|
-
#
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
if exceptions == "single"
|
32
|
-
Log.single_line_exceptions = true
|
33
|
-
end
|
10
|
+
# stream - Stream to output data (default: STDOUT)
|
11
|
+
# log_facility - Syslog facility (default: Syslog::LOG_USER)
|
12
|
+
# time_unit - Unit of time (default: seconds)
|
13
|
+
# timestamp - Prepend logs with a timestamp (default: false)
|
14
|
+
# exceptions - Method for outputting exceptions (default: single line)
|
15
|
+
# global_context - Immutable context to prepend all messages with
|
16
|
+
# syslog_options - Syslog options (default: Syslog::LOG_PID|Syslog::LOG_CONS)
|
17
|
+
# escape_keys - Escape chars in keys
|
18
|
+
#
|
19
|
+
def init(options={})
|
20
|
+
# Set a hint whether #init was called.
|
21
|
+
@initialized = true
|
22
|
+
@log = Logger.new(options)
|
23
|
+
end
|
34
24
|
|
35
|
-
|
36
|
-
|
37
|
-
|
25
|
+
# Public: Get the primary logger
|
26
|
+
#
|
27
|
+
def logger
|
28
|
+
@log.logger
|
38
29
|
end
|
39
30
|
|
40
31
|
# Public: Set a context in a block for logs
|
@@ -45,37 +36,13 @@ module Scrolls
|
|
45
36
|
# Examples:
|
46
37
|
#
|
47
38
|
def context(data, &blk)
|
48
|
-
|
49
|
-
end
|
50
|
-
|
51
|
-
# Deprecated: Get or set a global context that prefixs all logs
|
52
|
-
#
|
53
|
-
# data - A hash of key/values to prepend to each log
|
54
|
-
#
|
55
|
-
# This method will be deprecated two releases after 0.3.8.
|
56
|
-
# See https://github.com/asenchi/scrolls/releases/tag/v0.3.8
|
57
|
-
# for more details.
|
58
|
-
#
|
59
|
-
def global_context(data=nil)
|
60
|
-
$stderr.puts "global_context() will be deprecated after v0.3.8, please see https://github.com/asenchi/scrolls for more information."
|
61
|
-
if data
|
62
|
-
Log.global_context = data
|
63
|
-
else
|
64
|
-
Log.global_context
|
65
|
-
end
|
39
|
+
@log.with_context(data, &blk)
|
66
40
|
end
|
67
41
|
|
68
|
-
#
|
69
|
-
#
|
70
|
-
# data - A hash of key/values to prepend to each log
|
71
|
-
#
|
72
|
-
# This method will be deprecated two releases after 0.3.8.
|
73
|
-
# See https://github.com/asenchi/scrolls/releases/tag/v0.3.8
|
74
|
-
# for more details.
|
42
|
+
# Public: Get the global context that prefixs all logs
|
75
43
|
#
|
76
|
-
def
|
77
|
-
|
78
|
-
Log.add_global_context(data)
|
44
|
+
def global_context
|
45
|
+
@log.global_context
|
79
46
|
end
|
80
47
|
|
81
48
|
# Public: Log data and/or wrap a block with start/finish
|
@@ -96,26 +63,32 @@ module Scrolls
|
|
96
63
|
# => nil
|
97
64
|
#
|
98
65
|
def log(data, &blk)
|
99
|
-
|
66
|
+
# Allows us to call #log directly and initialize defaults
|
67
|
+
@log = Logger.new({}) unless @initialized
|
68
|
+
|
69
|
+
@log.log(data, &blk)
|
100
70
|
end
|
101
71
|
|
102
72
|
# Public: Log an exception
|
103
73
|
#
|
104
|
-
# data - A hash of key/values to log
|
105
74
|
# e - An exception to pass to the logger
|
75
|
+
# data - A hash of key/values to log
|
106
76
|
#
|
107
77
|
# Examples:
|
108
78
|
#
|
109
79
|
# begin
|
110
80
|
# raise Exception
|
111
81
|
# rescue Exception => e
|
112
|
-
# Scrolls.log_exception({test: "test"}
|
82
|
+
# Scrolls.log_exception(e, {test: "test"})
|
113
83
|
# end
|
114
84
|
# test=test at=exception class=Exception message=Exception exception_id=70321999017240
|
115
85
|
# ...
|
116
86
|
#
|
117
|
-
def log_exception(
|
118
|
-
|
87
|
+
def log_exception(e, data)
|
88
|
+
# Allows us to call #log directly and initialize defaults
|
89
|
+
@log = Logger.new({}) unless @initialized
|
90
|
+
|
91
|
+
@log.log_exception(e, data)
|
119
92
|
end
|
120
93
|
|
121
94
|
# Public: Setup a logging facility (default: Syslog::LOG_USER)
|
@@ -127,7 +100,7 @@ module Scrolls
|
|
127
100
|
# Scrolls.facility = Syslog::LOG_LOCAL7
|
128
101
|
#
|
129
102
|
def facility=(f)
|
130
|
-
|
103
|
+
@log.facility=(f)
|
131
104
|
end
|
132
105
|
|
133
106
|
# Public: Return the Syslog facility
|
@@ -138,7 +111,7 @@ module Scrolls
|
|
138
111
|
# => 8
|
139
112
|
#
|
140
113
|
def facility
|
141
|
-
|
114
|
+
@log.facility
|
142
115
|
end
|
143
116
|
|
144
117
|
# Public: Setup a new output (default: STDOUT)
|
@@ -154,7 +127,7 @@ module Scrolls
|
|
154
127
|
# Scrolls.stream = StringIO.new
|
155
128
|
#
|
156
129
|
def stream=(out)
|
157
|
-
|
130
|
+
@log.stream=(out)
|
158
131
|
end
|
159
132
|
|
160
133
|
# Public: Return the stream
|
@@ -165,7 +138,7 @@ module Scrolls
|
|
165
138
|
# => #<IO:<STDOUT>>
|
166
139
|
#
|
167
140
|
def stream
|
168
|
-
|
141
|
+
@log.stream
|
169
142
|
end
|
170
143
|
|
171
144
|
# Public: Set the time unit we use for 'elapsed' (default: "seconds")
|
@@ -177,7 +150,7 @@ module Scrolls
|
|
177
150
|
# Scrolls.time_unit = "milliseconds"
|
178
151
|
#
|
179
152
|
def time_unit=(unit)
|
180
|
-
|
153
|
+
@log.time_unit = unit
|
181
154
|
end
|
182
155
|
|
183
156
|
# Public: Return the time unit currently configured
|
@@ -188,7 +161,7 @@ module Scrolls
|
|
188
161
|
# => "seconds"
|
189
162
|
#
|
190
163
|
def time_unit
|
191
|
-
|
164
|
+
@log.time_unit
|
192
165
|
end
|
193
166
|
|
194
167
|
# Public: Set whether to include a timestamp (now=<ISO8601>) field in the log
|
@@ -199,7 +172,7 @@ module Scrolls
|
|
199
172
|
# Scrolls.add_timestamp = true
|
200
173
|
#
|
201
174
|
def add_timestamp=(boolean)
|
202
|
-
|
175
|
+
@log.timestamp = boolean
|
203
176
|
end
|
204
177
|
|
205
178
|
# Public: Return whether the timestamp field will be included in the log
|
@@ -211,7 +184,7 @@ module Scrolls
|
|
211
184
|
# => true
|
212
185
|
#
|
213
186
|
def add_timestamp
|
214
|
-
|
187
|
+
@log.timestamp
|
215
188
|
end
|
216
189
|
|
217
190
|
# Public: Set whether exceptions should generate a single log
|
@@ -222,7 +195,7 @@ module Scrolls
|
|
222
195
|
# Scrolls.single_line_exceptions = true
|
223
196
|
#
|
224
197
|
def single_line_exceptions=(boolean)
|
225
|
-
|
198
|
+
@log.exceptions = boolean
|
226
199
|
end
|
227
200
|
|
228
201
|
# Public: Return whether exceptions generate a single log message.
|
@@ -233,7 +206,7 @@ module Scrolls
|
|
233
206
|
# => true
|
234
207
|
#
|
235
208
|
def single_line_exceptions?
|
236
|
-
|
209
|
+
@log.single_line_exceptions?
|
237
210
|
end
|
238
211
|
|
239
212
|
# Public: Convience method for Logger replacement
|
@@ -248,8 +221,8 @@ module Scrolls
|
|
248
221
|
# => nil
|
249
222
|
#
|
250
223
|
def debug(data, &blk)
|
251
|
-
data = data.merge(:level => "debug")
|
252
|
-
|
224
|
+
data = data.merge(:level => "debug") if data.is_a?(Hash)
|
225
|
+
@log.log(data, &blk)
|
253
226
|
end
|
254
227
|
|
255
228
|
# Public: Convience method for Logger replacement
|
@@ -266,8 +239,8 @@ module Scrolls
|
|
266
239
|
# => nil
|
267
240
|
#
|
268
241
|
def error(data, &blk)
|
269
|
-
data = data.merge(:level => "warning")
|
270
|
-
|
242
|
+
data = data.merge(:level => "warning") if data.is_a?(Hash)
|
243
|
+
@log.log(data, &blk)
|
271
244
|
end
|
272
245
|
|
273
246
|
# Public: Convience method for Logger replacement
|
@@ -284,8 +257,8 @@ module Scrolls
|
|
284
257
|
# => nil
|
285
258
|
#
|
286
259
|
def fatal(data, &blk)
|
287
|
-
data = data.merge(:level => "error")
|
288
|
-
|
260
|
+
data = data.merge(:level => "error") if data.is_a?(Hash)
|
261
|
+
@log.log(data, &blk)
|
289
262
|
end
|
290
263
|
|
291
264
|
# Public: Convience method for Logger replacement
|
@@ -302,8 +275,8 @@ module Scrolls
|
|
302
275
|
# => nil
|
303
276
|
#
|
304
277
|
def info(data, &blk)
|
305
|
-
data = data.merge(:level => "info")
|
306
|
-
|
278
|
+
data = data.merge(:level => "info") if data.is_a?(Hash)
|
279
|
+
@log.log(data, &blk)
|
307
280
|
end
|
308
281
|
|
309
282
|
# Public: Convience method for Logger replacement
|
@@ -320,8 +293,8 @@ module Scrolls
|
|
320
293
|
# => nil
|
321
294
|
#
|
322
295
|
def warn(data, &blk)
|
323
|
-
data = data.merge(:level => "notice")
|
324
|
-
|
296
|
+
data = data.merge(:level => "notice") if data.is_a?(Hash)
|
297
|
+
@log.log(data, &blk)
|
325
298
|
end
|
326
299
|
|
327
300
|
# Public: Convience method for Logger replacement
|
@@ -338,8 +311,14 @@ module Scrolls
|
|
338
311
|
# => nil
|
339
312
|
#
|
340
313
|
def unknown(data, &blk)
|
341
|
-
data = data.merge(:level => "alert")
|
342
|
-
|
314
|
+
data = data.merge(:level => "alert") if data.is_a?(Hash)
|
315
|
+
@log.log(data, &blk)
|
316
|
+
end
|
317
|
+
|
318
|
+
# Internal: The Logger initialized by #init
|
319
|
+
#
|
320
|
+
def internal
|
321
|
+
@log
|
343
322
|
end
|
344
323
|
|
345
324
|
end
|