scrolls 0.3.7 → 0.9.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 +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
data/test/test_parser.rb
CHANGED
@@ -1,6 +1,6 @@
|
|
1
|
-
|
1
|
+
require File.expand_path("../test_helper", __FILE__)
|
2
2
|
|
3
|
-
class TestScrollsParser < Test
|
3
|
+
class TestScrollsParser < Minitest::Test
|
4
4
|
include Scrolls::Parser
|
5
5
|
|
6
6
|
def test_parse_bool
|
@@ -79,6 +79,15 @@ class TestScrollsParser < Test::Unit::TestCase
|
|
79
79
|
assert_equal 't="2012-06-19T16:02:35+01:00"', unparse(data)
|
80
80
|
end
|
81
81
|
|
82
|
+
def test_unparse_escape_keys
|
83
|
+
html = "<p>p</p>"
|
84
|
+
slash = "p/p"
|
85
|
+
|
86
|
+
data = { html => "d", slash => "d" }
|
87
|
+
assert_equal '<p>p</p>=d p/p=d',
|
88
|
+
unparse(data, escape_keys=true)
|
89
|
+
end
|
90
|
+
|
82
91
|
def test_parse_time
|
83
92
|
time = Time.new(2012, 06, 19, 16, 02, 35, "+01:00")
|
84
93
|
string = "t=2012-06-19T16:02:35+01:00"
|
data/test/test_scrolls.rb
CHANGED
@@ -1,44 +1,35 @@
|
|
1
|
-
|
1
|
+
require File.expand_path("../test_helper", __FILE__)
|
2
2
|
|
3
|
-
class TestScrolls < Test
|
3
|
+
class TestScrolls < Minitest::Test
|
4
4
|
def setup
|
5
5
|
@out = StringIO.new
|
6
|
-
Scrolls.
|
6
|
+
Scrolls.init(
|
7
|
+
:stream => @out
|
8
|
+
)
|
7
9
|
end
|
8
10
|
|
9
|
-
def
|
10
|
-
Scrolls.
|
11
|
-
|
12
|
-
Scrolls.facility = Scrolls::LOG_FACILITY
|
13
|
-
Scrolls.add_timestamp = false
|
14
|
-
end
|
15
|
-
|
16
|
-
def test_construct
|
17
|
-
assert_equal StringIO, Scrolls.stream.class
|
11
|
+
def test_default_construct
|
12
|
+
Scrolls.init
|
13
|
+
assert_equal Scrolls::IOLogger, Scrolls.logger.class
|
18
14
|
end
|
19
15
|
|
20
16
|
def test_default_global_context
|
17
|
+
Scrolls.init(:stream => @out)
|
21
18
|
assert_equal Hash.new, Scrolls.global_context
|
22
19
|
end
|
23
20
|
|
24
21
|
def test_setting_global_context
|
25
|
-
Scrolls.
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
end
|
30
|
-
|
31
|
-
def test_adding_to_global_context
|
32
|
-
Scrolls.global_context(:g => "g")
|
33
|
-
Scrolls.add_global_context(:h => "h")
|
22
|
+
Scrolls.init(
|
23
|
+
:stream => @out,
|
24
|
+
:global_context => {:g => "g"},
|
25
|
+
)
|
34
26
|
Scrolls.log(:d => "d")
|
35
|
-
|
36
|
-
assert_match /g=g.*h=h.*d=d/, global
|
27
|
+
assert_equal "g=g d=d\n", @out.string
|
37
28
|
end
|
38
29
|
|
39
30
|
def test_default_context
|
40
|
-
Scrolls.log(:
|
41
|
-
assert_equal Hash.new, Scrolls
|
31
|
+
Scrolls.log(:d => "d")
|
32
|
+
assert_equal Hash.new, Scrolls.internal.context
|
42
33
|
end
|
43
34
|
|
44
35
|
def test_setting_context
|
@@ -48,15 +39,19 @@ class TestScrolls < Test::Unit::TestCase
|
|
48
39
|
end
|
49
40
|
|
50
41
|
def test_all_the_contexts
|
51
|
-
Scrolls.
|
42
|
+
Scrolls.init(
|
43
|
+
:stream => @out,
|
44
|
+
:global_context => {:g => "g"},
|
45
|
+
)
|
52
46
|
Scrolls.log(:o => "o") do
|
53
47
|
Scrolls.context(:c => "c") do
|
54
48
|
Scrolls.log(:ic => "i")
|
55
49
|
end
|
56
50
|
Scrolls.log(:i => "i")
|
57
51
|
end
|
58
|
-
|
59
|
-
|
52
|
+
@out.truncate(37)
|
53
|
+
output = "g=g o=o at=start\ng=g c=c ic=i\ng=g i=i"
|
54
|
+
assert_equal output, @out.string
|
60
55
|
end
|
61
56
|
|
62
57
|
def test_deeply_nested_context
|
@@ -89,12 +84,27 @@ class TestScrolls < Test::Unit::TestCase
|
|
89
84
|
raise "Error from inside of context"
|
90
85
|
end
|
91
86
|
fail "Exception did not escape context block"
|
92
|
-
rescue
|
87
|
+
rescue
|
93
88
|
Scrolls.log(:o => 'o')
|
94
89
|
assert_equal "o=o\n", @out.string
|
95
90
|
end
|
96
91
|
end
|
97
92
|
|
93
|
+
def test_deeply_nested_context_after_exception
|
94
|
+
Scrolls.log(:o => "o") do
|
95
|
+
begin
|
96
|
+
Scrolls.log(:io => 'io') do
|
97
|
+
raise "Error from inside of nested logging"
|
98
|
+
end
|
99
|
+
rescue
|
100
|
+
Scrolls.log(:o => 'o')
|
101
|
+
end
|
102
|
+
end
|
103
|
+
@out.truncate(124)
|
104
|
+
output = "o=o at=start\nio=io at=start\nio=io at=exception reraise=true class=RuntimeError message=\"Error from inside of nested logging\""
|
105
|
+
assert_equal output, @out.string
|
106
|
+
end
|
107
|
+
|
98
108
|
def test_default_time_unit
|
99
109
|
assert_equal "seconds", Scrolls.time_unit
|
100
110
|
end
|
@@ -105,8 +115,15 @@ class TestScrolls < Test::Unit::TestCase
|
|
105
115
|
end
|
106
116
|
|
107
117
|
def test_setting_incorrect_time_unit
|
108
|
-
|
118
|
+
assert_raises Scrolls::TimeUnitError do
|
109
119
|
Scrolls.time_unit = "years"
|
120
|
+
Scrolls.log(:tu => "yrs")
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
def test_unknown_log_level
|
125
|
+
assert_raises Scrolls::LogLevelError do
|
126
|
+
Scrolls.log(:level => "nope")
|
110
127
|
end
|
111
128
|
end
|
112
129
|
|
@@ -125,28 +142,28 @@ class TestScrolls < Test::Unit::TestCase
|
|
125
142
|
begin
|
126
143
|
raise Exception
|
127
144
|
rescue Exception => e
|
128
|
-
Scrolls.log_exception({:test => "exception"}
|
145
|
+
Scrolls.log_exception(e, {:test => "exception"})
|
129
146
|
end
|
130
147
|
|
131
|
-
|
132
|
-
|
133
|
-
assert_match /test=exception at=exception.*test_log_exception.*XX.*minitest/,
|
134
|
-
oneline_backtrace
|
148
|
+
oneline_bt = @out.string.gsub("\n", 'XX')
|
149
|
+
assert_match(/test=exception at=exception.*test_log_exception.*XX/, oneline_bt)
|
135
150
|
end
|
136
151
|
|
137
|
-
def
|
138
|
-
Scrolls.single_line_exceptions =
|
152
|
+
def test_multi_line_exceptions
|
153
|
+
Scrolls.single_line_exceptions = "multi"
|
139
154
|
begin
|
140
155
|
raise Exception
|
141
156
|
rescue Exception => e
|
142
|
-
Scrolls.log_exception({:o => "o"}
|
157
|
+
Scrolls.log_exception(e, {:o => "o"})
|
143
158
|
end
|
144
|
-
|
159
|
+
|
160
|
+
oneline_bt = @out.string.gsub("\n", 'XX')
|
161
|
+
assert_match(/o=o at=exception.*test_multi_line_exceptions.*XX/, oneline_bt)
|
145
162
|
end
|
146
163
|
|
147
164
|
def test_syslog_integration
|
148
165
|
Scrolls.stream = 'syslog'
|
149
|
-
assert_equal Scrolls::SyslogLogger, Scrolls.
|
166
|
+
assert_equal Scrolls::SyslogLogger, Scrolls.internal.logger.class
|
150
167
|
end
|
151
168
|
|
152
169
|
def test_syslog_facility
|
@@ -162,7 +179,7 @@ class TestScrolls < Test::Unit::TestCase
|
|
162
179
|
def test_setting_syslog_facility_after_instantiation
|
163
180
|
Scrolls.stream = 'syslog'
|
164
181
|
Scrolls.facility = 'local7'
|
165
|
-
assert_match
|
182
|
+
assert_match(/facility=184/, Scrolls.internal.logger.inspect)
|
166
183
|
end
|
167
184
|
|
168
185
|
def test_add_timestamp
|
@@ -204,4 +221,24 @@ class TestScrolls < Test::Unit::TestCase
|
|
204
221
|
assert_equal "t=t level=alert\n", @out.string
|
205
222
|
end
|
206
223
|
|
224
|
+
def test_sending_string_error
|
225
|
+
Scrolls.error("error")
|
226
|
+
assert_equal "log_message=error\n", @out.string
|
227
|
+
end
|
228
|
+
|
229
|
+
def test_sending_string_fatal
|
230
|
+
Scrolls.fatal("fatal")
|
231
|
+
assert_equal "log_message=fatal\n", @out.string
|
232
|
+
end
|
233
|
+
|
234
|
+
def test_sending_string_warn
|
235
|
+
Scrolls.warn("warn")
|
236
|
+
assert_equal "log_message=warn\n", @out.string
|
237
|
+
end
|
238
|
+
|
239
|
+
def test_sending_string_unknown
|
240
|
+
Scrolls.unknown("unknown")
|
241
|
+
assert_equal "log_message=unknown\n", @out.string
|
242
|
+
end
|
243
|
+
|
207
244
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: scrolls
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.9.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Curt Micol
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-06-06 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: Logging, easier, more consistent.
|
14
14
|
email:
|
@@ -25,14 +25,13 @@ files:
|
|
25
25
|
- docs/global-context.md
|
26
26
|
- docs/syslog.md
|
27
27
|
- lib/scrolls.rb
|
28
|
-
- lib/scrolls/
|
29
|
-
- lib/scrolls/
|
28
|
+
- lib/scrolls/iologger.rb
|
29
|
+
- lib/scrolls/logger.rb
|
30
30
|
- lib/scrolls/parser.rb
|
31
|
-
- lib/scrolls/
|
31
|
+
- lib/scrolls/sysloglogger.rb
|
32
32
|
- lib/scrolls/utils.rb
|
33
33
|
- lib/scrolls/version.rb
|
34
34
|
- scrolls.gemspec
|
35
|
-
- test/test_atomic.rb
|
36
35
|
- test/test_helper.rb
|
37
36
|
- test/test_parser.rb
|
38
37
|
- test/test_scrolls.rb
|
@@ -55,13 +54,11 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
55
54
|
- !ruby/object:Gem::Version
|
56
55
|
version: '0'
|
57
56
|
requirements: []
|
58
|
-
|
59
|
-
rubygems_version: 2.2.0
|
57
|
+
rubygems_version: 3.0.3
|
60
58
|
signing_key:
|
61
59
|
specification_version: 4
|
62
60
|
summary: When do we log? All the time.
|
63
61
|
test_files:
|
64
|
-
- test/test_atomic.rb
|
65
62
|
- test/test_helper.rb
|
66
63
|
- test/test_parser.rb
|
67
64
|
- test/test_scrolls.rb
|
data/lib/scrolls/atomic.rb
DELETED
@@ -1,59 +0,0 @@
|
|
1
|
-
require 'thread'
|
2
|
-
|
3
|
-
module Scrolls
|
4
|
-
# The result of issues with an update I made to Scrolls. After talking with
|
5
|
-
# Fabio Kung about a fix I started work on an atomic object, but he added some
|
6
|
-
# fixes to #context without it and then used Headius' atomic gem.
|
7
|
-
#
|
8
|
-
# The code below is the start and cleanup of my atomic object. It's slim on
|
9
|
-
# details and eventually cleaned up around inspiration from Headius' code.
|
10
|
-
#
|
11
|
-
# LICENSE: Apache 2.0
|
12
|
-
#
|
13
|
-
# See Headius' atomic gem here:
|
14
|
-
# https://github.com/headius/ruby-atomic
|
15
|
-
class AtomicObject
|
16
|
-
def initialize(o)
|
17
|
-
@mtx = Mutex.new
|
18
|
-
@o = o
|
19
|
-
end
|
20
|
-
|
21
|
-
def get
|
22
|
-
@mtx.synchronize { @o }
|
23
|
-
end
|
24
|
-
|
25
|
-
def set(n)
|
26
|
-
@mtx.synchronize { @o = n }
|
27
|
-
end
|
28
|
-
|
29
|
-
def verify_set(o, n)
|
30
|
-
return false unless @mtx.try_lock
|
31
|
-
begin
|
32
|
-
return false unless @o.equal? o
|
33
|
-
@o = n
|
34
|
-
ensure
|
35
|
-
@mtx.unlock
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
class Atomic < AtomicObject
|
41
|
-
def initialize(v=nil)
|
42
|
-
super(v)
|
43
|
-
end
|
44
|
-
|
45
|
-
def value
|
46
|
-
self.get
|
47
|
-
end
|
48
|
-
|
49
|
-
def value=(v)
|
50
|
-
self.set(v)
|
51
|
-
v
|
52
|
-
end
|
53
|
-
|
54
|
-
def update
|
55
|
-
true until self.verify_set(o = self.get, n = yield(o))
|
56
|
-
n
|
57
|
-
end
|
58
|
-
end
|
59
|
-
end
|
data/lib/scrolls/log.rb
DELETED
@@ -1,274 +0,0 @@
|
|
1
|
-
require "scrolls/parser"
|
2
|
-
require "scrolls/utils"
|
3
|
-
require "scrolls/syslog"
|
4
|
-
|
5
|
-
module Scrolls
|
6
|
-
|
7
|
-
class TimeUnitError < RuntimeError; end
|
8
|
-
|
9
|
-
module Log
|
10
|
-
extend self
|
11
|
-
|
12
|
-
extend Parser
|
13
|
-
extend Utils
|
14
|
-
|
15
|
-
LOG_LEVEL = (ENV['LOG_LEVEL'] || 6).to_i
|
16
|
-
LOG_LEVEL_MAP = {
|
17
|
-
"emergency" => 0,
|
18
|
-
"alert" => 1,
|
19
|
-
"critical" => 2,
|
20
|
-
"error" => 3,
|
21
|
-
"warning" => 4,
|
22
|
-
"notice" => 5,
|
23
|
-
"info" => 6,
|
24
|
-
"debug" => 7
|
25
|
-
}
|
26
|
-
|
27
|
-
def context
|
28
|
-
Thread.current[:scrolls_context] ||= {}
|
29
|
-
end
|
30
|
-
|
31
|
-
def context=(h)
|
32
|
-
Thread.current[:scrolls_context] = h
|
33
|
-
end
|
34
|
-
|
35
|
-
def global_context
|
36
|
-
get_global_context
|
37
|
-
end
|
38
|
-
|
39
|
-
def global_context=(data)
|
40
|
-
set_global_context(data)
|
41
|
-
end
|
42
|
-
|
43
|
-
def add_global_context(new_data)
|
44
|
-
default_global_context unless @global_context
|
45
|
-
@global_context.update { |previous_data| previous_data.merge(new_data) }
|
46
|
-
end
|
47
|
-
|
48
|
-
def facility=(f)
|
49
|
-
@facility = LOG_FACILITY_MAP[f] if f
|
50
|
-
if Scrolls::SyslogLogger.opened?
|
51
|
-
Scrolls::SyslogLogger.new(progname, facility)
|
52
|
-
end
|
53
|
-
end
|
54
|
-
|
55
|
-
def facility
|
56
|
-
@facility ||= default_log_facility
|
57
|
-
end
|
58
|
-
|
59
|
-
def stream=(out=nil)
|
60
|
-
@defined = out.nil? ? false : true
|
61
|
-
if out == 'syslog'
|
62
|
-
@stream = Scrolls::SyslogLogger.new(progname, facility)
|
63
|
-
else
|
64
|
-
@stream = sync_stream(out)
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
def stream
|
69
|
-
@stream ||= sync_stream
|
70
|
-
end
|
71
|
-
|
72
|
-
def time_unit=(u)
|
73
|
-
set_time_unit(u)
|
74
|
-
end
|
75
|
-
|
76
|
-
def time_unit
|
77
|
-
@tunit ||= default_time_unit
|
78
|
-
end
|
79
|
-
|
80
|
-
def add_timestamp=(b)
|
81
|
-
@add_timestamp = !!b
|
82
|
-
end
|
83
|
-
|
84
|
-
def add_timestamp
|
85
|
-
@add_timestamp || false
|
86
|
-
end
|
87
|
-
|
88
|
-
def single_line_exceptions=(b)
|
89
|
-
@single_line_exceptions = !!b
|
90
|
-
end
|
91
|
-
|
92
|
-
def single_line_exceptions?
|
93
|
-
@single_line_exceptions || false
|
94
|
-
end
|
95
|
-
|
96
|
-
def log(data, &blk)
|
97
|
-
# If we get a string lets bring it into our structure.
|
98
|
-
if data.kind_of? String
|
99
|
-
rawhash = { "log_message" => data }
|
100
|
-
else
|
101
|
-
rawhash = data
|
102
|
-
end
|
103
|
-
|
104
|
-
if gc = get_global_context
|
105
|
-
ctx = gc.merge(context)
|
106
|
-
logdata = ctx.merge(rawhash)
|
107
|
-
end
|
108
|
-
|
109
|
-
# By merging the logdata into the timestamp, rather than vice-versa, we
|
110
|
-
# ensure that the timestamp comes first in the Hash, and is placed first
|
111
|
-
# on the output, which helps with readability.
|
112
|
-
logdata = { :now => Time.now.utc }.merge(logdata) if add_timestamp
|
113
|
-
|
114
|
-
unless blk
|
115
|
-
write(logdata)
|
116
|
-
else
|
117
|
-
start = Time.now
|
118
|
-
res = nil
|
119
|
-
log(logdata.merge(:at => "start"))
|
120
|
-
begin
|
121
|
-
res = yield
|
122
|
-
rescue StandardError => e
|
123
|
-
log(logdata.merge(
|
124
|
-
:at => "exception",
|
125
|
-
:reraise => true,
|
126
|
-
:class => e.class,
|
127
|
-
:message => e.message,
|
128
|
-
:exception_id => e.object_id.abs,
|
129
|
-
:elapsed => calc_time(start, Time.now)
|
130
|
-
))
|
131
|
-
raise e
|
132
|
-
end
|
133
|
-
log(logdata.merge(:at => "finish", :elapsed => calc_time(start, Time.now)))
|
134
|
-
res
|
135
|
-
end
|
136
|
-
end
|
137
|
-
|
138
|
-
def log_exception(data, e)
|
139
|
-
sync_stream(STDERR) unless @defined
|
140
|
-
|
141
|
-
# If we get a string lets bring it into our structure.
|
142
|
-
if data.kind_of? String
|
143
|
-
rawhash = { "log_message" => data }
|
144
|
-
else
|
145
|
-
rawhash = data
|
146
|
-
end
|
147
|
-
|
148
|
-
if gc = get_global_context
|
149
|
-
logdata = gc.merge(rawhash)
|
150
|
-
end
|
151
|
-
|
152
|
-
excepdata = {
|
153
|
-
:at => "exception",
|
154
|
-
:class => e.class,
|
155
|
-
:message => e.message,
|
156
|
-
:exception_id => e.object_id.abs
|
157
|
-
}
|
158
|
-
|
159
|
-
if e.backtrace
|
160
|
-
if single_line_exceptions?
|
161
|
-
btlines = []
|
162
|
-
e.backtrace.each do |line|
|
163
|
-
btlines << line.gsub(/[`'"]/, "")
|
164
|
-
end
|
165
|
-
|
166
|
-
if btlines.length > 0
|
167
|
-
squish = { :site => btlines.join('\n') }
|
168
|
-
log(logdata.merge(excepdata.merge(squish)))
|
169
|
-
end
|
170
|
-
else
|
171
|
-
log(logdata.merge(excepdata))
|
172
|
-
|
173
|
-
e.backtrace.each do |line|
|
174
|
-
log(logdata.merge(excepdata).merge(
|
175
|
-
:at => "exception",
|
176
|
-
:class => e.class,
|
177
|
-
:exception_id => e.object_id.abs,
|
178
|
-
:site => line.gsub(/[`'"]/, "")
|
179
|
-
))
|
180
|
-
end
|
181
|
-
end
|
182
|
-
end
|
183
|
-
end
|
184
|
-
|
185
|
-
def with_context(prefix)
|
186
|
-
return unless block_given?
|
187
|
-
old = context
|
188
|
-
self.context = old.merge(prefix)
|
189
|
-
res = yield if block_given?
|
190
|
-
ensure
|
191
|
-
self.context = old
|
192
|
-
res
|
193
|
-
end
|
194
|
-
|
195
|
-
private
|
196
|
-
|
197
|
-
def get_global_context
|
198
|
-
default_global_context unless @global_context
|
199
|
-
@global_context.value
|
200
|
-
end
|
201
|
-
|
202
|
-
def set_global_context(data=nil)
|
203
|
-
default_global_context unless @global_context
|
204
|
-
@global_context.update { |_| data }
|
205
|
-
end
|
206
|
-
|
207
|
-
def default_global_context
|
208
|
-
@global_context = Atomic.new({})
|
209
|
-
end
|
210
|
-
|
211
|
-
def set_time_unit(u=nil)
|
212
|
-
unless ["ms","milli","milliseconds","s","seconds"].include?(u)
|
213
|
-
raise TimeUnitError, "Specify only 'seconds' or 'milliseconds'"
|
214
|
-
end
|
215
|
-
|
216
|
-
if ["ms", "milli", "milliseconds", 1000].include?(u)
|
217
|
-
@tunit = "milliseconds"
|
218
|
-
@t = 1000.0
|
219
|
-
else
|
220
|
-
default_time_unit
|
221
|
-
end
|
222
|
-
end
|
223
|
-
|
224
|
-
def default_time_unit
|
225
|
-
@t = 1.0
|
226
|
-
@tunit = "seconds"
|
227
|
-
end
|
228
|
-
|
229
|
-
def calc_time(start, finish)
|
230
|
-
default_time_unit unless @t
|
231
|
-
((finish - start).to_f * @t)
|
232
|
-
end
|
233
|
-
|
234
|
-
def mtx
|
235
|
-
@mtx ||= Mutex.new
|
236
|
-
end
|
237
|
-
|
238
|
-
def sync_stream(out=nil)
|
239
|
-
out = STDOUT if out.nil?
|
240
|
-
s = out
|
241
|
-
s.sync = true
|
242
|
-
s
|
243
|
-
end
|
244
|
-
|
245
|
-
def write(data)
|
246
|
-
if log_level_ok?(data[:level])
|
247
|
-
msg = unparse(data)
|
248
|
-
mtx.synchronize do
|
249
|
-
begin
|
250
|
-
stream.puts(msg)
|
251
|
-
rescue NoMethodError => e
|
252
|
-
raise
|
253
|
-
end
|
254
|
-
end
|
255
|
-
end
|
256
|
-
end
|
257
|
-
|
258
|
-
def log_level_ok?(level)
|
259
|
-
if level
|
260
|
-
LOG_LEVEL_MAP[level.to_s] <= LOG_LEVEL
|
261
|
-
else
|
262
|
-
true
|
263
|
-
end
|
264
|
-
end
|
265
|
-
|
266
|
-
def progname
|
267
|
-
File.basename($0)
|
268
|
-
end
|
269
|
-
|
270
|
-
def default_log_facility
|
271
|
-
LOG_FACILITY
|
272
|
-
end
|
273
|
-
end
|
274
|
-
end
|