pantheios-ruby 0.13.4 → 0.20.3.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/LICENSE +31 -0
- data/README.md +5 -0
- data/examples/simple_logging.md +65 -0
- data/examples/simple_logging.rb +35 -0
- data/lib/pantheios/api.rb +8 -8
- data/lib/pantheios/application_layer/stock_severity_levels.rb +3 -3
- data/lib/pantheios/core.rb +113 -15
- data/lib/pantheios/globals.rb +22 -3
- data/lib/pantheios/services.rb +3 -0
- data/lib/pantheios/services/multiplexing_log_service.rb +239 -0
- data/lib/pantheios/services/null_log_service.rb +2 -2
- data/lib/pantheios/services/simple_console_log_service.rb +7 -6
- data/lib/pantheios/services/simple_file_log_service.rb +230 -0
- data/lib/pantheios/util/process_util.rb +32 -4
- data/lib/pantheios/util/reflection_util.rb +34 -0
- data/lib/pantheios/version.rb +3 -3
- data/test/performance/test_perf_simple_statements.rb +40 -7
- data/test/scratch/log_files/placeholder +0 -0
- data/test/scratch/log_rolling_by_period_daily.rb +43 -0
- data/test/scratch/log_rolling_by_size_and_depth.rb +43 -0
- data/test/scratch/log_using_blocks.rb +8 -1
- data/test/scratch/multiplexing_log_service.rb +109 -0
- data/test/unit/core/tc_core_1.rb +54 -0
- data/test/unit/core/ts_all.rb +12 -0
- data/test/unit/services/tc_multiplexing_log_service.rb +144 -0
- data/test/unit/services/tc_simple_console_log_service.rb +3 -3
- data/test/unit/services/tc_simple_file_log_service.rb +252 -0
- data/test/unit/util/tc_process_util.rb +24 -0
- data/test/unit/util/tc_reflection_util.rb +54 -0
- metadata +33 -21
@@ -4,13 +4,41 @@ module Util
|
|
4
4
|
|
5
5
|
module ProcessUtil
|
6
6
|
|
7
|
-
|
7
|
+
#
|
8
|
+
# * *Options:*
|
9
|
+
# - +:style+:: (:script, :script_basename, :script_dirname,
|
10
|
+
# :script_realpath, :script_stem) directs the inference of the process
|
11
|
+
# name. If none specified, :script_stem is assumed
|
12
|
+
def self.derive_process_name dollar0 = nil, **options
|
8
13
|
|
9
|
-
dollar0
|
14
|
+
dollar0 ||= $0
|
10
15
|
|
11
|
-
|
16
|
+
style = options[:style] || :script_stem
|
12
17
|
|
13
|
-
|
18
|
+
case style
|
19
|
+
when :script
|
20
|
+
|
21
|
+
dollar0
|
22
|
+
when :script_basename
|
23
|
+
|
24
|
+
File.basename(dollar0)
|
25
|
+
when :script_dirname
|
26
|
+
|
27
|
+
File.basename(File.realpath(File.dirname(dollar0)))
|
28
|
+
when :script_realpath
|
29
|
+
|
30
|
+
File.realpath(File.dirname(dollar0))
|
31
|
+
when :script_stem
|
32
|
+
|
33
|
+
bn = File.basename(dollar0)
|
34
|
+
|
35
|
+
bn =~ /\.rb$/ ? $` : bn
|
36
|
+
else
|
37
|
+
|
38
|
+
warn "#{self.class}##{__method__}: ignoring unrecognised type/value for ':style': '#{style}' (#{style.class})"
|
39
|
+
|
40
|
+
dollar0
|
41
|
+
end
|
14
42
|
end
|
15
43
|
|
16
44
|
end # module ProcessUtil
|
@@ -0,0 +1,34 @@
|
|
1
|
+
|
2
|
+
module Pantheios
|
3
|
+
module Util
|
4
|
+
|
5
|
+
module ReflectionUtil
|
6
|
+
|
7
|
+
module ReflectionUtil_Constants
|
8
|
+
|
9
|
+
ROOT_CLASSES = [ ::Object, ::BasicObject ]
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.non_root_classes o
|
13
|
+
|
14
|
+
return [] if o.nil?
|
15
|
+
|
16
|
+
return self.non_root_classes o.class unless ::Class === o
|
17
|
+
|
18
|
+
return [] if ReflectionUtil_Constants::ROOT_CLASSES.any? { |c| c == o }
|
19
|
+
|
20
|
+
s = o.superclass
|
21
|
+
|
22
|
+
return [ o ] if ::Object == s
|
23
|
+
|
24
|
+
[ o ] + self.non_root_classes(s)
|
25
|
+
end
|
26
|
+
|
27
|
+
end # module ProcessUtil
|
28
|
+
|
29
|
+
end # module Util
|
30
|
+
end # module Pantheios
|
31
|
+
|
32
|
+
# ############################## end of file ############################# #
|
33
|
+
|
34
|
+
|
data/lib/pantheios/version.rb
CHANGED
@@ -5,13 +5,13 @@
|
|
5
5
|
# Purpose: Version for Pantheios.Ruby library
|
6
6
|
#
|
7
7
|
# Created: 2nd April 2011
|
8
|
-
# Updated:
|
8
|
+
# Updated: 5th June 2019
|
9
9
|
#
|
10
10
|
# Home: http://github.com/synesissoftware/Pantheios-Ruby
|
11
11
|
#
|
12
12
|
# Author: Matthew Wilson
|
13
13
|
#
|
14
|
-
# Copyright (c) 2011-
|
14
|
+
# Copyright (c) 2011-2019, Matthew Wilson and Synesis Software
|
15
15
|
# All rights reserved.
|
16
16
|
#
|
17
17
|
# Redistribution and use in source and binary forms, with or without
|
@@ -50,7 +50,7 @@
|
|
50
50
|
module Pantheios
|
51
51
|
|
52
52
|
# Current version of the Pantheios.Ruby library
|
53
|
-
VERSION = '0.
|
53
|
+
VERSION = '0.20.3.1'
|
54
54
|
|
55
55
|
private
|
56
56
|
VERSION_PARTS_ = VERSION.split(/[.]/).collect { |n| n.to_i } # :nodoc:
|
@@ -37,7 +37,9 @@ end
|
|
37
37
|
|
38
38
|
Benchmark.benchmark(Benchmark::CAPTION, 24, Benchmark::FORMAT, 'total:', 'avg:') do |r|
|
39
39
|
|
40
|
-
|
40
|
+
totals = []
|
41
|
+
|
42
|
+
totals << r.report("arguments (1-arg)") do
|
41
43
|
|
42
44
|
for i in (0...N) do
|
43
45
|
|
@@ -45,7 +47,7 @@ Benchmark.benchmark(Benchmark::CAPTION, 24, Benchmark::FORMAT, 'total:', 'avg:')
|
|
45
47
|
end
|
46
48
|
end
|
47
49
|
|
48
|
-
|
50
|
+
totals << r.report("blocks (1-arg)") do
|
49
51
|
|
50
52
|
for i in (0...N) do
|
51
53
|
|
@@ -53,7 +55,16 @@ Benchmark.benchmark(Benchmark::CAPTION, 24, Benchmark::FORMAT, 'total:', 'avg:')
|
|
53
55
|
end
|
54
56
|
end
|
55
57
|
|
56
|
-
|
58
|
+
totals << r.report("args-if (1-arg)") do
|
59
|
+
|
60
|
+
for i in (0...N) do
|
61
|
+
|
62
|
+
log :notice, 'the cat in the hat.' if severity_logged? :notice
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
|
67
|
+
totals << r.report("arguments (simple)") do
|
57
68
|
|
58
69
|
for i in (0...N) do
|
59
70
|
|
@@ -61,7 +72,7 @@ Benchmark.benchmark(Benchmark::CAPTION, 24, Benchmark::FORMAT, 'total:', 'avg:')
|
|
61
72
|
end
|
62
73
|
end
|
63
74
|
|
64
|
-
|
75
|
+
totals << r.report("blocks (simple)") do
|
65
76
|
|
66
77
|
for i in (0...N) do
|
67
78
|
|
@@ -69,7 +80,16 @@ Benchmark.benchmark(Benchmark::CAPTION, 24, Benchmark::FORMAT, 'total:', 'avg:')
|
|
69
80
|
end
|
70
81
|
end
|
71
82
|
|
72
|
-
|
83
|
+
totals << r.report("args-if (simple)") do
|
84
|
+
|
85
|
+
for i in (0...N) do
|
86
|
+
|
87
|
+
log :notice, 'the ', 'cat ', 'in ', 'the ', 'hat.' if severity_logged? :notice
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
|
92
|
+
totals << r.report("arguments (complex)") do
|
73
93
|
|
74
94
|
cat = 'cat'
|
75
95
|
hat = :hat
|
@@ -81,7 +101,7 @@ Benchmark.benchmark(Benchmark::CAPTION, 24, Benchmark::FORMAT, 'total:', 'avg:')
|
|
81
101
|
end
|
82
102
|
end
|
83
103
|
|
84
|
-
|
104
|
+
totals << r.report("blocks (complex)") do
|
85
105
|
|
86
106
|
cat = 'cat'
|
87
107
|
hat = :hat
|
@@ -93,7 +113,20 @@ Benchmark.benchmark(Benchmark::CAPTION, 24, Benchmark::FORMAT, 'total:', 'avg:')
|
|
93
113
|
end
|
94
114
|
end
|
95
115
|
|
96
|
-
|
116
|
+
totals << r.report("args-if (complex)") do
|
117
|
+
|
118
|
+
cat = 'cat'
|
119
|
+
hat = :hat
|
120
|
+
t = Time.now
|
121
|
+
|
122
|
+
for i in (0...N) do
|
123
|
+
|
124
|
+
log :notice, "the #{cat} in the #{hat} (#{t})" if severity_logged? :notice
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
|
129
|
+
[ totals.inject(:+), totals.inject(:+) / totals.size ]
|
97
130
|
end
|
98
131
|
|
99
132
|
|
File without changes
|
@@ -0,0 +1,43 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
#############################################################################
|
4
|
+
# File: test/scratch/log_rolling_by_period_daily.rb
|
5
|
+
#
|
6
|
+
# Purpose: Tests the log-rolling functionality of SimpleFileLogService
|
7
|
+
#
|
8
|
+
# Created: 4th February 2018
|
9
|
+
# Updated: 4th February 2018
|
10
|
+
#
|
11
|
+
# Author: Matthew Wilson
|
12
|
+
#
|
13
|
+
# Copyright: <<TBD>>
|
14
|
+
#
|
15
|
+
#############################################################################
|
16
|
+
|
17
|
+
$:.unshift File.join(File.dirname(__FILE__), *(['..'] * 2), 'lib')
|
18
|
+
|
19
|
+
require 'pantheios/globals'
|
20
|
+
require 'pantheios/services/simple_file_log_service'
|
21
|
+
|
22
|
+
log_path_base = File.join(File.dirname(__FILE__), 'log_files', 'log_rolling_by_period_daily')
|
23
|
+
|
24
|
+
Pantheios::Globals.INITIAL_SERVICE_INSTANCES = Pantheios::Services::SimpleFileLogService.new log_path_base, roll_period: :daily
|
25
|
+
|
26
|
+
require 'pantheios'
|
27
|
+
|
28
|
+
include Pantheios
|
29
|
+
|
30
|
+
log :notice, 'program starting ...'
|
31
|
+
|
32
|
+
log(:notice) { 'program started' }
|
33
|
+
|
34
|
+
(0..1000).each do |n|
|
35
|
+
|
36
|
+
log :informational, "increment #{n}: '#{'*' * 10 * n}'"
|
37
|
+
|
38
|
+
sleep 100
|
39
|
+
end
|
40
|
+
|
41
|
+
at_exit { log :notice, 'program ending ...' }
|
42
|
+
|
43
|
+
|
@@ -0,0 +1,43 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
#############################################################################
|
4
|
+
# File: test/scratch/log_rolling_by_size_and_depth.rb
|
5
|
+
#
|
6
|
+
# Purpose: Tests the log-rolling functionality of SimpleFileLogService
|
7
|
+
#
|
8
|
+
# Created: 4th February 2018
|
9
|
+
# Updated: 4th February 2018
|
10
|
+
#
|
11
|
+
# Author: Matthew Wilson
|
12
|
+
#
|
13
|
+
# Copyright: <<TBD>>
|
14
|
+
#
|
15
|
+
#############################################################################
|
16
|
+
|
17
|
+
$:.unshift File.join(File.dirname(__FILE__), *(['..'] * 2), 'lib')
|
18
|
+
|
19
|
+
require 'pantheios/globals'
|
20
|
+
require 'pantheios/services/simple_file_log_service'
|
21
|
+
|
22
|
+
log_path_base = File.join(File.dirname(__FILE__), 'log_files', 'log_rolling_by_size_and_depth')
|
23
|
+
|
24
|
+
Pantheios::Globals.INITIAL_SERVICE_INSTANCES = Pantheios::Services::SimpleFileLogService.new log_path_base, roll_size: [ 1000, 10 ]
|
25
|
+
|
26
|
+
require 'pantheios'
|
27
|
+
|
28
|
+
include Pantheios
|
29
|
+
|
30
|
+
log :notice, 'program starting ...'
|
31
|
+
|
32
|
+
log(:notice) { 'program started' }
|
33
|
+
|
34
|
+
(0..1000).each do |n|
|
35
|
+
|
36
|
+
log :informational, "increment #{n}: '#{'*' * 10 * n}'"
|
37
|
+
|
38
|
+
sleep 1
|
39
|
+
end
|
40
|
+
|
41
|
+
at_exit { log :notice, 'program ending ...' }
|
42
|
+
|
43
|
+
|
@@ -6,7 +6,7 @@
|
|
6
6
|
# Purpose: COMPLETE_ME
|
7
7
|
#
|
8
8
|
# Created: 22nd January 2018
|
9
|
-
# Updated:
|
9
|
+
# Updated: 5th February 2018
|
10
10
|
#
|
11
11
|
# Author: Matthew Wilson
|
12
12
|
#
|
@@ -16,6 +16,12 @@
|
|
16
16
|
|
17
17
|
$:.unshift File.join(File.dirname(__FILE__), *(['..'] * 2), 'lib')
|
18
18
|
|
19
|
+
require 'pantheios/globals'
|
20
|
+
|
21
|
+
Pantheios::Globals.MAIN_THREAD_NAME = [ Thread.current, 'main' ]
|
22
|
+
Pantheios::Globals.PROCESS_NAME = :script_stem
|
23
|
+
|
24
|
+
|
19
25
|
require 'pantheios'
|
20
26
|
|
21
27
|
include Pantheios
|
@@ -66,3 +72,4 @@ puts
|
|
66
72
|
|
67
73
|
h 'lmnop', :q, :rst
|
68
74
|
|
75
|
+
|
@@ -0,0 +1,109 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
#############################################################################
|
4
|
+
# File: test/scratch/multiplexing_log_service.rb
|
5
|
+
#
|
6
|
+
# Purpose: COMPLETE_ME
|
7
|
+
#
|
8
|
+
# Created: 7th February 2018
|
9
|
+
# Updated: 7th February 2018
|
10
|
+
#
|
11
|
+
# Author: Matthew Wilson
|
12
|
+
#
|
13
|
+
# Copyright: <<TBD>>
|
14
|
+
#
|
15
|
+
#############################################################################
|
16
|
+
|
17
|
+
$:.unshift File.join(File.dirname(__FILE__), *(['..'] * 2), 'lib')
|
18
|
+
|
19
|
+
require 'pantheios'
|
20
|
+
require 'pantheios/application_layer/stock_severity_levels'
|
21
|
+
require 'pantheios/services'
|
22
|
+
|
23
|
+
$num_BLS_sls = 0
|
24
|
+
$num_ELS_sls = 0
|
25
|
+
|
26
|
+
class BenchmarkLogService
|
27
|
+
|
28
|
+
def severity_logged? severity
|
29
|
+
|
30
|
+
$num_BLS_sls += 1
|
31
|
+
|
32
|
+
(0..100).each { |n| n ** n }
|
33
|
+
|
34
|
+
:benchmark == severity.to_s.to_sym
|
35
|
+
end
|
36
|
+
|
37
|
+
def log sev, t, pref, msg
|
38
|
+
|
39
|
+
puts "BENCHMARK: #{pref}#{msg}\n"
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
class EventLogService
|
44
|
+
|
45
|
+
def severity_logged? severity
|
46
|
+
|
47
|
+
$num_ELS_sls += 1
|
48
|
+
|
49
|
+
case severity.to_s.to_sym
|
50
|
+
when :notice, :warning, :failure, :critical, :alert, :violation
|
51
|
+
|
52
|
+
true
|
53
|
+
when :warn, :error, :emergency
|
54
|
+
|
55
|
+
true
|
56
|
+
else
|
57
|
+
|
58
|
+
false
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def log sev, t, pref, msg
|
63
|
+
|
64
|
+
puts "EVENTLOG: #{pref}#{msg}\n"
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
scls = Pantheios::Services::SimpleConsoleLogService.new
|
69
|
+
|
70
|
+
def scls.severity_logged? severity; ![ :benchmark, :trace, :violation ].include? severity; end
|
71
|
+
|
72
|
+
services = [
|
73
|
+
|
74
|
+
BenchmarkLogService.new,
|
75
|
+
EventLogService.new,
|
76
|
+
scls,
|
77
|
+
]
|
78
|
+
|
79
|
+
lcm = :none
|
80
|
+
#lcm = :thread_fixed
|
81
|
+
#lcm = :process_fixed
|
82
|
+
unsync = false
|
83
|
+
#unsync = true
|
84
|
+
|
85
|
+
Pantheios::Core.set_service Pantheios::Services::MultiplexingLogService.new(services, level_cache_mode: lcm, unsyc_process_lcm: unsync)
|
86
|
+
|
87
|
+
include Pantheios
|
88
|
+
|
89
|
+
t_b = Time.now
|
90
|
+
|
91
|
+
log :benchmark, 'statement at benchmark'
|
92
|
+
(0..100000).each { log :trace, 'statement at trace' }
|
93
|
+
log :debug4, 'statement at debug-4'
|
94
|
+
log :debug3, 'statement at debug-3'
|
95
|
+
log :debug2, 'statement at debug-2'
|
96
|
+
log :debug1, 'statement at debug-1'
|
97
|
+
log :debug0, 'statement at debug-0'
|
98
|
+
log :informational, 'statement at informational'
|
99
|
+
log :notice, 'statement at notice'
|
100
|
+
log :warning, 'statement at warning'
|
101
|
+
log :failure, 'statement at failure'
|
102
|
+
log :critical, 'statement at critical'
|
103
|
+
log :alert, 'statement at alert'
|
104
|
+
log :violation, 'statement at violation'
|
105
|
+
|
106
|
+
t_a = Time.now
|
107
|
+
|
108
|
+
$stderr.puts "mode= :#{lcm}; t=#{t_a - t_b}; #BLS=#{$num_BLS_sls}; #ELS=#{$num_ELS_sls}"
|
109
|
+
|
@@ -0,0 +1,54 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
|
3
|
+
$:.unshift File.join(File.dirname(__FILE__), '../../..', 'lib')
|
4
|
+
|
5
|
+
require 'pantheios/core'
|
6
|
+
|
7
|
+
require 'xqsr3/extensions/test/unit'
|
8
|
+
|
9
|
+
require 'test/unit'
|
10
|
+
|
11
|
+
class Test_Core_set_process_name < Test::Unit::TestCase
|
12
|
+
|
13
|
+
Core = ::Pantheios::Core
|
14
|
+
|
15
|
+
def test_derive_process_name_obtains_the_same_results_but_different_instances
|
16
|
+
|
17
|
+
begin
|
18
|
+
|
19
|
+
Core.process_name = nil
|
20
|
+
|
21
|
+
n_1 = Core.process_name
|
22
|
+
n_2 = Core.process_name
|
23
|
+
|
24
|
+
assert_equal n_1, n_2
|
25
|
+
assert_same n_1, n_2
|
26
|
+
|
27
|
+
|
28
|
+
Core.process_name = nil
|
29
|
+
|
30
|
+
n_3 = Core.process_name
|
31
|
+
|
32
|
+
assert_equal n_1, n_3
|
33
|
+
assert_not_same n_1, n_3
|
34
|
+
|
35
|
+
ensure
|
36
|
+
|
37
|
+
Core.process_name = nil
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def test_derive_process_name_accepts_custom_value
|
42
|
+
|
43
|
+
begin
|
44
|
+
|
45
|
+
Core.process_name = 'abc'
|
46
|
+
|
47
|
+
assert_equal 'abc', Core.process_name
|
48
|
+
ensure
|
49
|
+
|
50
|
+
Core.process_name = nil
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
|