apache_log_report 0.9.5 → 1.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.
- checksums.yaml +4 -4
- data/Gemfile.lock +29 -0
- data/exe/apache_log_report +0 -0
- data/lib/apache_log_report.rb +56 -34
- data/lib/apache_log_report/version.rb +1 -1
- metadata +4 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: be24b7fd62ff47195fe5e19cd2717252a37a687a8d92745add21acc952fc50a3
|
4
|
+
data.tar.gz: 3f5daff6a7447b6acca3a7ef456b148c3de49ff2dee87b75d419763dc2bbe2c4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d5271fd26059e942a730c649cd6ea00c35b459c3f5b130bd2d0ae707717b3554c90b7adff8364f384e56b5e8782ca147b1fd40f957290aed4a7bc443eb38387c
|
7
|
+
data.tar.gz: 475dfe3e49e76434c620bb75558bc2b5e40c6441fe455fca58d9b70b366a549f76a9d1bbbf9aae4bf5c9e0daa013770cefa9047fa11b8206f7eff4425be54b50
|
data/Gemfile.lock
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
apache_log_report (0.9.7)
|
5
|
+
apache_log-parser
|
6
|
+
browser
|
7
|
+
sqlite3
|
8
|
+
terminal-table
|
9
|
+
|
10
|
+
GEM
|
11
|
+
remote: https://rubygems.org/
|
12
|
+
specs:
|
13
|
+
apache_log-parser (3.1.2)
|
14
|
+
browser (5.0.0)
|
15
|
+
rake (12.3.3)
|
16
|
+
sqlite3 (1.4.2)
|
17
|
+
terminal-table (1.8.0)
|
18
|
+
unicode-display_width (~> 1.1, >= 1.1.1)
|
19
|
+
unicode-display_width (1.7.0)
|
20
|
+
|
21
|
+
PLATFORMS
|
22
|
+
ruby
|
23
|
+
|
24
|
+
DEPENDENCIES
|
25
|
+
apache_log_report!
|
26
|
+
rake (~> 12.0)
|
27
|
+
|
28
|
+
BUNDLED WITH
|
29
|
+
2.1.4
|
data/exe/apache_log_report
CHANGED
File without changes
|
data/lib/apache_log_report.rb
CHANGED
@@ -5,52 +5,63 @@ module ApacheLogReport
|
|
5
5
|
#
|
6
6
|
require 'optparse'
|
7
7
|
require 'optparse/date'
|
8
|
+
require 'apache_log_report/version'
|
8
9
|
|
9
10
|
def self.options_parse options
|
10
11
|
limit = 30
|
11
12
|
args = {}
|
12
13
|
|
13
14
|
opt_parser = OptionParser.new do |opts|
|
14
|
-
opts.banner = "Usage:
|
15
|
+
opts.banner = "Usage: apache_log_report [options] [logfile]"
|
15
16
|
|
16
17
|
opts.on("-lN", "--limit=N", Integer, "Number of entries to show (defaults to #{limit})") do |n|
|
17
18
|
args[:limit] = n
|
18
19
|
end
|
19
20
|
|
20
|
-
opts.on("-bDATE", "--
|
21
|
+
opts.on("-bDATE", "--begin=DATE", DateTime, "Consider entries after or on DATE") do |n|
|
21
22
|
args[:from_date] = n
|
22
23
|
end
|
23
24
|
|
24
|
-
opts.on("-eDATE", "--
|
25
|
+
opts.on("-eDATE", "--end=DATE", DateTime, "Consider entries before or on DATE") do |n|
|
25
26
|
args[:to_date] = n
|
26
27
|
end
|
27
28
|
|
28
|
-
opts.on("-i", "--ignore-crawlers", "Ignore crawlers") do
|
29
|
+
opts.on("-i", "--ignore-crawlers", "Ignore crawlers") do
|
29
30
|
args[:ignore_crawlers] = true
|
30
31
|
end
|
31
32
|
|
32
|
-
opts.on("-p", "--ignore-selfpoll", "Ignore apaches self poll entries (from ::1)") do
|
33
|
+
opts.on("-p", "--ignore-selfpoll", "Ignore apaches self poll entries (from ::1)") do
|
33
34
|
args[:no_selfpoll] = true
|
34
35
|
end
|
35
36
|
|
36
|
-
opts.on("-c", "--only-crawlers", "Perform analysis on crawlers only") do
|
37
|
+
opts.on("-c", "--only-crawlers", "Perform analysis on crawlers only") do
|
37
38
|
args[:only_crawlers] = true
|
38
39
|
end
|
39
40
|
|
40
|
-
opts.on("-
|
41
|
+
opts.on("-uPREFIX", "--prefix=PREFIX", String, "Prefix to add to all plots (used to run multiple analyses in the same dir)") do |n|
|
41
42
|
args[:prefix] = n
|
42
43
|
end
|
43
44
|
|
44
|
-
opts.on("-
|
45
|
+
opts.on("-wSUFFIX", "--suffix=SUFFIX", String, "Suffix to add to all plots (used to run multiple analyses in the same dir)") do |n|
|
45
46
|
args[:suffix] = n
|
46
47
|
end
|
47
48
|
|
48
|
-
opts.on("-
|
49
|
+
opts.on("-cWHAT", "--code-export=WHAT", String, "Control :export directive in code blocks (code, results, *both*, none)") do |n|
|
49
50
|
args[:code_export] = n
|
50
51
|
end
|
51
52
|
|
53
|
+
opts.on("-v", "--version", "Prints version information") do
|
54
|
+
puts "apache_log_report version #{ApacheLogReport::VERSION}"
|
55
|
+
puts "Copyright (C) 2020 Adolfo Villafiorita"
|
56
|
+
puts "Distributed under the terms of the MIT license"
|
57
|
+
puts ""
|
58
|
+
puts "Written by Adolfo Villafiorita"
|
59
|
+
exit
|
60
|
+
end
|
61
|
+
|
52
62
|
opts.on("-h", "--help", "Prints this help") do
|
53
63
|
puts opts
|
64
|
+
puts "This is version #{ApacheLogReport::VERSION}"
|
54
65
|
exit
|
55
66
|
end
|
56
67
|
end
|
@@ -130,7 +141,7 @@ module ApacheLogReport
|
|
130
141
|
hash[:datetime].iso8601,
|
131
142
|
hash[:remote_host],
|
132
143
|
hash[:user],
|
133
|
-
hash[:datetime].
|
144
|
+
hash[:datetime].strftime("%Y-%m-%d") + " " + hash[:remote_host] + " " + hash[:user_agent],
|
134
145
|
hash[:request][:method],
|
135
146
|
hash[:request][:path],
|
136
147
|
(hash[:request][:path] ? File.extname(hash[:request][:path]) : ""),
|
@@ -175,18 +186,29 @@ module ApacheLogReport
|
|
175
186
|
"true"
|
176
187
|
].compact.join " and "
|
177
188
|
|
189
|
+
# in alternative to sum(size)
|
190
|
+
human_readable_size = <<-EOS
|
191
|
+
CASE
|
192
|
+
WHEN sum(size) < 1024 THEN sum(size) || ' B'
|
193
|
+
WHEN sum(size) >= 1024 AND sum(size) < (1024 * 1024) THEN ROUND((CAST(sum(size) AS REAL) / 1024),2) || ' KB'
|
194
|
+
WHEN sum(size) >= (1024 * 1024) AND sum(size) < (1024 * 1024 * 1024) THEN ROUND((CAST(sum(size) AS REAL) / (1024 * 1024)),2) || ' MB'
|
195
|
+
WHEN sum(size) >= (1024 * 1024 * 1024) AND sum(size) < (1024 * 1024 * 1024 *1024) THEN ROUND((CAST(sum(size) AS REAL) / (1024 * 1024 * 1024)),2) || ' GB'
|
196
|
+
WHEN sum(size) >= (1024 * 1024 * 1024 * 1024) THEN ROUND((CAST(sum(size) AS REAL) / (1024 * 1024 * 1024 * 1024)),2) || ' TB'
|
197
|
+
END AS size
|
198
|
+
EOS
|
199
|
+
|
178
200
|
@total_hits = db.execute "SELECT count(datetime) from LogLine where #{@filter}"
|
179
201
|
@total_unique_visitors = db.execute "SELECT count(distinct(unique_visitor)) from LogLine where #{@filter}"
|
180
|
-
@total_size = db.execute "SELECT
|
202
|
+
@total_size = db.execute "SELECT #{human_readable_size} from LogLine where #{@filter}"
|
181
203
|
@total_days = (Date.parse(@last_day[0][0]) - Date.parse(@first_day[0][0])).to_i
|
182
204
|
|
183
|
-
@daily_distribution = db.execute "SELECT date(datetime), count(datetime), count(distinct(unique_visitor)),
|
205
|
+
@daily_distribution = db.execute "SELECT date(datetime), count(datetime), count(distinct(unique_visitor)), #{human_readable_size} from LogLine where #{@filter} group by date(datetime)"
|
184
206
|
|
185
|
-
@time_distribution = db.execute "SELECT strftime('%H', datetime), count(datetime), count(distinct(unique_visitor)),
|
207
|
+
@time_distribution = db.execute "SELECT strftime('%H', datetime), count(datetime), count(distinct(unique_visitor)), #{human_readable_size} from LogLine where #{@filter} group by strftime('%H', datetime)"
|
186
208
|
|
187
|
-
@most_requested_pages = db.execute "SELECT path, count(path), count(distinct(unique_visitor)),
|
209
|
+
@most_requested_pages = db.execute "SELECT path, count(path), count(distinct(unique_visitor)), #{human_readable_size} from LogLine where extension == '.html' and #{@filter} group by path order by count(path) desc limit #{options[:limit]}"
|
188
210
|
|
189
|
-
@most_requested_resources = db.execute "SELECT path, count(path), count(distinct(unique_visitor)),
|
211
|
+
@most_requested_resources = db.execute "SELECT path, count(path), count(distinct(unique_visitor)), #{human_readable_size} from LogLine where #{@filter} group by path order by count(path) desc limit #{options[:limit]}"
|
190
212
|
|
191
213
|
@missed_pages = db.execute "SELECT path, count(path), count(distinct(unique_visitor)) from LogLine where status == '404' and extension == '.html' and #{@filter} group by path order by count(path) desc limit #{options[:limit]}"
|
192
214
|
|
@@ -208,13 +230,13 @@ module ApacheLogReport
|
|
208
230
|
[x[0], x[1].map { |y| y[1] }].flatten
|
209
231
|
}
|
210
232
|
|
211
|
-
@browsers = db.execute "SELECT browser, count(browser), count(distinct(unique_visitor)),
|
233
|
+
@browsers = db.execute "SELECT browser, count(browser), count(distinct(unique_visitor)), #{human_readable_size} from LogLine where #{@filter} group by browser order by count(browser) desc"
|
212
234
|
|
213
|
-
@platforms = db.execute "SELECT platform, count(platform), count(distinct(unique_visitor)),
|
235
|
+
@platforms = db.execute "SELECT platform, count(platform), count(distinct(unique_visitor)), #{human_readable_size} from LogLine where #{@filter} group by platform order by count(platform) desc"
|
214
236
|
|
215
|
-
@ips = db.execute "SELECT ip, count(ip), count(distinct(unique_visitor)),
|
237
|
+
@ips = db.execute "SELECT ip, count(ip), count(distinct(unique_visitor)), #{human_readable_size} from LogLine where #{@filter} group by ip order by count(ip) desc limit #{options[:limit]}"
|
216
238
|
|
217
|
-
@referers = db.execute "SELECT referer, count(referer), count(distinct(unique_visitor)),
|
239
|
+
@referers = db.execute "SELECT referer, count(referer), count(distinct(unique_visitor)), #{human_readable_size} from LogLine where #{@filter} group by referer order by count(referer) desc limit #{options[:limit]}"
|
218
240
|
end
|
219
241
|
|
220
242
|
|
@@ -236,7 +258,7 @@ module ApacheLogReport
|
|
236
258
|
end
|
237
259
|
|
238
260
|
def self.emit options = {}, command, log_file, started_at, ended_at, duration
|
239
|
-
@
|
261
|
+
@prefix = options[:prefix]
|
240
262
|
@suffix = options[:suffix]
|
241
263
|
@export = options[:code_export]
|
242
264
|
|
@@ -252,7 +274,7 @@ module ApacheLogReport
|
|
252
274
|
|
253
275
|
| Hits | #{"%10d" % @total_hits[0][0]} |
|
254
276
|
| Unique Visitors | #{"%10d" % @total_unique_visitors[0][0] } |
|
255
|
-
| Tx | #{"%
|
277
|
+
| Tx | #{"%10s" % @total_size[0][0]} |
|
256
278
|
| Days | #{"%10d" % @total_days[0][0] } |
|
257
279
|
|
258
280
|
* Daily Distribution
|
@@ -282,8 +304,8 @@ plot data using 1:2 with linespoints lw 3 lc rgb "#0000AA" pointtype 5 title "Hi
|
|
282
304
|
data using 1:2 with filledcurves below x1 linecolor rgb "#0000AA" notitle axes x1y2, \\
|
283
305
|
data using 1:3 with linespoints lw 3 lc rgb "#AA0000" pointtype 7 title "Visitors", \\
|
284
306
|
data using 1:3 with filledcurves below x1 notitle linecolor rgb "#AA0000", \\
|
285
|
-
data using 1:($3+
|
286
|
-
data using 1:($2+
|
307
|
+
data using 1:($3+0.1*$3):3 with labels notitle textcolor rgb "#AA0000", \\
|
308
|
+
data using 1:($2+0.1*$2):2 with labels notitle textcolor rgb "#0000AA" axes x1y2
|
287
309
|
#+END_SRC
|
288
310
|
|
289
311
|
|
@@ -312,8 +334,8 @@ set style histogram clustered gap 1
|
|
312
334
|
|
313
335
|
plot data using 2:xtic(1) lc rgb "#0000AA" title "Hits", \\
|
314
336
|
data using 3 lc rgb "#AA0000" title "Visitors" axes x1y2, \\
|
315
|
-
data using ($0 - 0.2):($2 +
|
316
|
-
data using ($0 + 0.2):($3 +
|
337
|
+
data using ($0 - 0.2):($2 + 0.1*$2):2 with labels title "" textcolor rgb("#0000AA"), \\
|
338
|
+
data using ($0 + 0.2):($3 + 0.1*$3):3 with labels title "" textcolor rgb("#AA0000") axes x1y2
|
317
339
|
#+END_SRC
|
318
340
|
|
319
341
|
#+BEGIN_SRC gnuplot :var data = time_distribution :results output :exports #{@export} :file #{@prefix}time-traffic#{@suffix}.svg
|
@@ -333,7 +355,7 @@ set style data histograms
|
|
333
355
|
set style histogram clustered gap 1
|
334
356
|
|
335
357
|
plot data using 2:xtic(1) lc rgb "#00AA00" title "Traffic", \\
|
336
|
-
data using ($0):($2 +
|
358
|
+
data using ($0):($2 + 0.1*$2):2 with labels title "" textcolor rgb("#00AA00")
|
337
359
|
#+END_SRC
|
338
360
|
|
339
361
|
* Most Requested Pages
|
@@ -369,7 +391,7 @@ set style fill solid 0.25
|
|
369
391
|
set boxwidth 0.6
|
370
392
|
|
371
393
|
plot data using 2:xtic(1) with boxes lc rgb "#0000AA" title "Hits", \\
|
372
|
-
data using ($0):($2+
|
394
|
+
data using ($0):($2+0.1*$2):2 with labels textcolor rgb "#0000AA"
|
373
395
|
#+END_SRC
|
374
396
|
|
375
397
|
* Daily Statuses
|
@@ -396,9 +418,9 @@ set style histogram clustered gap 1
|
|
396
418
|
plot data using 2:xtic(1) lc rgb "#00AA00" title "2xx", \\
|
397
419
|
data using 3 lc rgb "#0000CC" title "3xx", \\
|
398
420
|
data using 4 lc rgb "#AA0000" title "4xx", \\
|
399
|
-
data using ($0 - 1. / 4):($2 + 0.
|
400
|
-
data using ($0):($3 + 0.
|
401
|
-
data using ($0 + 1. / 4):($4 + 0.
|
421
|
+
data using ($0 - 1. / 4):($2 + 0.1*$2):2 with labels title "" textcolor rgb("#00AA00"), \\
|
422
|
+
data using ($0):($3 + 0.1*$3):3 with labels title "" textcolor rgb("#0000CC"), \\
|
423
|
+
data using ($0 + 1. / 4):($4 + 0.1*$4):4 with labels title "" textcolor rgb("#AA0000")
|
402
424
|
#+END_SRC
|
403
425
|
|
404
426
|
* Browsers
|
@@ -414,7 +436,7 @@ set style fill solid 0.25
|
|
414
436
|
set boxwidth 0.6
|
415
437
|
|
416
438
|
plot data using 2:xtic(1) with boxes lc rgb "#0000AA" title "Hits", \\
|
417
|
-
data using ($0):($2+
|
439
|
+
data using ($0):($2+0.1*$2):2 with labels textcolor rgb "#0000AA"
|
418
440
|
#+END_SRC
|
419
441
|
|
420
442
|
* Platforms
|
@@ -430,7 +452,7 @@ set style fill solid 0.25
|
|
430
452
|
set boxwidth 0.6
|
431
453
|
|
432
454
|
plot data using 2:xtic(1) with boxes lc rgb "#0000AA" title "Hits", \\
|
433
|
-
data using ($0):($2+
|
455
|
+
data using ($0):($2+0.1*$2):2 with labels textcolor rgb "#0000AA"
|
434
456
|
#+END_SRC
|
435
457
|
|
436
458
|
* IPs
|
@@ -462,8 +484,8 @@ set style histogram clustered gap 1
|
|
462
484
|
|
463
485
|
plot data using 2:xtic(1) lc rgb "#AA00AA" title "Hits", \\
|
464
486
|
data using 3 lc rgb "#0AAAA0" title "Visits", \\
|
465
|
-
data using ($0 - 1. / 3):($2 +
|
466
|
-
data using ($0 + 1. / 3):($3 +
|
487
|
+
data using ($0 - 1. / 3):($2 + 0.1*$2):2 with labels title "" textcolor rgb("#AA00AA"), \\
|
488
|
+
data using ($0 + 1. / 3):($3 + 0.1*$3):3 with labels title "" textcolor rgb("#0AAAA0")
|
467
489
|
#+END_SRC
|
468
490
|
|
469
491
|
* Command Invocation and Performance
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: apache_log_report
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Adolfo Villafiorita
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2021-02-26 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: apache_log-parser
|
@@ -77,6 +77,7 @@ files:
|
|
77
77
|
- ".gitignore"
|
78
78
|
- CHANGELOG.org
|
79
79
|
- Gemfile
|
80
|
+
- Gemfile.lock
|
80
81
|
- LICENSE.txt
|
81
82
|
- README.org
|
82
83
|
- Rakefile
|
@@ -109,7 +110,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
109
110
|
- !ruby/object:Gem::Version
|
110
111
|
version: '0'
|
111
112
|
requirements: []
|
112
|
-
rubygems_version: 3.
|
113
|
+
rubygems_version: 3.0.3
|
113
114
|
signing_key:
|
114
115
|
specification_version: 4
|
115
116
|
summary: Generate a request report in OrgMode format from an Apache log file.
|