evt-telemetry-logger 0.5.1.2
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 +7 -0
- data/lib/telemetry/logger/ad_hoc.rb +18 -0
- data/lib/telemetry/logger/color.rb +75 -0
- data/lib/telemetry/logger/console_logger.rb +115 -0
- data/lib/telemetry/logger/dependency.rb +15 -0
- data/lib/telemetry/logger/levels.rb +141 -0
- data/lib/telemetry/logger/logger.rb +47 -0
- data/lib/telemetry/logger/null_object.rb +18 -0
- data/lib/telemetry/logger.rb +15 -0
- metadata +107 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 4fa78e17af434e16e3d6cb9cec295a3f6c613a45
|
4
|
+
data.tar.gz: 2e07f132799a4a90311c9847b6f2a20fac4b7f6f
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: b3827dc61365389e75c9079e5073e346f757d15532293970ddf69fbf0dfe95a609049ebdbd34355a427197027b0aae773c3fc2c0a864026023ddef07cd93e547
|
7
|
+
data.tar.gz: 81b83031ec93965b4c7d136ca74a6d5951ae50ac02672fbac7b8f0a304a40c1dfb46ed29c2e114cacf0fc536895d83f363f27b3ac9130cbada4349e61e5124b2
|
@@ -0,0 +1,18 @@
|
|
1
|
+
class Telemetry
|
2
|
+
module Logger
|
3
|
+
module AdHoc
|
4
|
+
def self.activate(target_class=nil)
|
5
|
+
target_class ||= Object
|
6
|
+
|
7
|
+
return if target_class.is_a? self
|
8
|
+
|
9
|
+
target_class.send :include, self
|
10
|
+
end
|
11
|
+
|
12
|
+
def __logger(subject=nil)
|
13
|
+
subject ||= caller[0].split('/').last
|
14
|
+
Telemetry::Logger.build subject
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
class Telemetry
|
2
|
+
module Logger
|
3
|
+
module Color
|
4
|
+
extend self
|
5
|
+
|
6
|
+
def apply(level, message)
|
7
|
+
if respond_to? level
|
8
|
+
send level, message
|
9
|
+
else
|
10
|
+
message
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
def metadata(text)
|
15
|
+
Rainbow(text).yellow
|
16
|
+
end
|
17
|
+
|
18
|
+
def todo(message)
|
19
|
+
Rainbow(message).bright.white.bg(:white)
|
20
|
+
end
|
21
|
+
|
22
|
+
def fubar(message)
|
23
|
+
Rainbow(message).red.bg(:yellow)
|
24
|
+
end
|
25
|
+
|
26
|
+
def obsolete(message)
|
27
|
+
Rainbow(message).bright.white
|
28
|
+
end
|
29
|
+
|
30
|
+
def opt_data(message)
|
31
|
+
data(message)
|
32
|
+
end
|
33
|
+
|
34
|
+
def data(message)
|
35
|
+
Rainbow(message).cyan
|
36
|
+
end
|
37
|
+
|
38
|
+
def opt_trace(message)
|
39
|
+
trace(message)
|
40
|
+
end
|
41
|
+
|
42
|
+
def trace(message)
|
43
|
+
Rainbow(message).white
|
44
|
+
end
|
45
|
+
|
46
|
+
def info(message)
|
47
|
+
Rainbow(message).green
|
48
|
+
end
|
49
|
+
|
50
|
+
def pass(message)
|
51
|
+
Rainbow(message).black.bg(:green)
|
52
|
+
end
|
53
|
+
|
54
|
+
def fail(message)
|
55
|
+
Rainbow(message).black.bg(:red)
|
56
|
+
end
|
57
|
+
|
58
|
+
def focus(message)
|
59
|
+
Rainbow(message).bright.white.bg(:blue)
|
60
|
+
end
|
61
|
+
|
62
|
+
def warn(message)
|
63
|
+
Rainbow(message).yellow.bg(:black)
|
64
|
+
end
|
65
|
+
|
66
|
+
def error(message)
|
67
|
+
Rainbow(message).red.bg(:black)
|
68
|
+
end
|
69
|
+
|
70
|
+
def fatal(message)
|
71
|
+
Rainbow(message).white.bg(:black)
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
@@ -0,0 +1,115 @@
|
|
1
|
+
class Telemetry
|
2
|
+
module Logger
|
3
|
+
class ConsoleLogger
|
4
|
+
include Levels
|
5
|
+
|
6
|
+
attr_reader :name
|
7
|
+
attr_reader :device
|
8
|
+
|
9
|
+
attr_reader :level
|
10
|
+
attr_reader :level_number
|
11
|
+
|
12
|
+
dependency :clock, Clock::Local
|
13
|
+
|
14
|
+
def self.build(subject)
|
15
|
+
name = logger_name(subject)
|
16
|
+
device = Defaults.device
|
17
|
+
instance = new(name, device)
|
18
|
+
instance.level = Defaults.level
|
19
|
+
Clock::Local.configure instance
|
20
|
+
instance
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.logger_name(subject)
|
24
|
+
if subject.is_a?(Class) || subject.is_a?(Module)
|
25
|
+
name = subject.name
|
26
|
+
elsif subject.is_a? String
|
27
|
+
name = subject
|
28
|
+
else
|
29
|
+
name = subject.class.name
|
30
|
+
end
|
31
|
+
name
|
32
|
+
end
|
33
|
+
|
34
|
+
def initialize(name, device)
|
35
|
+
@name = name
|
36
|
+
@device = device
|
37
|
+
end
|
38
|
+
|
39
|
+
def write(message)
|
40
|
+
return if Defaults.activation == 'off'
|
41
|
+
device.write "#{message}#{$INPUT_RECORD_SEPARATOR}"
|
42
|
+
end
|
43
|
+
|
44
|
+
def format(message, level)
|
45
|
+
return message if Defaults.color == 'off'
|
46
|
+
Telemetry::Logger::Color.apply(level, message)
|
47
|
+
end
|
48
|
+
|
49
|
+
def format_metadata(text)
|
50
|
+
return text if Defaults.color == 'off'
|
51
|
+
Telemetry::Logger::Color.metadata(text)
|
52
|
+
end
|
53
|
+
|
54
|
+
def level=(level)
|
55
|
+
index = ordinal(level)
|
56
|
+
|
57
|
+
raise "Unknown logger level: #{level}" unless index
|
58
|
+
|
59
|
+
@level_number = index
|
60
|
+
@level = level
|
61
|
+
end
|
62
|
+
|
63
|
+
module Defaults
|
64
|
+
def self.level
|
65
|
+
level = ENV['LOG_LEVEL']
|
66
|
+
return level.to_sym if level
|
67
|
+
|
68
|
+
:info
|
69
|
+
end
|
70
|
+
|
71
|
+
def self.device
|
72
|
+
setting = ENV['CONSOLE_DEVICE']
|
73
|
+
device = nil
|
74
|
+
if setting && !['stderr', 'stdout'].include?(setting)
|
75
|
+
raise "The CONSOLE_DEVICE should be either 'stderr' (default) or 'stdout'"
|
76
|
+
elsif setting
|
77
|
+
device = setting == 'stderr' ? STDERR : STDOUT
|
78
|
+
else
|
79
|
+
device = STDERR
|
80
|
+
end
|
81
|
+
device.sync = true
|
82
|
+
device
|
83
|
+
end
|
84
|
+
|
85
|
+
def self.activation
|
86
|
+
activation = ENV['LOGGER']
|
87
|
+
return activation if activation
|
88
|
+
|
89
|
+
'on'
|
90
|
+
end
|
91
|
+
|
92
|
+
def self.color
|
93
|
+
color = ENV['LOG_COLOR']
|
94
|
+
|
95
|
+
# CONSOLE_COLOR is obsolete. It is here for backwards compatibility
|
96
|
+
if color.nil?
|
97
|
+
color = ENV['CONSOLE_COLOR']
|
98
|
+
|
99
|
+
unless color.nil?
|
100
|
+
puts '*** WARNING: The CONSOLE_COLOR environment variable is obsolete. Use LOG_COLOR instead. Support for CONSOLE_COLOR will be discontinued.'
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
return color if color
|
105
|
+
|
106
|
+
if device.tty?
|
107
|
+
'on'
|
108
|
+
else
|
109
|
+
'off'
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
@@ -0,0 +1,141 @@
|
|
1
|
+
class Telemetry
|
2
|
+
module Logger
|
3
|
+
module Levels
|
4
|
+
def self.levels
|
5
|
+
[
|
6
|
+
:todo,
|
7
|
+
:fubar,
|
8
|
+
:obsolete,
|
9
|
+
:data,
|
10
|
+
:trace,
|
11
|
+
:debug,
|
12
|
+
:opt_data,
|
13
|
+
:opt_trace,
|
14
|
+
:opt_debug,
|
15
|
+
:info,
|
16
|
+
:pass,
|
17
|
+
:fail,
|
18
|
+
:focus,
|
19
|
+
:warn,
|
20
|
+
:error,
|
21
|
+
:fatal
|
22
|
+
]
|
23
|
+
end
|
24
|
+
|
25
|
+
def self.included(cls)
|
26
|
+
levels.each do |level|
|
27
|
+
define_level level, cls
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.define_level(level, cls)
|
32
|
+
cls.send :define_method, level do |message|
|
33
|
+
write_level(__method__, message)
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
def self.level_index
|
38
|
+
@level_index ||= build_level_index
|
39
|
+
end
|
40
|
+
|
41
|
+
def self.build_level_index
|
42
|
+
table = {}
|
43
|
+
|
44
|
+
levels.each_with_index do |level, index|
|
45
|
+
table[level] = index
|
46
|
+
end
|
47
|
+
|
48
|
+
table
|
49
|
+
end
|
50
|
+
|
51
|
+
def level_index
|
52
|
+
Levels.level_index
|
53
|
+
end
|
54
|
+
|
55
|
+
def ordinal(level)
|
56
|
+
if [:_min, :_max].include?(level)
|
57
|
+
if level == :_min
|
58
|
+
return level_index.values.last
|
59
|
+
else
|
60
|
+
return level_index.values.first
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
level_index[level]
|
65
|
+
end
|
66
|
+
|
67
|
+
def write_level(level, message)
|
68
|
+
level_ordinal = ordinal(level)
|
69
|
+
write_message(message, level) if sufficient_level?(level_ordinal) && !omit?(level)
|
70
|
+
end
|
71
|
+
|
72
|
+
def write_message(message, level)
|
73
|
+
message = message.to_s
|
74
|
+
|
75
|
+
if message.length == 0
|
76
|
+
message = '(empty log message)'
|
77
|
+
end
|
78
|
+
|
79
|
+
message.each_line do |line|
|
80
|
+
line = line.chomp("\n") unless line.end_with?("\r\n") || line == "\n"
|
81
|
+
line = line.gsub("\r", "\\r")
|
82
|
+
line = line.gsub("\n", "\\n")
|
83
|
+
|
84
|
+
message = implementer.format(line, level)
|
85
|
+
metadata = metadata(level)
|
86
|
+
header = implementer.format_metadata(metadata)
|
87
|
+
|
88
|
+
implementer.write "#{header}#{message}"
|
89
|
+
end
|
90
|
+
end
|
91
|
+
|
92
|
+
def metadata(level)
|
93
|
+
if Defaults.metadata == 'off'
|
94
|
+
return nil
|
95
|
+
elsif Defaults.metadata == 'minimal'
|
96
|
+
return "#{name.split('::').last}: "
|
97
|
+
else
|
98
|
+
level = String(level)
|
99
|
+
|
100
|
+
if level.start_with?('opt_')
|
101
|
+
level = "(#{level.split('_').last})"
|
102
|
+
end
|
103
|
+
|
104
|
+
return "[#{implementer.clock.iso8601}] #{name} #{level.upcase}: "
|
105
|
+
end
|
106
|
+
end
|
107
|
+
|
108
|
+
def sufficient_level?(level_ordinal)
|
109
|
+
level_ordinal >= level_number
|
110
|
+
end
|
111
|
+
|
112
|
+
def omit?(level)
|
113
|
+
Defaults.optional == 'off' && optional_level?(level)
|
114
|
+
end
|
115
|
+
|
116
|
+
def optional_level?(level)
|
117
|
+
String(level).start_with?('opt_')
|
118
|
+
end
|
119
|
+
|
120
|
+
def implementer
|
121
|
+
self
|
122
|
+
end
|
123
|
+
|
124
|
+
module Defaults
|
125
|
+
def self.metadata
|
126
|
+
metadata = ENV['LOG_METADATA']
|
127
|
+
return metadata if metadata
|
128
|
+
|
129
|
+
'on'
|
130
|
+
end
|
131
|
+
|
132
|
+
def self.optional
|
133
|
+
optional = ENV['LOG_OPTIONAL']
|
134
|
+
return optional if optional
|
135
|
+
|
136
|
+
'off'
|
137
|
+
end
|
138
|
+
end
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
class Telemetry
|
2
|
+
module Logger
|
3
|
+
extend self
|
4
|
+
|
5
|
+
def build(subject, implementation=nil)
|
6
|
+
implementation ||= Defaults.implementation
|
7
|
+
logger = implementation.build(subject)
|
8
|
+
logger
|
9
|
+
end
|
10
|
+
|
11
|
+
def get(subject, implementation=nil)
|
12
|
+
build(subject, implementation)
|
13
|
+
end
|
14
|
+
|
15
|
+
def register(subject, implementation=nil)
|
16
|
+
logger = Logger.build self
|
17
|
+
logger.obsolete "The \"register\" method is obsolete (#{caller[0]}). It is replaced with the \"build\" method."
|
18
|
+
|
19
|
+
build(subject, implementation)
|
20
|
+
end
|
21
|
+
|
22
|
+
def configure(receiver, implementation=nil)
|
23
|
+
logger = build(receiver, implementation)
|
24
|
+
receiver.logger = logger
|
25
|
+
logger
|
26
|
+
end
|
27
|
+
|
28
|
+
def self.debug(message)
|
29
|
+
write message
|
30
|
+
end
|
31
|
+
|
32
|
+
def self.write(message, level=nil, subject=nil, implementation=nil)
|
33
|
+
level ||= :debug
|
34
|
+
subject ||= '***'
|
35
|
+
|
36
|
+
logger = build subject, implementation
|
37
|
+
|
38
|
+
logger.write_message message, level
|
39
|
+
end
|
40
|
+
|
41
|
+
module Defaults
|
42
|
+
def self.implementation
|
43
|
+
ConsoleLogger
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'English'
|
2
|
+
|
3
|
+
require 'rainbow'; Rainbow.enabled = true
|
4
|
+
|
5
|
+
require 'pathname'
|
6
|
+
require 'clock'
|
7
|
+
require 'dependency'; Dependency.activate
|
8
|
+
|
9
|
+
require 'telemetry/logger/logger'
|
10
|
+
require 'telemetry/logger/levels'
|
11
|
+
require 'telemetry/logger/color'
|
12
|
+
require 'telemetry/logger/null_object'
|
13
|
+
require 'telemetry/logger/console_logger'
|
14
|
+
require 'telemetry/logger/ad_hoc'
|
15
|
+
require 'telemetry/logger/dependency'
|
metadata
ADDED
@@ -0,0 +1,107 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: evt-telemetry-logger
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.5.1.2
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- The Eventide Project
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-12-20 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: evt-clock
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: evt-dependency
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rainbow
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: ntl-test_bench
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
description: " "
|
70
|
+
email: opensource@eventide-project.org
|
71
|
+
executables: []
|
72
|
+
extensions: []
|
73
|
+
extra_rdoc_files: []
|
74
|
+
files:
|
75
|
+
- lib/telemetry/logger.rb
|
76
|
+
- lib/telemetry/logger/ad_hoc.rb
|
77
|
+
- lib/telemetry/logger/color.rb
|
78
|
+
- lib/telemetry/logger/console_logger.rb
|
79
|
+
- lib/telemetry/logger/dependency.rb
|
80
|
+
- lib/telemetry/logger/levels.rb
|
81
|
+
- lib/telemetry/logger/logger.rb
|
82
|
+
- lib/telemetry/logger/null_object.rb
|
83
|
+
homepage: https://github.com/eventide-project/telemetry-logger
|
84
|
+
licenses:
|
85
|
+
- MIT
|
86
|
+
metadata: {}
|
87
|
+
post_install_message:
|
88
|
+
rdoc_options: []
|
89
|
+
require_paths:
|
90
|
+
- lib
|
91
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
92
|
+
requirements:
|
93
|
+
- - ">="
|
94
|
+
- !ruby/object:Gem::Version
|
95
|
+
version: 2.3.3
|
96
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
97
|
+
requirements:
|
98
|
+
- - ">="
|
99
|
+
- !ruby/object:Gem::Version
|
100
|
+
version: '0'
|
101
|
+
requirements: []
|
102
|
+
rubyforge_project:
|
103
|
+
rubygems_version: 2.5.2
|
104
|
+
signing_key:
|
105
|
+
specification_version: 4
|
106
|
+
summary: Logging to STDERR with coloring and levels of severity
|
107
|
+
test_files: []
|