apache_log_report 0.9.4 → 0.9.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.
- checksums.yaml +4 -4
- data/Gemfile.lock +29 -0
- data/README.org +7 -0
- data/exe/apache_log_report +0 -0
- data/lib/apache_log_report.rb +47 -25
- 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: 0cfcc34ca8741250adff411009618f4a359c4c59606a911a924416650fa352e7
|
4
|
+
data.tar.gz: 4f366f09084266e0112f597aac8be998ff47df8ef50d8fd01b1c26361dc889b9
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ddee7b7b3fd56327c3409f0a6de2778b83a0e67d743d300f00259ba314159d1cb62315f388fc0136052895903c7e6df47e08ba59b036db23f0722fc99e5f7b6d
|
7
|
+
data.tar.gz: 0e857dbb34cd66057a401016afcd457c19c995c7aff66a87d4db230569b67a091c19d5f3446377f1a7ee8f8cda3b70ea0b8b4753bd7aea3beadc07810cf2d54b
|
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/README.org
CHANGED
@@ -12,6 +12,13 @@
|
|
12
12
|
|
13
13
|
See the [[file:CHANGELOG.org][CHANGELOG]] file.
|
14
14
|
|
15
|
+
* Todo
|
16
|
+
|
17
|
+
** TODO Version information from command line and in reports
|
18
|
+
** TODO Refactor code from one giant class to more manageable chunkes
|
19
|
+
** TODO Move performance stats var to class (to isolate vars)
|
20
|
+
** TODO Check total number of days (which is not working, now)
|
21
|
+
|
15
22
|
* Compatibility
|
16
23
|
|
17
24
|
|
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
|
@@ -393,12 +415,12 @@ set boxwidth 0.6
|
|
393
415
|
set style data histograms
|
394
416
|
set style histogram clustered gap 1
|
395
417
|
|
396
|
-
plot data using 2:xtic(1) lc rgb "#
|
418
|
+
plot data using 2:xtic(1) lc rgb "#00AA00" title "2xx", \\
|
397
419
|
data using 3 lc rgb "#0000CC" title "3xx", \\
|
398
|
-
data using 4 lc rgb "#
|
399
|
-
data using ($0 - 1. / 4):($2 + 0.5):2 with labels title "" textcolor rgb("#
|
420
|
+
data using 4 lc rgb "#AA0000" title "4xx", \\
|
421
|
+
data using ($0 - 1. / 4):($2 + 0.5):2 with labels title "" textcolor rgb("#00AA00"), \\
|
400
422
|
data using ($0):($3 + 0.5):3 with labels title "" textcolor rgb("#0000CC"), \\
|
401
|
-
data using ($0 + 1. / 4):($4 + 0.5):4 with labels title "" textcolor rgb("#
|
423
|
+
data using ($0 + 1. / 4):($4 + 0.5):4 with labels title "" textcolor rgb("#AA0000")
|
402
424
|
#+END_SRC
|
403
425
|
|
404
426
|
* Browsers
|
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.9.
|
4
|
+
version: 0.9.9
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Adolfo Villafiorita
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2020-
|
11
|
+
date: 2020-10-12 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.
|