extended_logger 0.2.7 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/extended_logger.rb +5 -2
- data/lib/extended_logger/colors.rb +50 -0
- data/lib/extended_logger/colors/pack.rb +47 -0
- data/lib/extended_logger/colors/unpack.rb +55 -0
- data/lib/extended_logger/define.rb +55 -0
- data/lib/extended_logger/extended_logger.rb +21 -76
- data/lib/extended_logger/formatter.rb +20 -78
- metadata +5 -3
- data/lib/extended_logger/factory.rb +0 -61
- data/lib/extended_logger/null_logger.rb +0 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 12acc57301fb31c71adadd859ed1e9227adf4e38
|
4
|
+
data.tar.gz: 15e746abb842188e8c1f2d4786f9c7161d35dc60
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 19703c7afe912c2c68227efc333641b5d520f98688f73ca23c05261f6bb5984d93e2e6796af3d4593006db05bcd631c9dc66e07bc4d7864358b0aa4c8f4813ec
|
7
|
+
data.tar.gz: c32d52b617a488dd072899e87e2f1d09a268e4a3a71d4878bbd5186d20e060b9d97e8ea2f26fbc696451765414aa46d829ba40966d234843454920124d74ceb2
|
data/lib/extended_logger.rb
CHANGED
@@ -1,6 +1,9 @@
|
|
1
1
|
require 'logger'
|
2
2
|
|
3
3
|
require 'extended_logger/extended_logger'
|
4
|
-
|
4
|
+
|
5
|
+
require 'extended_logger/colors'
|
6
|
+
require 'extended_logger/colors/pack'
|
7
|
+
require 'extended_logger/colors/unpack'
|
8
|
+
require 'extended_logger/define'
|
5
9
|
require 'extended_logger/formatter'
|
6
|
-
require 'extended_logger/null_logger'
|
@@ -0,0 +1,50 @@
|
|
1
|
+
class ExtendedLogger
|
2
|
+
module Colors
|
3
|
+
extend self
|
4
|
+
|
5
|
+
def apply text, fg:, bg:;
|
6
|
+
fg = Colors.index fg
|
7
|
+
bg = Colors.index bg
|
8
|
+
|
9
|
+
if fg
|
10
|
+
if fg > 8 then fg = "1;3#{fg - 8}" else fg = "0;3#{fg}" end
|
11
|
+
text.insert 0, "\e[#{fg}m"
|
12
|
+
end
|
13
|
+
|
14
|
+
if bg
|
15
|
+
if bg > 8 then bg = "4#{bg - 8}" else bg = "4#{bg}" end
|
16
|
+
text.insert 0, "\e[#{bg}m"
|
17
|
+
end
|
18
|
+
|
19
|
+
text.insert -1, "\e[0m" if fg or bg
|
20
|
+
end
|
21
|
+
|
22
|
+
def pack mapping=nil
|
23
|
+
Pack.(mapping)
|
24
|
+
end
|
25
|
+
|
26
|
+
def unpack data
|
27
|
+
Unpack.(data)
|
28
|
+
end
|
29
|
+
|
30
|
+
Colors = %i(
|
31
|
+
black
|
32
|
+
red
|
33
|
+
green
|
34
|
+
brown
|
35
|
+
blue
|
36
|
+
magenta
|
37
|
+
cyan
|
38
|
+
gray
|
39
|
+
|
40
|
+
dark_gray
|
41
|
+
bright_red
|
42
|
+
bright_green
|
43
|
+
yellow
|
44
|
+
bright_blue
|
45
|
+
bright_magenta
|
46
|
+
bright_cyan
|
47
|
+
white
|
48
|
+
)
|
49
|
+
end
|
50
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
class ExtendedLogger
|
2
|
+
module Colors
|
3
|
+
class Pack
|
4
|
+
attr_reader :mapping
|
5
|
+
|
6
|
+
def initialize mapping
|
7
|
+
@mapping = mapping
|
8
|
+
end
|
9
|
+
|
10
|
+
def self.call mapping=nil
|
11
|
+
mapping ||= {}
|
12
|
+
|
13
|
+
instance = new mapping
|
14
|
+
instance.()
|
15
|
+
end
|
16
|
+
|
17
|
+
def call
|
18
|
+
output = ''.encode 'US-ASCII'
|
19
|
+
|
20
|
+
mapping.sort.each do |level_name, hash|
|
21
|
+
fg, bg = hash.values_at(:fg, :bg).map do |color_name|
|
22
|
+
color_code color_name
|
23
|
+
end
|
24
|
+
|
25
|
+
output << ',' unless output.empty?
|
26
|
+
output << "#{level_name.upcase}=#{fg};#{bg}"
|
27
|
+
end
|
28
|
+
|
29
|
+
Unpack.(output)
|
30
|
+
|
31
|
+
output
|
32
|
+
end
|
33
|
+
|
34
|
+
def color_code color_name
|
35
|
+
return '?'.freeze if color_name == :none
|
36
|
+
|
37
|
+
number = Colors.index color_name
|
38
|
+
|
39
|
+
unless number
|
40
|
+
raise ArgumentError, "#{color_name.inspect} is not a color code"
|
41
|
+
end
|
42
|
+
|
43
|
+
number.to_s 16
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
class ExtendedLogger
|
2
|
+
module Colors
|
3
|
+
class Unpack
|
4
|
+
attr_reader :data
|
5
|
+
|
6
|
+
Pattern = %r{\A
|
7
|
+
(?<level_name>[A-Z_]+) # DEBUG
|
8
|
+
= # =
|
9
|
+
(?<fg>[?[:xdigit:]])+ # f
|
10
|
+
; # ;
|
11
|
+
(?<bg>[?[:xdigit:]])+ # 8
|
12
|
+
\Z}xn
|
13
|
+
|
14
|
+
def initialize data
|
15
|
+
@data = data
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.call string
|
19
|
+
instance = new string
|
20
|
+
instance.()
|
21
|
+
end
|
22
|
+
|
23
|
+
def call
|
24
|
+
output = {}
|
25
|
+
mappings = data.split ','.freeze
|
26
|
+
|
27
|
+
mappings.each do |mapping|
|
28
|
+
match_data = Pattern.match mapping
|
29
|
+
|
30
|
+
unless match_data
|
31
|
+
raise ArgumentError, "Invalid swatch #{data.inspect}"
|
32
|
+
end
|
33
|
+
|
34
|
+
level_name = match_data[:level_name]
|
35
|
+
|
36
|
+
if match_data[:fg] == '?'.freeze
|
37
|
+
fg = :none
|
38
|
+
else
|
39
|
+
fg = Colors.fetch match_data[:fg].to_i(16)
|
40
|
+
end
|
41
|
+
|
42
|
+
if match_data[:bg] == '?'.freeze
|
43
|
+
bg = :none
|
44
|
+
else
|
45
|
+
bg = Colors.fetch match_data[:bg].to_i(16)
|
46
|
+
end
|
47
|
+
|
48
|
+
output[level_name] = { :fg => fg, :bg => bg }
|
49
|
+
end
|
50
|
+
|
51
|
+
output
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
class ExtendedLogger
|
2
|
+
class Define
|
3
|
+
attr_reader :block
|
4
|
+
attr_reader :cls
|
5
|
+
|
6
|
+
DefaultLogLevels = %i(debug debug? error error? fatal fatal? info info? warn warn?)
|
7
|
+
|
8
|
+
def initialize block, cls
|
9
|
+
@block = block
|
10
|
+
@cls = cls
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.call block
|
14
|
+
cls = Class.new ExtendedLogger
|
15
|
+
|
16
|
+
instance = new block, cls
|
17
|
+
instance.()
|
18
|
+
end
|
19
|
+
|
20
|
+
def call
|
21
|
+
cls.send :undef_method, *DefaultLogLevels
|
22
|
+
|
23
|
+
instance_exec &block
|
24
|
+
|
25
|
+
null_logger = cls.new nil
|
26
|
+
cls.const_set :NullLogger, null_logger
|
27
|
+
|
28
|
+
cls
|
29
|
+
end
|
30
|
+
|
31
|
+
def default_formatter &block
|
32
|
+
formatter_cls = Class.new Formatter
|
33
|
+
formatter_cls.send :define_method, :call, &block
|
34
|
+
cls.const_set :Formatter, formatter_cls
|
35
|
+
end
|
36
|
+
|
37
|
+
def levels const_names
|
38
|
+
const_names.each_with_index do |const_name, level|
|
39
|
+
cls.const_set const_name, level
|
40
|
+
|
41
|
+
method_name = const_name.to_s.downcase
|
42
|
+
|
43
|
+
cls.send :define_method, method_name do |progname=nil, &block|
|
44
|
+
add level, nil, progname, &block
|
45
|
+
end
|
46
|
+
|
47
|
+
cls.send :define_method, "#{method_name}?" do
|
48
|
+
@level <= level
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
cls.const_set :UNKNOWN, const_names.size
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -1,93 +1,38 @@
|
|
1
1
|
class ExtendedLogger < Logger
|
2
|
-
|
3
|
-
attr_accessor :default_log_level
|
2
|
+
attr_accessor :always_evaluate
|
4
3
|
|
5
|
-
|
6
|
-
|
7
|
-
setter = "#{attribute_name}=".freeze
|
4
|
+
def initialize *;
|
5
|
+
super
|
8
6
|
|
9
|
-
|
10
|
-
|
11
|
-
receiver.public_send setter, logger
|
12
|
-
end
|
13
|
-
|
14
|
-
def get receiver, **overrides
|
15
|
-
receiver_name =
|
16
|
-
if receiver.is_a? Module
|
17
|
-
receiver.name
|
18
|
-
else
|
19
|
-
receiver.class.name
|
20
|
-
end
|
21
|
-
|
22
|
-
logger = Factory.(**overrides)
|
23
|
-
logger.progname = "(#{receiver_name})"
|
24
|
-
logger
|
25
|
-
end
|
26
|
-
|
27
|
-
def instance
|
28
|
-
@instance ||= Factory.()
|
29
|
-
end
|
30
|
-
|
31
|
-
def levels
|
32
|
-
@levels ||= {
|
33
|
-
-7 => 'OBSOLETE'.freeze,
|
34
|
-
-6 => 'OPT_DATA'.freeze,
|
35
|
-
-5 => 'OPT_TRACE'.freeze,
|
36
|
-
-4 => 'OPT_DEBUG'.freeze,
|
37
|
-
-3 => 'DATA'.freeze,
|
38
|
-
-2 => 'TRACE'.freeze,
|
39
|
-
-1 => 'DEBUG'.freeze,
|
40
|
-
0 => 'INFO'.freeze,
|
41
|
-
1 => 'PASS'.freeze,
|
42
|
-
2 => 'FAIL'.freeze,
|
43
|
-
3 => 'FOCUS'.freeze,
|
44
|
-
4 => 'WARN'.freeze,
|
45
|
-
5 => 'ERROR'.freeze,
|
46
|
-
6 => 'FATAL'.freeze,
|
47
|
-
}
|
48
|
-
end
|
49
|
-
|
50
|
-
def level? level
|
51
|
-
levels.key? level
|
52
|
-
end
|
7
|
+
formatter_cls = self.class.const_get :Formatter
|
8
|
+
@formatter = formatter_cls.new @default_formatter
|
53
9
|
end
|
54
10
|
|
55
|
-
def
|
56
|
-
|
11
|
+
def self.build *arguments, initial_level: nil, **extensions
|
12
|
+
instance = new *arguments
|
13
|
+
instance.level = initial_level if initial_level
|
14
|
+
instance.apply_extensions **extensions
|
15
|
+
instance
|
57
16
|
end
|
58
17
|
|
59
|
-
def
|
60
|
-
|
18
|
+
def add severity, *, &block
|
19
|
+
block.call if block_given? and always_evaluate and severity < @level
|
20
|
+
super
|
61
21
|
end
|
62
22
|
|
63
|
-
def
|
64
|
-
|
65
|
-
Kernel.warn "(extended-logger) Unknown log severity level #{severity.inspect}"
|
66
|
-
end
|
67
|
-
|
68
|
-
self.class.levels.fetch severity, 'ANY'.freeze
|
69
|
-
end
|
23
|
+
def apply_extensions always_evaluate: nil, color_swatch: nil
|
24
|
+
always_evaluate ||= false
|
70
25
|
|
71
|
-
|
72
|
-
if self.formatter.is_a? Formatter
|
73
|
-
self.formatter.logger_formatter = formatter
|
74
|
-
else
|
75
|
-
super
|
76
|
-
end
|
77
|
-
end
|
26
|
+
self.always_evaluate = always_evaluate
|
78
27
|
|
79
|
-
|
80
|
-
return unless @logdev
|
81
|
-
@logdev.dev
|
28
|
+
formatter.color_swatch = Colors.unpack color_swatch if color_swatch
|
82
29
|
end
|
83
30
|
|
84
|
-
def
|
85
|
-
|
31
|
+
def formatter= internal_formatter
|
32
|
+
formatter.internal_formatter = internal_formatter
|
86
33
|
end
|
87
34
|
|
88
|
-
|
89
|
-
|
90
|
-
add level, *arguments, &block
|
91
|
-
end
|
35
|
+
def self.define &block
|
36
|
+
Define.(block)
|
92
37
|
end
|
93
38
|
end
|
@@ -1,97 +1,39 @@
|
|
1
1
|
class ExtendedLogger
|
2
2
|
class Formatter
|
3
|
-
attr_writer :
|
4
|
-
|
3
|
+
attr_writer :color_swatch
|
4
|
+
attr_accessor :internal_formatter
|
5
5
|
|
6
|
-
def
|
7
|
-
|
8
|
-
color log_entry, severity
|
6
|
+
def initialize internal_formatter
|
7
|
+
@internal_formatter = internal_formatter
|
9
8
|
end
|
10
9
|
|
11
|
-
def
|
12
|
-
colorizer = palette[severity]
|
13
|
-
|
14
|
-
if colorizer
|
15
|
-
log_entry = "#{colorizer}#{log_entry}\e[0m"
|
16
|
-
end
|
17
|
-
|
18
|
-
log_entry
|
19
|
-
end
|
20
|
-
|
21
|
-
def datetime_format
|
22
|
-
logger_formatter.datetime_format
|
23
|
-
end
|
24
|
-
|
25
|
-
def datetime_format= format
|
26
|
-
logger_formatter.datetime_format = format
|
27
|
-
end
|
28
|
-
|
29
|
-
def delegate *arguments, message
|
30
|
-
message = format_message message, arguments
|
31
|
-
logger_formatter.(*arguments, message)
|
32
|
-
end
|
33
|
-
|
34
|
-
def format_message message, arguments
|
10
|
+
def call severity, *arguments, message
|
35
11
|
output = ''
|
36
12
|
|
37
|
-
message
|
38
|
-
if line == "\n".freeze
|
39
|
-
line = "\\n"
|
40
|
-
else
|
41
|
-
line.gsub! "\r".freeze, "\\r".freeze
|
42
|
-
end
|
13
|
+
message = '(empty log message)' if message.empty?
|
43
14
|
|
44
|
-
|
45
|
-
output.concat line
|
46
|
-
else
|
47
|
-
formatted_line = logger_formatter.(*arguments, line.chomp("\n".freeze))
|
48
|
-
output.concat formatted_line
|
49
|
-
end
|
50
|
-
end
|
15
|
+
message.gsub! "\r".freeze, "\\r".freeze
|
51
16
|
|
52
|
-
|
53
|
-
|
17
|
+
message.each_line do |line|
|
18
|
+
line = $/.inspect[1...-1] if line == $/
|
19
|
+
line.chomp! if line.end_with? $/
|
54
20
|
|
55
|
-
|
56
|
-
|
57
|
-
|
21
|
+
formatted_line = internal_formatter.(severity, *arguments, line)
|
22
|
+
output.concat formatted_line
|
23
|
+
end
|
58
24
|
|
59
|
-
|
60
|
-
|
61
|
-
end
|
25
|
+
color = color_swatch[severity] || color_swatch['ANY'.freeze]
|
26
|
+
Colors.apply output, **color if color
|
62
27
|
|
63
|
-
|
64
|
-
@ansi_colors ||= %i(black red green yellow blue magenta cyan white)
|
28
|
+
output
|
65
29
|
end
|
66
30
|
|
67
|
-
def
|
68
|
-
|
69
|
-
escape = "\e[#{brightness};3#{ansi_colors.index fg}m"
|
70
|
-
|
71
|
-
if bg
|
72
|
-
escape << "\e[4#{ansi_colors.index bg}m"
|
73
|
-
end
|
74
|
-
|
75
|
-
escape
|
31
|
+
def color_swatch
|
32
|
+
@color_swatch ||= {}
|
76
33
|
end
|
77
34
|
|
78
|
-
def
|
79
|
-
|
80
|
-
'OBSOLETE' => col(:black, :normal),
|
81
|
-
'DATA' => col(:green, :normal),
|
82
|
-
'TRACE' => col(:cyan, :normal),
|
83
|
-
'DEBUG' => col(:blue, :normal),
|
84
|
-
'OPT_DATA' => col(:green, :normal, :white),
|
85
|
-
'OPT_TRACE' => col(:cyan, :normal, :white),
|
86
|
-
'OPT_DEBUG' => col(:blue, :normal, :white),
|
87
|
-
'PASS' => col(:white, :bright, :green),
|
88
|
-
'FAIL' => col(:white, :bright, :red),
|
89
|
-
'FOCUS' => col(:white, :bright, :blue),
|
90
|
-
'WARN' => col(:yellow, :normal),
|
91
|
-
'ERROR' => col(:red, :normal),
|
92
|
-
'FATAL' => col(:black, :bright, :red),
|
93
|
-
'ANY' => col(:white, :bright, :magenta),
|
94
|
-
}
|
35
|
+
def datetime_format= value
|
36
|
+
internal_formatter.datetime_format = value
|
95
37
|
end
|
96
38
|
end
|
97
39
|
end
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: extended_logger
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Nathan Ladd
|
@@ -21,10 +21,12 @@ extensions: []
|
|
21
21
|
extra_rdoc_files: []
|
22
22
|
files:
|
23
23
|
- lib/extended_logger.rb
|
24
|
+
- lib/extended_logger/colors.rb
|
25
|
+
- lib/extended_logger/colors/pack.rb
|
26
|
+
- lib/extended_logger/colors/unpack.rb
|
27
|
+
- lib/extended_logger/define.rb
|
24
28
|
- lib/extended_logger/extended_logger.rb
|
25
|
-
- lib/extended_logger/factory.rb
|
26
29
|
- lib/extended_logger/formatter.rb
|
27
|
-
- lib/extended_logger/null_logger.rb
|
28
30
|
homepage: https://github.com/ntl/extended-logger
|
29
31
|
licenses:
|
30
32
|
- MIT
|
@@ -1,61 +0,0 @@
|
|
1
|
-
class ExtendedLogger
|
2
|
-
class Factory
|
3
|
-
attr_reader :env
|
4
|
-
attr_writer :device
|
5
|
-
attr_writer :level
|
6
|
-
|
7
|
-
def initialize env
|
8
|
-
@env = env
|
9
|
-
end
|
10
|
-
|
11
|
-
def self.build env=nil, device: nil, level: nil
|
12
|
-
env ||= ENV
|
13
|
-
level ||= ExtendedLogger.default_log_level
|
14
|
-
|
15
|
-
instance = new env
|
16
|
-
instance.device = device if device
|
17
|
-
instance.level = level if level
|
18
|
-
instance
|
19
|
-
end
|
20
|
-
|
21
|
-
def self.call *arguments
|
22
|
-
instance = build *arguments
|
23
|
-
instance.()
|
24
|
-
end
|
25
|
-
|
26
|
-
def call
|
27
|
-
logger = ExtendedLogger.new device
|
28
|
-
|
29
|
-
formatter = Formatter.new
|
30
|
-
formatter.palette = Formatter.default_palette if colors? logger.io
|
31
|
-
logger.formatter = formatter
|
32
|
-
|
33
|
-
level = self.level
|
34
|
-
logger.level = level if level
|
35
|
-
|
36
|
-
logger
|
37
|
-
end
|
38
|
-
|
39
|
-
def colors? io
|
40
|
-
if io.tty?
|
41
|
-
ENV['LOG_COLOR'] != 'off'
|
42
|
-
else
|
43
|
-
ENV['LOG_COLOR'] == 'on'
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
def device
|
48
|
-
@device || env['LOG_DEVICE'] || $stderr
|
49
|
-
end
|
50
|
-
|
51
|
-
def level
|
52
|
-
level = @level || env['LOG_LEVEL']
|
53
|
-
|
54
|
-
return unless level
|
55
|
-
return level if level.is_a? Integer
|
56
|
-
|
57
|
-
level , _ = ExtendedLogger.levels.rassoc level.upcase
|
58
|
-
level
|
59
|
-
end
|
60
|
-
end
|
61
|
-
end
|