scrolls 0.3.9 → 0.9.3

Sign up to get free protection for your applications and to get access to all the features.
data/lib/scrolls/log.rb DELETED
@@ -1,262 +0,0 @@
1
- require "scrolls/parser"
2
- require "scrolls/utils"
3
- require "scrolls/iolog"
4
- require "scrolls/syslog"
5
-
6
- module Scrolls
7
-
8
- class TimeUnitError < RuntimeError; end
9
-
10
- module Log
11
- extend self
12
-
13
- extend Parser
14
- extend Utils
15
-
16
- LOG_LEVEL = (ENV['LOG_LEVEL'] || 6).to_i
17
- LOG_LEVEL_MAP = {
18
- "emergency" => 0,
19
- "alert" => 1,
20
- "critical" => 2,
21
- "error" => 3,
22
- "warning" => 4,
23
- "notice" => 5,
24
- "info" => 6,
25
- "debug" => 7
26
- }
27
-
28
- def context
29
- Thread.current[:scrolls_context] ||= {}
30
- end
31
-
32
- def context=(h)
33
- Thread.current[:scrolls_context] = h
34
- end
35
-
36
- def global_context
37
- get_global_context
38
- end
39
-
40
- def global_context=(data)
41
- set_global_context(data)
42
- end
43
-
44
- def add_global_context(new_data)
45
- default_global_context unless @global_context
46
- @global_context.update { |previous_data| previous_data.merge(new_data) }
47
- end
48
-
49
- def facility=(f)
50
- @facility = LOG_FACILITY_MAP[f] if f
51
- if Scrolls::SyslogLogger.opened?
52
- Scrolls::SyslogLogger.new(progname, facility)
53
- end
54
- end
55
-
56
- def facility
57
- @facility ||= default_log_facility
58
- end
59
-
60
- def stream=(out=nil)
61
- @defined = out.nil? ? false : true
62
- if out == 'syslog'
63
- @stream = Scrolls::SyslogLogger.new(progname, facility)
64
- else
65
- @stream = sync_stream(out)
66
- end
67
- end
68
-
69
- def stream
70
- @stream ||= sync_stream
71
- end
72
-
73
- def time_unit=(u)
74
- set_time_unit(u)
75
- end
76
-
77
- def time_unit
78
- @tunit ||= default_time_unit
79
- end
80
-
81
- def add_timestamp=(b)
82
- @add_timestamp = !!b
83
- end
84
-
85
- def add_timestamp
86
- @add_timestamp || false
87
- end
88
-
89
- def single_line_exceptions=(b)
90
- @single_line_exceptions = !!b
91
- end
92
-
93
- def single_line_exceptions?
94
- @single_line_exceptions || false
95
- end
96
-
97
- def log(data, &blk)
98
- # If we get a string lets bring it into our structure.
99
- if data.kind_of? String
100
- rawhash = { "log_message" => data }
101
- else
102
- rawhash = data
103
- end
104
-
105
- if gc = get_global_context
106
- ctx = gc.merge(context)
107
- logdata = ctx.merge(rawhash)
108
- end
109
-
110
- # By merging the logdata into the timestamp, rather than vice-versa, we
111
- # ensure that the timestamp comes first in the Hash, and is placed first
112
- # on the output, which helps with readability.
113
- logdata = { :now => Time.now.utc }.merge(logdata) if add_timestamp
114
-
115
- unless blk
116
- write(logdata)
117
- else
118
- start = Time.now
119
- res = nil
120
- log(logdata.merge(:at => "start"))
121
- begin
122
- res = yield
123
- rescue StandardError => e
124
- log(logdata.merge(
125
- :at => "exception",
126
- :reraise => true,
127
- :class => e.class,
128
- :message => e.message,
129
- :exception_id => e.object_id.abs,
130
- :elapsed => calc_time(start, Time.now)
131
- ))
132
- raise e
133
- end
134
- log(logdata.merge(:at => "finish", :elapsed => calc_time(start, Time.now)))
135
- res
136
- end
137
- end
138
-
139
- def log_exception(data, e)
140
- sync_stream(STDERR) unless @defined
141
-
142
- # If we get a string lets bring it into our structure.
143
- if data.kind_of? String
144
- rawhash = { "log_message" => data }
145
- else
146
- rawhash = data
147
- end
148
-
149
- if gc = get_global_context
150
- logdata = gc.merge(rawhash)
151
- end
152
-
153
- excepdata = {
154
- :at => "exception",
155
- :class => e.class,
156
- :message => e.message,
157
- :exception_id => e.object_id.abs
158
- }
159
-
160
- if e.backtrace
161
- if single_line_exceptions?
162
- btlines = []
163
- e.backtrace.each do |line|
164
- btlines << line.gsub(/[`'"]/, "")
165
- end
166
-
167
- if btlines.length > 0
168
- squish = { :site => btlines.join('\n') }
169
- log(logdata.merge(excepdata.merge(squish)))
170
- end
171
- else
172
- log(logdata.merge(excepdata))
173
-
174
- e.backtrace.each do |line|
175
- log(logdata.merge(excepdata).merge(
176
- :at => "exception",
177
- :class => e.class,
178
- :exception_id => e.object_id.abs,
179
- :site => line.gsub(/[`'"]/, "")
180
- ))
181
- end
182
- end
183
- end
184
- end
185
-
186
- def with_context(prefix)
187
- return unless block_given?
188
- old = context
189
- self.context = old.merge(prefix)
190
- res = yield if block_given?
191
- ensure
192
- self.context = old
193
- res
194
- end
195
-
196
- private
197
-
198
- def get_global_context
199
- default_global_context unless @global_context
200
- @global_context.value
201
- end
202
-
203
- def set_global_context(data=nil)
204
- default_global_context unless @global_context
205
- @global_context.update { |_| data }
206
- end
207
-
208
- def default_global_context
209
- @global_context = Atomic.new({})
210
- end
211
-
212
- def set_time_unit(u=nil)
213
- unless ["ms","milli","milliseconds","s","seconds"].include?(u)
214
- raise TimeUnitError, "Specify only 'seconds' or 'milliseconds'"
215
- end
216
-
217
- if ["ms", "milli", "milliseconds", 1000].include?(u)
218
- @tunit = "milliseconds"
219
- @t = 1000.0
220
- else
221
- default_time_unit
222
- end
223
- end
224
-
225
- def default_time_unit
226
- @t = 1.0
227
- @tunit = "seconds"
228
- end
229
-
230
- def calc_time(start, finish)
231
- default_time_unit unless @t
232
- ((finish - start).to_f * @t)
233
- end
234
-
235
- def sync_stream(out = STDOUT)
236
- IOLog.new(out)
237
- end
238
-
239
- def write(data)
240
- if log_level_ok?(data[:level])
241
- msg = unparse(data)
242
- stream.log(msg)
243
- end
244
- end
245
-
246
- def log_level_ok?(level)
247
- if level
248
- LOG_LEVEL_MAP[level.to_s] <= LOG_LEVEL
249
- else
250
- true
251
- end
252
- end
253
-
254
- def progname
255
- File.basename($0)
256
- end
257
-
258
- def default_log_facility
259
- LOG_FACILITY
260
- end
261
- end
262
- end
@@ -1,46 +0,0 @@
1
- require 'syslog'
2
-
3
- module Scrolls
4
-
5
- LOG_FACILITY = ENV['LOG_FACILITY'] || Syslog::LOG_USER
6
- LOG_FACILITY_MAP = {
7
- "auth" => Syslog::LOG_AUTH,
8
- "authpriv" => Syslog::LOG_AUTHPRIV,
9
- "cron" => Syslog::LOG_CRON,
10
- "daemon" => Syslog::LOG_DAEMON,
11
- "ftp" => Syslog::LOG_FTP,
12
- "kern" => Syslog::LOG_KERN,
13
- "mail" => Syslog::LOG_MAIL,
14
- "news" => Syslog::LOG_NEWS,
15
- "syslog" => Syslog::LOG_SYSLOG,
16
- "user" => Syslog::LOG_USER,
17
- "uucp" => Syslog::LOG_UUCP,
18
- "local0" => Syslog::LOG_LOCAL0,
19
- "local1" => Syslog::LOG_LOCAL1,
20
- "local2" => Syslog::LOG_LOCAL2,
21
- "local3" => Syslog::LOG_LOCAL3,
22
- "local4" => Syslog::LOG_LOCAL4,
23
- "local5" => Syslog::LOG_LOCAL5,
24
- "local6" => Syslog::LOG_LOCAL6,
25
- "local7" => Syslog::LOG_LOCAL7,
26
- }
27
-
28
- class SyslogLogger
29
- def initialize(ident = 'scrolls', facility = Syslog::LOG_USER)
30
- options = Syslog::LOG_PID|Syslog::LOG_CONS
31
- if Syslog.opened?
32
- @syslog = Syslog.reopen(ident, options, facility)
33
- else
34
- @syslog = Syslog.open(ident, options, facility)
35
- end
36
- end
37
-
38
- def log(data)
39
- @syslog.log(Syslog::LOG_INFO, "%s", data)
40
- end
41
-
42
- def self.opened?
43
- Syslog.opened?
44
- end
45
- end
46
- end
data/test/test_atomic.rb DELETED
@@ -1,33 +0,0 @@
1
- require_relative "test_helper"
2
-
3
- class TestAtomic < Test::Unit::TestCase
4
- def test_construct
5
- atomic = Scrolls::Atomic.new
6
- assert_equal nil, atomic.value
7
-
8
- atomic = Scrolls::Atomic.new(0)
9
- assert_equal 0, atomic.value
10
- end
11
-
12
- def test_value
13
- atomic = Scrolls::Atomic.new(0)
14
- atomic.value = 1
15
-
16
- assert_equal 1, atomic.value
17
- end
18
-
19
- def test_update
20
- atomic = Scrolls::Atomic.new(1000)
21
- res = atomic.update {|v| v + 1}
22
-
23
- assert_equal 1001, atomic.value
24
- assert_equal 1001, res
25
- end
26
-
27
- def test_update_retries
28
- tries = 0
29
- atomic = Scrolls::Atomic.new(1000)
30
- atomic.update{|v| tries += 1 ; atomic.value = 1001 ; v + 1}
31
- assert_equal 2, tries
32
- end
33
- end