hq-logger 0.0.0
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.
- data/lib/hq/logger/ansi-logger.rb +137 -0
- data/lib/hq/logger/html-logger.rb +288 -0
- data/lib/hq/logger/io-logger.rb +52 -0
- data/lib/hq/logger/multi-logger.rb +24 -0
- data/lib/hq/logger/raw-logger.rb +34 -0
- data/lib/hq/logger/text-logger.rb +95 -0
- data/lib/hq/logger.rb +217 -0
- data/spec/hq/logger/ansi-logger-spec.rb +108 -0
- data/spec/hq/logger/html-logger-spec.rb +148 -0
- data/spec/hq/logger/multi-logger-spec.rb +30 -0
- data/spec/hq/logger/raw-logger-spec.rb +48 -0
- data/spec/hq/logger/text-logger-spec.rb +95 -0
- data/spec/hq/logger-spec.rb +9 -0
- metadata +160 -0
@@ -0,0 +1,137 @@
|
|
1
|
+
require "hq/logger/io-logger"
|
2
|
+
|
3
|
+
module HQ
|
4
|
+
class Logger
|
5
|
+
|
6
|
+
class AnsiLogger < IoLogger
|
7
|
+
|
8
|
+
ANSI_CODES = {
|
9
|
+
:normal => "\e[0m",
|
10
|
+
:bold => "\e[1m",
|
11
|
+
:black => "\e[30m",
|
12
|
+
:red => "\e[31m",
|
13
|
+
:green => "\e[32m",
|
14
|
+
:yellow => "\e[33m",
|
15
|
+
:blue => "\e[34m",
|
16
|
+
:magenta => "\e[35m",
|
17
|
+
:cyan => "\e[36m",
|
18
|
+
:white => "\e[37m",
|
19
|
+
}
|
20
|
+
|
21
|
+
MESSAGE_COLOURS = {
|
22
|
+
|
23
|
+
:normal => :normal,
|
24
|
+
|
25
|
+
:hostname => :blue,
|
26
|
+
|
27
|
+
:timing => :blue,
|
28
|
+
:trace => :magenta,
|
29
|
+
:debug => :cyan,
|
30
|
+
:detail => :white,
|
31
|
+
:notice => :green,
|
32
|
+
:warning => :yellow,
|
33
|
+
:error => :red,
|
34
|
+
|
35
|
+
:command_output => :white,
|
36
|
+
}
|
37
|
+
|
38
|
+
DIFF_COLOURS = {
|
39
|
+
:minus_minus_minus => :magenta,
|
40
|
+
:plus_plus_plus => :magenta,
|
41
|
+
:at_at => :magenta,
|
42
|
+
:minus => :red,
|
43
|
+
:plus => :blue,
|
44
|
+
:else => :white,
|
45
|
+
}
|
46
|
+
|
47
|
+
def valid_modes
|
48
|
+
[ :normal, :partial ]
|
49
|
+
end
|
50
|
+
|
51
|
+
def ansi_line text, stuff, colour, prefix = ""
|
52
|
+
|
53
|
+
raise "No such colour: #{colour}" \
|
54
|
+
unless MESSAGE_COLOURS[colour] || ANSI_CODES[colour]
|
55
|
+
|
56
|
+
out.print \
|
57
|
+
ANSI_CODES[:bold],
|
58
|
+
ANSI_CODES[MESSAGE_COLOURS[:hostname]],
|
59
|
+
stuff[:hostname],
|
60
|
+
": ",
|
61
|
+
ANSI_CODES[colour] || ANSI_CODES[MESSAGE_COLOURS[colour]],
|
62
|
+
stuff[:prefix] + prefix,
|
63
|
+
text,
|
64
|
+
ANSI_CODES[:normal],
|
65
|
+
"\n"
|
66
|
+
|
67
|
+
end
|
68
|
+
|
69
|
+
def output_real content, stuff
|
70
|
+
|
71
|
+
if content.is_a? String
|
72
|
+
ansi_line content, stuff, :normal
|
73
|
+
return
|
74
|
+
end
|
75
|
+
|
76
|
+
case content["type"]
|
77
|
+
|
78
|
+
when "log"
|
79
|
+
|
80
|
+
ansi_line content["text"], stuff, stuff[:level]
|
81
|
+
|
82
|
+
if content["content"]
|
83
|
+
content["content"].each do
|
84
|
+
|item|
|
85
|
+
output item, stuff, " "
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
when "exception"
|
90
|
+
|
91
|
+
ansi_line content["text"], stuff, stuff[:level]
|
92
|
+
ansi_line content["message"], stuff, :normal, " "
|
93
|
+
|
94
|
+
content["backtrace"].each do |frame|
|
95
|
+
ansi_line frame, stuff, :normal, " "
|
96
|
+
end
|
97
|
+
|
98
|
+
when "diff"
|
99
|
+
|
100
|
+
ansi_line content["text"], stuff, stuff[:level]
|
101
|
+
|
102
|
+
content["content"].each do
|
103
|
+
|line|
|
104
|
+
colour = DIFF_COLOURS[line["type"].gsub("-", "_")[5..-1].to_sym]
|
105
|
+
ansi_line line["text"], stuff, colour, " "
|
106
|
+
end
|
107
|
+
|
108
|
+
when "command"
|
109
|
+
|
110
|
+
ansi_line content["text"], stuff, stuff[:level]
|
111
|
+
|
112
|
+
if content["output"]
|
113
|
+
|
114
|
+
content["output"].each do
|
115
|
+
|line|
|
116
|
+
ansi_line line, stuff, :normal, " "
|
117
|
+
end
|
118
|
+
|
119
|
+
end
|
120
|
+
|
121
|
+
when "command-output"
|
122
|
+
|
123
|
+
ansi_line content["text"], stuff, :normal, " "
|
124
|
+
|
125
|
+
else
|
126
|
+
|
127
|
+
pp content
|
128
|
+
raise "Error"
|
129
|
+
|
130
|
+
end
|
131
|
+
|
132
|
+
end
|
133
|
+
|
134
|
+
end
|
135
|
+
|
136
|
+
end
|
137
|
+
end
|
@@ -0,0 +1,288 @@
|
|
1
|
+
require "hq/tools/escape"
|
2
|
+
require "hq/logger/io-logger"
|
3
|
+
|
4
|
+
module HQ
|
5
|
+
class Logger
|
6
|
+
|
7
|
+
class HtmlLogger < IoLogger
|
8
|
+
|
9
|
+
include Tools::Escape
|
10
|
+
|
11
|
+
def valid_modes
|
12
|
+
[ :normal, :complete ]
|
13
|
+
end
|
14
|
+
|
15
|
+
def output_real content, stuff
|
16
|
+
|
17
|
+
if content.is_a? String
|
18
|
+
|
19
|
+
out.print \
|
20
|
+
stuff[:prefix],
|
21
|
+
"<div class=\"hq-log-simple\">",
|
22
|
+
esc_ht(content),
|
23
|
+
"</div>\n"
|
24
|
+
|
25
|
+
return
|
26
|
+
|
27
|
+
end
|
28
|
+
|
29
|
+
case content["type"]
|
30
|
+
|
31
|
+
when "log"
|
32
|
+
|
33
|
+
out.print \
|
34
|
+
stuff[:prefix],
|
35
|
+
"<div class=\"hq-log-item hq-log-item-",
|
36
|
+
esc_ht(content["level"].to_s),
|
37
|
+
"\">\n"
|
38
|
+
|
39
|
+
out.print \
|
40
|
+
stuff[:prefix],
|
41
|
+
"\t<div class=\"hq-log-head\">\n"
|
42
|
+
|
43
|
+
out.print \
|
44
|
+
stuff[:prefix],
|
45
|
+
"\t\t<div class=\"hq-log-hostname\">",
|
46
|
+
esc_ht(stuff[:hostname]),
|
47
|
+
"</div>\n"
|
48
|
+
|
49
|
+
out.print \
|
50
|
+
stuff[:prefix],
|
51
|
+
"\t\t<div class=\"hq-log-text\">",
|
52
|
+
esc_ht(content["text"]),
|
53
|
+
"</div>\n"
|
54
|
+
|
55
|
+
out.print \
|
56
|
+
stuff[:prefix],
|
57
|
+
"\t</div>\n"
|
58
|
+
|
59
|
+
if content["content"] && ! content["content"].empty?
|
60
|
+
|
61
|
+
out.print \
|
62
|
+
stuff[:prefix],
|
63
|
+
"\t<div class=\"hq-log-content\">\n"
|
64
|
+
|
65
|
+
content["content"].each do
|
66
|
+
|item|
|
67
|
+
output item, stuff, "\t\t"
|
68
|
+
end
|
69
|
+
|
70
|
+
out.print \
|
71
|
+
stuff[:prefix],
|
72
|
+
"\t</div>\n"
|
73
|
+
|
74
|
+
end
|
75
|
+
|
76
|
+
out.print \
|
77
|
+
stuff[:prefix],
|
78
|
+
"</div>\n"
|
79
|
+
|
80
|
+
when "exception"
|
81
|
+
|
82
|
+
out.print \
|
83
|
+
stuff[:prefix],
|
84
|
+
"<div class=\"hq-log-item hq-log-item-",
|
85
|
+
esc_ht(content["level"]),
|
86
|
+
"\">\n"
|
87
|
+
|
88
|
+
out.print \
|
89
|
+
stuff[:prefix],
|
90
|
+
"\t<div class=\"hq-log-head\">\n"
|
91
|
+
|
92
|
+
out.print \
|
93
|
+
stuff[:prefix],
|
94
|
+
"\t\t<div class=\"hq-log-hostname\">",
|
95
|
+
esc_ht(stuff[:hostname]),
|
96
|
+
"</div>\n"
|
97
|
+
|
98
|
+
out.print \
|
99
|
+
stuff[:prefix],
|
100
|
+
"\t\t<div class=\"hq-log-text\">",
|
101
|
+
esc_ht(content["text"]),
|
102
|
+
"</div>\n"
|
103
|
+
|
104
|
+
out.print \
|
105
|
+
stuff[:prefix],
|
106
|
+
"\t</div>\n"
|
107
|
+
|
108
|
+
out.print \
|
109
|
+
stuff[:prefix],
|
110
|
+
"\t<div class=\"hq-log-content\">\n"
|
111
|
+
|
112
|
+
out.print \
|
113
|
+
stuff[:prefix],
|
114
|
+
"\t\t<div class=\"hq-log-exception\">\n"
|
115
|
+
|
116
|
+
out.print \
|
117
|
+
stuff[:prefix],
|
118
|
+
"\t\t\t<div class=\"hq-log-exception-message\">",
|
119
|
+
esc_ht(content["message"]),
|
120
|
+
"</div>\n"
|
121
|
+
|
122
|
+
out.print \
|
123
|
+
stuff[:prefix],
|
124
|
+
"\t\t\t<div class=\"hq-log-exception-backtrace\">\n"
|
125
|
+
|
126
|
+
content["backtrace"].each do
|
127
|
+
|line|
|
128
|
+
|
129
|
+
out.print \
|
130
|
+
stuff[:prefix],
|
131
|
+
"\t\t\t\t<div class=\"hq-log-exception-backtrace-line\">",
|
132
|
+
esc_ht(line),
|
133
|
+
"</div>\n"
|
134
|
+
|
135
|
+
end
|
136
|
+
|
137
|
+
out.print \
|
138
|
+
stuff[:prefix],
|
139
|
+
"\t\t\t</div>\n"
|
140
|
+
|
141
|
+
out.print \
|
142
|
+
stuff[:prefix],
|
143
|
+
"\t\t</div>\n"
|
144
|
+
|
145
|
+
out.print \
|
146
|
+
stuff[:prefix],
|
147
|
+
"\t</div>\n"
|
148
|
+
|
149
|
+
out.print \
|
150
|
+
stuff[:prefix],
|
151
|
+
"</div>\n"
|
152
|
+
|
153
|
+
when "diff"
|
154
|
+
|
155
|
+
out.print \
|
156
|
+
stuff[:prefix],
|
157
|
+
"<div class=\"hq-log-item hq-log-item-",
|
158
|
+
esc_ht(content["level"]),
|
159
|
+
"\">\n"
|
160
|
+
|
161
|
+
out.print \
|
162
|
+
stuff[:prefix],
|
163
|
+
"\t<div class=\"hq-log-head\">\n"
|
164
|
+
|
165
|
+
out.print \
|
166
|
+
stuff[:prefix],
|
167
|
+
"\t\t<div class=\"hq-log-hostname\">",
|
168
|
+
esc_ht(stuff[:hostname]),
|
169
|
+
"</div>\n"
|
170
|
+
|
171
|
+
out.print \
|
172
|
+
stuff[:prefix],
|
173
|
+
"\t\t<div class=\"hq-log-text\">",
|
174
|
+
esc_ht(content["text"]),
|
175
|
+
"</div>\n"
|
176
|
+
|
177
|
+
out.print \
|
178
|
+
stuff[:prefix],
|
179
|
+
"\t</div>\n"
|
180
|
+
|
181
|
+
out.print \
|
182
|
+
stuff[:prefix],
|
183
|
+
"\t<div class=\"hq-log-content\">\n"
|
184
|
+
|
185
|
+
out.print \
|
186
|
+
stuff[:prefix],
|
187
|
+
"\t\t<div class=\"hq-log-diff\">\n"
|
188
|
+
|
189
|
+
content["content"].each do
|
190
|
+
|line|
|
191
|
+
|
192
|
+
out.print \
|
193
|
+
stuff[:prefix],
|
194
|
+
"\t\t\t<div class=\"hq-log-",
|
195
|
+
esc_ht(line["type"]),
|
196
|
+
"\">",
|
197
|
+
esc_ht(line["text"]),
|
198
|
+
"</div>\n"
|
199
|
+
|
200
|
+
end
|
201
|
+
|
202
|
+
out.print \
|
203
|
+
stuff[:prefix],
|
204
|
+
"\t\t</div>\n"
|
205
|
+
|
206
|
+
out.print \
|
207
|
+
stuff[:prefix],
|
208
|
+
"\t</div>\n"
|
209
|
+
|
210
|
+
out.print \
|
211
|
+
stuff[:prefix],
|
212
|
+
"</div>\n"
|
213
|
+
|
214
|
+
when "command"
|
215
|
+
|
216
|
+
out.print \
|
217
|
+
stuff[:prefix],
|
218
|
+
"<div class=\"hq-log-item hq-log-item-",
|
219
|
+
esc_ht(content["level"]),
|
220
|
+
"\">\n"
|
221
|
+
|
222
|
+
out.print \
|
223
|
+
stuff[:prefix],
|
224
|
+
"\t<div class=\"hq-log-head\">\n"
|
225
|
+
|
226
|
+
out.print \
|
227
|
+
stuff[:prefix],
|
228
|
+
"\t\t<div class=\"hq-log-hostname\">",
|
229
|
+
esc_ht(stuff[:hostname]),
|
230
|
+
"</div>\n"
|
231
|
+
|
232
|
+
out.print \
|
233
|
+
stuff[:prefix],
|
234
|
+
"\t\t<div class=\"hq-log-text\">",
|
235
|
+
esc_ht(content["text"]),
|
236
|
+
"</div>\n"
|
237
|
+
|
238
|
+
out.print \
|
239
|
+
stuff[:prefix],
|
240
|
+
"\t</div>\n"
|
241
|
+
|
242
|
+
if content["output"]
|
243
|
+
|
244
|
+
out.print \
|
245
|
+
stuff[:prefix],
|
246
|
+
"\t<div class=\"hq-log-content\">\n"
|
247
|
+
|
248
|
+
out.print \
|
249
|
+
stuff[:prefix],
|
250
|
+
"\t\t<div class=\"hq-log-command-output\">\n"
|
251
|
+
|
252
|
+
content["output"].each do
|
253
|
+
|line|
|
254
|
+
|
255
|
+
out.print \
|
256
|
+
stuff[:prefix],
|
257
|
+
"\t\t\t<div class=\"hq-log-command-output-line\">",
|
258
|
+
esc_ht(line),
|
259
|
+
"</div>\n"
|
260
|
+
|
261
|
+
end
|
262
|
+
|
263
|
+
out.print \
|
264
|
+
stuff[:prefix],
|
265
|
+
"\t\t</div>\n"
|
266
|
+
|
267
|
+
out.print \
|
268
|
+
stuff[:prefix],
|
269
|
+
"\t</div>\n"
|
270
|
+
|
271
|
+
end
|
272
|
+
|
273
|
+
out.print \
|
274
|
+
stuff[:prefix],
|
275
|
+
"</div>\n"
|
276
|
+
|
277
|
+
else
|
278
|
+
|
279
|
+
pp content
|
280
|
+
|
281
|
+
end
|
282
|
+
|
283
|
+
end
|
284
|
+
|
285
|
+
end
|
286
|
+
|
287
|
+
end
|
288
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
module HQ
|
2
|
+
class Logger
|
3
|
+
|
4
|
+
class IoLogger
|
5
|
+
|
6
|
+
attr_accessor :out
|
7
|
+
attr_accessor :level
|
8
|
+
|
9
|
+
def fix_stuff old_stuff, content, prefix = nil
|
10
|
+
|
11
|
+
content = {} \
|
12
|
+
unless content.is_a? Hash
|
13
|
+
|
14
|
+
new_stuff = {
|
15
|
+
hostname: content["hostname"] || old_stuff[:hostname],
|
16
|
+
level: (content["level"] || old_stuff[:level]).to_sym,
|
17
|
+
prefix: (old_stuff[:prefix] || "") + (prefix || ""),
|
18
|
+
mode: old_stuff[:mode].to_sym,
|
19
|
+
}
|
20
|
+
|
21
|
+
raise "No hostname" \
|
22
|
+
unless new_stuff[:hostname]
|
23
|
+
|
24
|
+
raise "No level" \
|
25
|
+
unless new_stuff[:level]
|
26
|
+
|
27
|
+
return new_stuff
|
28
|
+
|
29
|
+
end
|
30
|
+
|
31
|
+
def output content, stuff = {}, prefix = ""
|
32
|
+
|
33
|
+
stuff = fix_stuff stuff, content, prefix
|
34
|
+
|
35
|
+
# check we want to output this entry
|
36
|
+
|
37
|
+
return unless Logger.level_includes \
|
38
|
+
level,
|
39
|
+
stuff[:level]
|
40
|
+
|
41
|
+
return unless valid_modes.include? stuff[:mode].to_sym
|
42
|
+
|
43
|
+
# output it
|
44
|
+
|
45
|
+
output_real content, stuff
|
46
|
+
|
47
|
+
end
|
48
|
+
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
module HQ
|
2
|
+
class Logger
|
3
|
+
|
4
|
+
class MultiLogger
|
5
|
+
|
6
|
+
def initialize
|
7
|
+
@loggers = []
|
8
|
+
end
|
9
|
+
|
10
|
+
def add_logger logger
|
11
|
+
@loggers << logger
|
12
|
+
end
|
13
|
+
|
14
|
+
def output content, stuff, prefix = ""
|
15
|
+
@loggers.each do
|
16
|
+
|logger|
|
17
|
+
logger.output content, stuff, prefix
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require "hq/logger/io-logger"
|
2
|
+
|
3
|
+
require "multi_json"
|
4
|
+
|
5
|
+
module HQ
|
6
|
+
class Logger
|
7
|
+
|
8
|
+
class RawLogger < IoLogger
|
9
|
+
|
10
|
+
def valid_modes
|
11
|
+
[ :normal, :partial, :complete ]
|
12
|
+
end
|
13
|
+
|
14
|
+
def output_real content, stuff
|
15
|
+
|
16
|
+
data = {
|
17
|
+
mode: stuff[:mode],
|
18
|
+
content: [ content ],
|
19
|
+
}
|
20
|
+
|
21
|
+
data_json = begin
|
22
|
+
MultiJson.dump data
|
23
|
+
rescue
|
24
|
+
out.puts "ERROR encoding #{content} (#{content.encoding})"
|
25
|
+
end
|
26
|
+
|
27
|
+
out.print MultiJson.dump(data) + "\n"
|
28
|
+
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,95 @@
|
|
1
|
+
require "hq/logger/io-logger"
|
2
|
+
|
3
|
+
module HQ
|
4
|
+
class Logger
|
5
|
+
|
6
|
+
class TextLogger < IoLogger
|
7
|
+
|
8
|
+
def valid_modes
|
9
|
+
[ :normal, :partial ]
|
10
|
+
end
|
11
|
+
|
12
|
+
def text_line text, stuff, prefix = ""
|
13
|
+
|
14
|
+
out.print \
|
15
|
+
stuff[:hostname],
|
16
|
+
" ",
|
17
|
+
stuff[:level],
|
18
|
+
": ",
|
19
|
+
stuff[:prefix] + prefix,
|
20
|
+
text,
|
21
|
+
"\n"
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
def output_real content, stuff
|
26
|
+
|
27
|
+
if content.is_a? String
|
28
|
+
text_line content, stuff
|
29
|
+
return
|
30
|
+
end
|
31
|
+
|
32
|
+
case content["type"]
|
33
|
+
|
34
|
+
when "log"
|
35
|
+
|
36
|
+
text_line content["text"], stuff
|
37
|
+
|
38
|
+
if content["content"]
|
39
|
+
|
40
|
+
content["content"].each do
|
41
|
+
|item|
|
42
|
+
output item, stuff, " "
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
|
47
|
+
when "exception"
|
48
|
+
|
49
|
+
text_line content["text"], stuff
|
50
|
+
text_line content["message"], stuff, " "
|
51
|
+
|
52
|
+
content["backtrace"].each do
|
53
|
+
|frame|
|
54
|
+
output frame, stuff, " "
|
55
|
+
end
|
56
|
+
|
57
|
+
when "diff"
|
58
|
+
|
59
|
+
text_line content["text"], stuff
|
60
|
+
|
61
|
+
content["content"].each do
|
62
|
+
|line|
|
63
|
+
output line["text"], stuff, " "
|
64
|
+
end
|
65
|
+
|
66
|
+
when "command"
|
67
|
+
|
68
|
+
text_line content["text"], stuff
|
69
|
+
|
70
|
+
if content["output"]
|
71
|
+
|
72
|
+
content["output"].each do
|
73
|
+
|line|
|
74
|
+
output line, stuff, " "
|
75
|
+
end
|
76
|
+
|
77
|
+
end
|
78
|
+
|
79
|
+
when "command-output"
|
80
|
+
|
81
|
+
text_line content["text"], stuff, " "
|
82
|
+
|
83
|
+
else
|
84
|
+
|
85
|
+
pp content
|
86
|
+
raise "Error"
|
87
|
+
|
88
|
+
end
|
89
|
+
|
90
|
+
end
|
91
|
+
|
92
|
+
end
|
93
|
+
|
94
|
+
end
|
95
|
+
end
|