ntail 0.0.8 → 0.0.9
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/Gemfile +1 -0
- data/Gemfile.lock +4 -0
- data/VERSION +1 -1
- data/lib/ntail.rb +4 -0
- data/lib/ntail/formatting.rb +330 -0
- data/lib/ntail/formatting.treetop +70 -0
- data/lib/ntail/log_line.rb +10 -8
- data/lib/ntail/node.rb +9 -0
- data/ntail.gemspec +7 -1
- metadata +22 -3
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -7,10 +7,13 @@ GEM
|
|
7
7
|
bundler (~> 1.0.0)
|
8
8
|
git (>= 1.2.5)
|
9
9
|
rake
|
10
|
+
polyglot (0.3.1)
|
10
11
|
rainbow (1.1)
|
11
12
|
rake (0.8.7)
|
12
13
|
rcov (0.9.9)
|
13
14
|
shoulda (2.11.3)
|
15
|
+
treetop (1.4.9)
|
16
|
+
polyglot (>= 0.3.1)
|
14
17
|
user-agent (1.0.0)
|
15
18
|
|
16
19
|
PLATFORMS
|
@@ -23,4 +26,5 @@ DEPENDENCIES
|
|
23
26
|
rainbow
|
24
27
|
rcov
|
25
28
|
shoulda
|
29
|
+
treetop (~> 1.4.9)
|
26
30
|
user-agent
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.0.
|
1
|
+
0.0.9
|
data/lib/ntail.rb
CHANGED
@@ -21,6 +21,10 @@ require 'ntail/http_version'
|
|
21
21
|
require 'ntail/known_ip_addresses'
|
22
22
|
require 'ntail/local_ip_addresses'
|
23
23
|
|
24
|
+
# the formatting classes...
|
25
|
+
require 'ntail/node.rb'
|
26
|
+
require 'ntail/formatting.rb'
|
27
|
+
|
24
28
|
# the core classes...
|
25
29
|
require 'ntail/log_line'
|
26
30
|
require 'ntail/application'
|
@@ -0,0 +1,330 @@
|
|
1
|
+
# Autogenerated from a Treetop grammar. Edits may be lost.
|
2
|
+
|
3
|
+
|
4
|
+
module Formatting
|
5
|
+
include Treetop::Runtime
|
6
|
+
|
7
|
+
def root
|
8
|
+
@root ||= :format_string
|
9
|
+
end
|
10
|
+
|
11
|
+
def _nt_format_string
|
12
|
+
start_index = index
|
13
|
+
if node_cache[:format_string].has_key?(index)
|
14
|
+
cached = node_cache[:format_string][index]
|
15
|
+
if cached
|
16
|
+
cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
|
17
|
+
@index = cached.interval.end
|
18
|
+
end
|
19
|
+
return cached
|
20
|
+
end
|
21
|
+
|
22
|
+
s0, i0 = [], index
|
23
|
+
loop do
|
24
|
+
i1 = index
|
25
|
+
r2 = _nt_token
|
26
|
+
if r2
|
27
|
+
r1 = r2
|
28
|
+
else
|
29
|
+
r3 = _nt_literal
|
30
|
+
if r3
|
31
|
+
r1 = r3
|
32
|
+
else
|
33
|
+
@index = i1
|
34
|
+
r1 = nil
|
35
|
+
end
|
36
|
+
end
|
37
|
+
if r1
|
38
|
+
s0 << r1
|
39
|
+
else
|
40
|
+
break
|
41
|
+
end
|
42
|
+
end
|
43
|
+
if s0.empty?
|
44
|
+
@index = i0
|
45
|
+
r0 = nil
|
46
|
+
else
|
47
|
+
r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
|
48
|
+
end
|
49
|
+
|
50
|
+
node_cache[:format_string][start_index] = r0
|
51
|
+
|
52
|
+
r0
|
53
|
+
end
|
54
|
+
|
55
|
+
module Literal0
|
56
|
+
def value(log_line, color)
|
57
|
+
# context-independent...
|
58
|
+
self.text_value
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
def _nt_literal
|
63
|
+
start_index = index
|
64
|
+
if node_cache[:literal].has_key?(index)
|
65
|
+
cached = node_cache[:literal][index]
|
66
|
+
if cached
|
67
|
+
cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
|
68
|
+
@index = cached.interval.end
|
69
|
+
end
|
70
|
+
return cached
|
71
|
+
end
|
72
|
+
|
73
|
+
if index < input_length
|
74
|
+
r0 = instantiate_node(SyntaxNode,input, index...(index + 1))
|
75
|
+
r0.extend(Literal0)
|
76
|
+
@index += 1
|
77
|
+
else
|
78
|
+
terminal_parse_failure("any character")
|
79
|
+
r0 = nil
|
80
|
+
end
|
81
|
+
|
82
|
+
node_cache[:literal][start_index] = r0
|
83
|
+
|
84
|
+
r0
|
85
|
+
end
|
86
|
+
|
87
|
+
def _nt_token
|
88
|
+
start_index = index
|
89
|
+
if node_cache[:token].has_key?(index)
|
90
|
+
cached = node_cache[:token][index]
|
91
|
+
if cached
|
92
|
+
cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
|
93
|
+
@index = cached.interval.end
|
94
|
+
end
|
95
|
+
return cached
|
96
|
+
end
|
97
|
+
|
98
|
+
i0 = index
|
99
|
+
r1 = _nt_date
|
100
|
+
if r1
|
101
|
+
r0 = r1
|
102
|
+
else
|
103
|
+
r2 = _nt_referer
|
104
|
+
if r2
|
105
|
+
r0 = r2
|
106
|
+
else
|
107
|
+
r3 = _nt_remote_address
|
108
|
+
if r3
|
109
|
+
r0 = r3
|
110
|
+
else
|
111
|
+
r4 = _nt_request
|
112
|
+
if r4
|
113
|
+
r0 = r4
|
114
|
+
else
|
115
|
+
r5 = _nt_status
|
116
|
+
if r5
|
117
|
+
r0 = r5
|
118
|
+
else
|
119
|
+
r6 = _nt_user_agent
|
120
|
+
if r6
|
121
|
+
r0 = r6
|
122
|
+
else
|
123
|
+
@index = i0
|
124
|
+
r0 = nil
|
125
|
+
end
|
126
|
+
end
|
127
|
+
end
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
node_cache[:token][start_index] = r0
|
133
|
+
|
134
|
+
r0
|
135
|
+
end
|
136
|
+
|
137
|
+
module Date0
|
138
|
+
def value(log_line, color)
|
139
|
+
log_line.to_date_s.foreground(color)
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
def _nt_date
|
144
|
+
start_index = index
|
145
|
+
if node_cache[:date].has_key?(index)
|
146
|
+
cached = node_cache[:date][index]
|
147
|
+
if cached
|
148
|
+
cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
|
149
|
+
@index = cached.interval.end
|
150
|
+
end
|
151
|
+
return cached
|
152
|
+
end
|
153
|
+
|
154
|
+
if has_terminal?('%d', false, index)
|
155
|
+
r0 = instantiate_node(Node,input, index...(index + 2))
|
156
|
+
r0.extend(Date0)
|
157
|
+
@index += 2
|
158
|
+
else
|
159
|
+
terminal_parse_failure('%d')
|
160
|
+
r0 = nil
|
161
|
+
end
|
162
|
+
|
163
|
+
node_cache[:date][start_index] = r0
|
164
|
+
|
165
|
+
r0
|
166
|
+
end
|
167
|
+
|
168
|
+
module Referer0
|
169
|
+
def value(log_line, color)
|
170
|
+
log_line.to_referer_s.foreground(color).inverse
|
171
|
+
end
|
172
|
+
end
|
173
|
+
|
174
|
+
def _nt_referer
|
175
|
+
start_index = index
|
176
|
+
if node_cache[:referer].has_key?(index)
|
177
|
+
cached = node_cache[:referer][index]
|
178
|
+
if cached
|
179
|
+
cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
|
180
|
+
@index = cached.interval.end
|
181
|
+
end
|
182
|
+
return cached
|
183
|
+
end
|
184
|
+
|
185
|
+
if has_terminal?('%f', false, index)
|
186
|
+
r0 = instantiate_node(Node,input, index...(index + 2))
|
187
|
+
r0.extend(Referer0)
|
188
|
+
@index += 2
|
189
|
+
else
|
190
|
+
terminal_parse_failure('%f')
|
191
|
+
r0 = nil
|
192
|
+
end
|
193
|
+
|
194
|
+
node_cache[:referer][start_index] = r0
|
195
|
+
|
196
|
+
r0
|
197
|
+
end
|
198
|
+
|
199
|
+
module RemoteAddress0
|
200
|
+
def value(log_line, color)
|
201
|
+
"%#{Sickill::Rainbow.enabled ? 15 + 9 : 15}s" % log_line.remote_address.foreground(color)
|
202
|
+
end
|
203
|
+
end
|
204
|
+
|
205
|
+
def _nt_remote_address
|
206
|
+
start_index = index
|
207
|
+
if node_cache[:remote_address].has_key?(index)
|
208
|
+
cached = node_cache[:remote_address][index]
|
209
|
+
if cached
|
210
|
+
cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
|
211
|
+
@index = cached.interval.end
|
212
|
+
end
|
213
|
+
return cached
|
214
|
+
end
|
215
|
+
|
216
|
+
if has_terminal?('%a', false, index)
|
217
|
+
r0 = instantiate_node(Node,input, index...(index + 2))
|
218
|
+
r0.extend(RemoteAddress0)
|
219
|
+
@index += 2
|
220
|
+
else
|
221
|
+
terminal_parse_failure('%a')
|
222
|
+
r0 = nil
|
223
|
+
end
|
224
|
+
|
225
|
+
node_cache[:remote_address][start_index] = r0
|
226
|
+
|
227
|
+
r0
|
228
|
+
end
|
229
|
+
|
230
|
+
module Request0
|
231
|
+
def value(log_line, color)
|
232
|
+
log_line.to_request_s.foreground(color)
|
233
|
+
end
|
234
|
+
end
|
235
|
+
|
236
|
+
def _nt_request
|
237
|
+
start_index = index
|
238
|
+
if node_cache[:request].has_key?(index)
|
239
|
+
cached = node_cache[:request][index]
|
240
|
+
if cached
|
241
|
+
cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
|
242
|
+
@index = cached.interval.end
|
243
|
+
end
|
244
|
+
return cached
|
245
|
+
end
|
246
|
+
|
247
|
+
if has_terminal?('%r', false, index)
|
248
|
+
r0 = instantiate_node(Node,input, index...(index + 2))
|
249
|
+
r0.extend(Request0)
|
250
|
+
@index += 2
|
251
|
+
else
|
252
|
+
terminal_parse_failure('%r')
|
253
|
+
r0 = nil
|
254
|
+
end
|
255
|
+
|
256
|
+
node_cache[:request][start_index] = r0
|
257
|
+
|
258
|
+
r0
|
259
|
+
end
|
260
|
+
|
261
|
+
module Status0
|
262
|
+
def value(log_line, color)
|
263
|
+
log_line.status.foreground(color)
|
264
|
+
end
|
265
|
+
end
|
266
|
+
|
267
|
+
def _nt_status
|
268
|
+
start_index = index
|
269
|
+
if node_cache[:status].has_key?(index)
|
270
|
+
cached = node_cache[:status][index]
|
271
|
+
if cached
|
272
|
+
cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
|
273
|
+
@index = cached.interval.end
|
274
|
+
end
|
275
|
+
return cached
|
276
|
+
end
|
277
|
+
|
278
|
+
if has_terminal?('%s', false, index)
|
279
|
+
r0 = instantiate_node(Node,input, index...(index + 2))
|
280
|
+
r0.extend(Status0)
|
281
|
+
@index += 2
|
282
|
+
else
|
283
|
+
terminal_parse_failure('%s')
|
284
|
+
r0 = nil
|
285
|
+
end
|
286
|
+
|
287
|
+
node_cache[:status][start_index] = r0
|
288
|
+
|
289
|
+
r0
|
290
|
+
end
|
291
|
+
|
292
|
+
module UserAgent0
|
293
|
+
def value(log_line, color)
|
294
|
+
log_line.to_agent_s.foreground(color)
|
295
|
+
end
|
296
|
+
end
|
297
|
+
|
298
|
+
def _nt_user_agent
|
299
|
+
start_index = index
|
300
|
+
if node_cache[:user_agent].has_key?(index)
|
301
|
+
cached = node_cache[:user_agent][index]
|
302
|
+
if cached
|
303
|
+
cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
|
304
|
+
@index = cached.interval.end
|
305
|
+
end
|
306
|
+
return cached
|
307
|
+
end
|
308
|
+
|
309
|
+
if has_terminal?('%u', false, index)
|
310
|
+
r0 = instantiate_node(Node,input, index...(index + 2))
|
311
|
+
r0.extend(UserAgent0)
|
312
|
+
@index += 2
|
313
|
+
else
|
314
|
+
terminal_parse_failure('%u')
|
315
|
+
r0 = nil
|
316
|
+
end
|
317
|
+
|
318
|
+
node_cache[:user_agent][start_index] = r0
|
319
|
+
|
320
|
+
r0
|
321
|
+
end
|
322
|
+
|
323
|
+
end
|
324
|
+
|
325
|
+
class FormattingParser < Treetop::Runtime::CompiledParser
|
326
|
+
include Formatting
|
327
|
+
end
|
328
|
+
|
329
|
+
|
330
|
+
# vim:syntax=ruby
|
@@ -0,0 +1,70 @@
|
|
1
|
+
grammar Formatting
|
2
|
+
|
3
|
+
rule format_string
|
4
|
+
(token / literal)+
|
5
|
+
end
|
6
|
+
|
7
|
+
rule literal
|
8
|
+
. {
|
9
|
+
def value(log_line, color)
|
10
|
+
# context-independent...
|
11
|
+
self.text_value
|
12
|
+
end
|
13
|
+
}
|
14
|
+
end
|
15
|
+
|
16
|
+
rule token
|
17
|
+
date / referer / remote_address / request / status / user_agent
|
18
|
+
end
|
19
|
+
|
20
|
+
rule date
|
21
|
+
'%d' <Node> {
|
22
|
+
def value(log_line, color)
|
23
|
+
log_line.to_date_s.foreground(color)
|
24
|
+
end
|
25
|
+
}
|
26
|
+
end
|
27
|
+
|
28
|
+
rule referer
|
29
|
+
'%f' <Node> {
|
30
|
+
def value(log_line, color)
|
31
|
+
log_line.to_referer_s.foreground(color).inverse
|
32
|
+
end
|
33
|
+
}
|
34
|
+
end
|
35
|
+
|
36
|
+
rule remote_address
|
37
|
+
'%a' <Node> {
|
38
|
+
def value(log_line, color)
|
39
|
+
"%#{Sickill::Rainbow.enabled ? 15 + 9 : 15}s" % log_line.remote_address.foreground(color)
|
40
|
+
end
|
41
|
+
}
|
42
|
+
end
|
43
|
+
|
44
|
+
rule request
|
45
|
+
'%r' <Node> {
|
46
|
+
def value(log_line, color)
|
47
|
+
log_line.to_request_s.foreground(color)
|
48
|
+
end
|
49
|
+
}
|
50
|
+
end
|
51
|
+
|
52
|
+
rule status
|
53
|
+
'%s' <Node> {
|
54
|
+
def value(log_line, color)
|
55
|
+
log_line.status.foreground(color)
|
56
|
+
end
|
57
|
+
}
|
58
|
+
end
|
59
|
+
|
60
|
+
rule user_agent
|
61
|
+
'%u' <Node> {
|
62
|
+
def value(log_line, color)
|
63
|
+
log_line.to_agent_s.foreground(color)
|
64
|
+
end
|
65
|
+
}
|
66
|
+
end
|
67
|
+
|
68
|
+
end
|
69
|
+
|
70
|
+
# vim:syntax=ruby
|
data/lib/ntail/log_line.rb
CHANGED
@@ -82,6 +82,8 @@ module NginxTail
|
|
82
82
|
raw_line.send method, *params
|
83
83
|
end
|
84
84
|
|
85
|
+
@@parser = FormattingParser.new
|
86
|
+
|
85
87
|
def to_s()
|
86
88
|
# simple but boring:
|
87
89
|
# raw_line.to_s
|
@@ -92,14 +94,14 @@ module NginxTail
|
|
92
94
|
else
|
93
95
|
:default
|
94
96
|
end
|
95
|
-
"%
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
97
|
+
unless result = @@parser.parse("%d - %a - %s - %r - %u - %f")
|
98
|
+
raise @@parser.terminal_failures.join("\n")
|
99
|
+
else
|
100
|
+
def result.value(log_line, color)
|
101
|
+
elements.map { |element| element.value(log_line, color) }.join
|
102
|
+
end
|
103
|
+
end
|
104
|
+
result.value(self, color)
|
103
105
|
end
|
104
106
|
|
105
107
|
end # class LogLine
|
data/lib/ntail/node.rb
ADDED
data/ntail.gemspec
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
|
6
6
|
Gem::Specification.new do |s|
|
7
7
|
s.name = %q{ntail}
|
8
|
-
s.version = "0.0.
|
8
|
+
s.version = "0.0.9"
|
9
9
|
|
10
10
|
s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
|
11
11
|
s.authors = ["Peter Vandenberk"]
|
@@ -30,6 +30,8 @@ Gem::Specification.new do |s|
|
|
30
30
|
"lib/ntail.rb",
|
31
31
|
"lib/ntail/application.rb",
|
32
32
|
"lib/ntail/body_bytes_sent.rb",
|
33
|
+
"lib/ntail/formatting.rb",
|
34
|
+
"lib/ntail/formatting.treetop",
|
33
35
|
"lib/ntail/http_method.rb",
|
34
36
|
"lib/ntail/http_referer.rb",
|
35
37
|
"lib/ntail/http_user_agent.rb",
|
@@ -37,6 +39,7 @@ Gem::Specification.new do |s|
|
|
37
39
|
"lib/ntail/known_ip_addresses.rb",
|
38
40
|
"lib/ntail/local_ip_addresses.rb",
|
39
41
|
"lib/ntail/log_line.rb",
|
42
|
+
"lib/ntail/node.rb",
|
40
43
|
"lib/ntail/proxy_addresses.rb",
|
41
44
|
"lib/ntail/remote_addr.rb",
|
42
45
|
"lib/ntail/remote_user.rb",
|
@@ -93,6 +96,7 @@ Gem::Specification.new do |s|
|
|
93
96
|
s.add_development_dependency(%q<jeweler>, ["~> 1.5.1"])
|
94
97
|
s.add_development_dependency(%q<rcov>, [">= 0"])
|
95
98
|
s.add_development_dependency(%q<geoip>, [">= 0"])
|
99
|
+
s.add_development_dependency(%q<treetop>, ["~> 1.4.9"])
|
96
100
|
else
|
97
101
|
s.add_dependency(%q<rainbow>, [">= 0"])
|
98
102
|
s.add_dependency(%q<user-agent>, [">= 0"])
|
@@ -101,6 +105,7 @@ Gem::Specification.new do |s|
|
|
101
105
|
s.add_dependency(%q<jeweler>, ["~> 1.5.1"])
|
102
106
|
s.add_dependency(%q<rcov>, [">= 0"])
|
103
107
|
s.add_dependency(%q<geoip>, [">= 0"])
|
108
|
+
s.add_dependency(%q<treetop>, ["~> 1.4.9"])
|
104
109
|
end
|
105
110
|
else
|
106
111
|
s.add_dependency(%q<rainbow>, [">= 0"])
|
@@ -110,6 +115,7 @@ Gem::Specification.new do |s|
|
|
110
115
|
s.add_dependency(%q<jeweler>, ["~> 1.5.1"])
|
111
116
|
s.add_dependency(%q<rcov>, [">= 0"])
|
112
117
|
s.add_dependency(%q<geoip>, [">= 0"])
|
118
|
+
s.add_dependency(%q<treetop>, ["~> 1.4.9"])
|
113
119
|
end
|
114
120
|
end
|
115
121
|
|
metadata
CHANGED
@@ -1,13 +1,13 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ntail
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
hash:
|
4
|
+
hash: 13
|
5
5
|
prerelease:
|
6
6
|
segments:
|
7
7
|
- 0
|
8
8
|
- 0
|
9
|
-
-
|
10
|
-
version: 0.0.
|
9
|
+
- 9
|
10
|
+
version: 0.0.9
|
11
11
|
platform: ruby
|
12
12
|
authors:
|
13
13
|
- Peter Vandenberk
|
@@ -120,6 +120,22 @@ dependencies:
|
|
120
120
|
requirement: *id007
|
121
121
|
prerelease: false
|
122
122
|
name: geoip
|
123
|
+
- !ruby/object:Gem::Dependency
|
124
|
+
type: :development
|
125
|
+
version_requirements: &id008 !ruby/object:Gem::Requirement
|
126
|
+
none: false
|
127
|
+
requirements:
|
128
|
+
- - ~>
|
129
|
+
- !ruby/object:Gem::Version
|
130
|
+
hash: 21
|
131
|
+
segments:
|
132
|
+
- 1
|
133
|
+
- 4
|
134
|
+
- 9
|
135
|
+
version: 1.4.9
|
136
|
+
requirement: *id008
|
137
|
+
prerelease: false
|
138
|
+
name: treetop
|
123
139
|
description: A tail(1)-like utility for nginx log files. It supports parsing, filtering and formatting individual log lines.
|
124
140
|
email: pvandenberk@mac.com
|
125
141
|
executables:
|
@@ -141,6 +157,8 @@ files:
|
|
141
157
|
- lib/ntail.rb
|
142
158
|
- lib/ntail/application.rb
|
143
159
|
- lib/ntail/body_bytes_sent.rb
|
160
|
+
- lib/ntail/formatting.rb
|
161
|
+
- lib/ntail/formatting.treetop
|
144
162
|
- lib/ntail/http_method.rb
|
145
163
|
- lib/ntail/http_referer.rb
|
146
164
|
- lib/ntail/http_user_agent.rb
|
@@ -148,6 +166,7 @@ files:
|
|
148
166
|
- lib/ntail/known_ip_addresses.rb
|
149
167
|
- lib/ntail/local_ip_addresses.rb
|
150
168
|
- lib/ntail/log_line.rb
|
169
|
+
- lib/ntail/node.rb
|
151
170
|
- lib/ntail/proxy_addresses.rb
|
152
171
|
- lib/ntail/remote_addr.rb
|
153
172
|
- lib/ntail/remote_user.rb
|