log_sense 1.2.3 → 1.3.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 793e7473effe036178ca643379f44eea040d15582aa10a26af0874f2cc0cd76b
4
- data.tar.gz: '0950e85c8e60b3a7bdb815db354d0e156a52066405ac85c47996530875dd2eba'
3
+ metadata.gz: a8250028b7a7038e07f2bd9fa069bfdf0ab1815a8711a0b6971a91030d529882
4
+ data.tar.gz: 236e1ba2c3ada9272f1e7eaa649cd1664776da933a90e41b6e70fffbbe002043
5
5
  SHA512:
6
- metadata.gz: 0730de44eb8da2fb80a2f707b66e59d367bed09e71e19cb1a19d2044181ad5deb254f8461c375d2a45230408e5eb8c9aa248f5361c051f41e4406b3ebfdc400a
7
- data.tar.gz: 45fb244c7d0fdc1edbbb75305c943b37a079e48f5e12ed9096c6c64e0e554051a56551bbe74b47f4edf40bd1738ea90a9357bd11d5e74f3395a4d87e7fd9dda9
6
+ metadata.gz: 72b6284cd6f09ebf16c4fe34fc7098da44e993a2946fb09f72ccaa7898eb462b9fcb49ce2e37e06b206a3f00650f8a033ec034ffeeab3afe587b6b607d079302
7
+ data.tar.gz: 6b96590430caa4e9717180c1812b0227b661f1fef4c99e10515da6da8acbe8fd596b91a9e0d536eff2ce525ba1fc01f4819a5c3f649bb59f4c77754edbbd5b0c
data/CHANGELOG.org CHANGED
@@ -2,13 +2,20 @@
2
2
  #+AUTHOR: Adolfo Villafiorita
3
3
  #+STARTUP: showall
4
4
 
5
- * Changes in log_sense 1.1.2
6
- <2021-12-17 Fri>
5
+ * 1.3.2
7
6
 
8
- - Added Rails Log HTML output
7
+ - [Code] HTML reports now generate JSON data which is shared between
8
+ DataTable and Vega Light: this should reduce page size and loading
9
+ time of HTML reports
10
+ - [Doc] Added screenshot and fixed some text
11
+ - [Doc] Fixes requirements on Ruby version
9
12
 
10
- * Changes in log_sense 1.1.1 and earlier
11
- <2021-12-17 Fri>
13
+ * 1.3.1
12
14
 
13
- - In the Git commit messages (not very informative, I am afraid).
15
+ - [Code] Strengthened parsing of Apache Logs (added WebDav and other methods)
14
16
 
17
+ * 1.3.0
18
+
19
+ - [Code] Removed dependency from =apache_log-parser= and implemented our own
20
+ parser for the combined format.
21
+
data/Gemfile.lock CHANGED
@@ -1,8 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- log_sense (1.0.7)
5
- apache_log-parser
4
+ log_sense (1.3.1)
6
5
  browser
7
6
  ipaddr
8
7
  iso_country_codes
@@ -12,7 +11,6 @@ PATH
12
11
  GEM
13
12
  remote: https://rubygems.org/
14
13
  specs:
15
- apache_log-parser (3.1.2)
16
14
  browser (5.3.1)
17
15
  byebug (11.1.3)
18
16
  ipaddr (1.2.3)
data/README.org CHANGED
@@ -4,24 +4,10 @@
4
4
 
5
5
  * Introduction
6
6
 
7
- LogSense generates reports and statistics from Apache web logs in the
8
- =combined= format and from Rails logs. Written in Ruby, it runs from
9
- the command line, it is fast, and it can be installed on any system
10
- which supports Ruby.
11
-
12
- LogSense moves along the lines of tools such as [[https://goaccess.io/][GoAccess]]
13
- and [[https://umami.is/][Umami]], focusing on privacy and data-ownership: the data
14
- generated by LogSense is stored on your computer and owned by
15
- you (like it should be).
16
-
17
- LogSense is also inspired by *static websites generators*: statistics
18
- are generated from the command line and accessed as static HTML files.
19
- By generating static resources, LogSense significantly reduces the
20
- attack surface of your webserver and installation headaches.
21
-
22
- We have, for instance, a cron job running on our servers, generating
23
- statistics at night. The generated files are then made available on a
24
- private area on the web.
7
+ LogSense generates reports and statistics from Apache and Ruby on
8
+ Rails logs. Written in Ruby, it runs from the command line, it is
9
+ fast, and it can be installed on any system with a relatively recent
10
+ version of Ruby. We tested on Ruby 2.6.9, Ruby 3.0.x and later.
25
11
 
26
12
  LogSense reports the following data:
27
13
 
@@ -40,7 +26,27 @@ LogSense reports the following data:
40
26
  Filters from the command line allow to analyze specific periods and
41
27
  distinguish traffic generated by self polls and crawlers.
42
28
 
43
- LogSense generates HTML, txt (Org Mode), and SQLite outputs.
29
+ LogSense generates HTML, txt, and SQLite outputs.
30
+
31
+ And, of course, the compulsory screenshot:
32
+
33
+ #+ATTR_HTML: :width 80%
34
+ [[file:./apache-screenshot.png]]
35
+
36
+ * Motivation
37
+
38
+ LogSense moves along the lines of tools such as [[https://goaccess.io/][GoAccess]] (which
39
+ strongly inspired the development of Log Sense) and [[https://umami.is/][Umami]], focusing on
40
+ *privacy* and *data-ownership*: the data generated by LogSense is
41
+ stored on your computer and owned by you (like it should be)[fn:1].
42
+
43
+ LogSense is also inspired by *static websites generators*: statistics
44
+ are generated from the command line and accessed as static HTML files.
45
+ LogSense thus significantly reduces the attack surface of your
46
+ web server and installation headaches. We have, for instance, a cron
47
+ job running on our servers, generating statistics at night. The
48
+ generated files are then made available on a private area on the web.
49
+
44
50
 
45
51
  * Installation
46
52
 
@@ -70,48 +76,60 @@ LogSense generates HTML, txt (Org Mode), and SQLite outputs.
70
76
  -v, --version Prints version information
71
77
  -h, --help Prints this help
72
78
 
73
- This is version 1.1.1
79
+ This is version 1.3.1
74
80
 
75
81
  Output formats
76
- apache parsing can produce the following outputs:
77
- - sqlite
78
- - html
79
82
  rails parsing can produce the following outputs:
80
83
  - sqlite
81
84
  - txt
85
+ - html
86
+ apache parsing can produce the following outputs:
87
+ - sqlite
88
+ - html
82
89
  #+end_example
83
90
 
91
+ Examples:
92
+
93
+ #+begin_example sh
94
+ log_sense -f apache -i access.log -t txt > access-data.txt
95
+ log_sense -f rails -i production.log -t html -o performance.txt
96
+ #+end_example
97
+
84
98
  * Change Log
85
99
 
86
100
  See the [[file:CHANGELOG.org][CHANGELOG]] file.
87
101
 
88
102
  * Compatibility
89
103
 
90
- LogSense should run on any system on which Ruby runs.
104
+ LogSense should run on any system on which a recent version of Ruby
105
+ runs. We tested it with Ruby 2.6.9 and Ruby 3.x.x.
91
106
 
92
107
  Concerning the outputs:
93
108
 
94
- - The HTML report uses [[https://picturepan2.github.io/spectre/][Spectre.css]] and (will use) [[https://vega.github.io/vega-lite/][Vega Light]], which
95
- are downloaded from a CDN
96
- - The textual format is compatible with Org Mode and can be further
97
- processed to any format Org Mode can be exported to (including HTML
98
- and PDF),
109
+ - HTML reports use [[https://get.foundation/][Zurb Foundation]], [[https://www.datatables.net/][Data Tables]], and [[https://vega.github.io/vega-lite/][Vega Light]], which
110
+ are all downloaded from a CDN
111
+ - The textual format is compatible with [[https://orgmode.org/][Org Mode]] and can be further
112
+ processed to any format [[https://orgmode.org/][Org Mode]] can be exported to (including HTML
113
+ and PDF)
99
114
 
100
115
  * Author and Contributors
101
116
 
102
- [[http://ict4g.net/adolfo][Adolfo Villafiorita]].
117
+ [[https://shair.tech][Shair.Tech]]
103
118
 
104
119
  * Known Bugs
105
120
 
106
- Some known bugs and an unknown number of unknown bugs.
107
-
121
+ No known bugs; an unknown number of unknown bugs.
108
122
  (See the open issues for the known bugs.)
109
123
 
110
124
  * License
111
125
 
112
126
  Distributed under the terms of the [[http://opensource.org/licenses/MIT][MIT License]].
113
127
 
114
- Geolocation is made possible by the DB-IP.com IP to City database, released under
115
- a CC license.
116
-
128
+ Geolocation is made possible by the DB-IP.com IP to City database,
129
+ released under a CC license.
117
130
 
131
+ [fn:1] There is a small catch: CSS and JavaScript for layout and plots
132
+ are downloaded from a CDN. Technically, thus, if you generate HTML
133
+ reports and open them, a request is performed and the CDN might keep a
134
+ track (see [[https://en.wikipedia.org/wiki/Content_delivery_network#Security_and_privacy][CDN Security and Privacy on Wikipedia]] for more details).
135
+ Textual reports don't have this issue.
Binary file
@@ -0,0 +1,56 @@
1
+ module LogSense
2
+ class ApacheLogLineParser
3
+ # parses a query and makes it into an expression which can be evaluated
4
+ # LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\"" combined
5
+ #
6
+ # %h: IP
7
+ # %l: ident or -
8
+ # %u: userid or -
9
+ # %t: [10/Oct/2000:13:55:36 -0700]
10
+ # day = 2*digit
11
+ # month = 3*letter
12
+ # year = 4*digit
13
+ # hour = 2*digit
14
+ # minute = 2*digit
15
+ # second = 2*digit
16
+ # zone = (`+' | `-') 4*digit
17
+ # %r: GET /apache_pb.gif HTTP/1.0
18
+ # %{User-agent}: "
19
+ #
20
+ # 116.179.32.16 - - [19/Dec/2021:22:35:11 +0100] "GET / HTTP/1.1" 200 135 "-" "Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)"
21
+
22
+ DAY = /[0-9]{2}/
23
+ MONTH = /[A-Za-z]{3}/
24
+ YEAR = /[0-9]{4}/
25
+ TIMEC = /[0-9]{2}/
26
+ TIMEZONE = /(\+|-)[0-9]{4}/
27
+
28
+ IP = /(?<ip>[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}|::1)/
29
+ IDENT = /(?<ident>[^ ]+|-)/
30
+ USERID = /(?<userid>[^ ]+|-)/
31
+
32
+ TIMESTAMP = /(?<date>#{DAY}\/#{MONTH}\/#{YEAR}):(?<time>#{TIMEC}:#{TIMEC}:#{TIMEC} #{TIMEZONE})/
33
+
34
+ HTTP_METHODS=/GET|HEAD|POST|PUT|DELETE|CONNECT|OPTIONS|TRACE|PATCH/
35
+ WEBDAV_METHODS=/COPY|LOCK|MKCOL|MOVE|PROPFIND|PROPPATCH|UNLOCK/
36
+ OTHER_METHODS=/SEARCH|REPORT/
37
+ METHOD=/(?<method>#{HTTP_METHODS}|#{WEBDAV_METHODS}|#{OTHER_METHODS})/
38
+ PROTOCOL=/(?<protocol>HTTP\/[0-9]\.[0-9])/
39
+ URL=/(?<url>[^ ]+)/
40
+ REFERER=/(?<referer>[^ ]+)/
41
+ RETURN_CODE=/(?<status>[1-5][0-9][0-9])/
42
+ SIZE=/(?<size>[0-9]+|-)/
43
+
44
+ USER_AGENT = /(?<user_agent>[^"]+)/
45
+
46
+ attr_reader :format
47
+
48
+ def initialize
49
+ @format = /#{IP} #{IDENT} #{USERID} \[#{TIMESTAMP}\] "#{METHOD} #{URL} #{PROTOCOL}" #{RETURN_CODE} #{SIZE} "#{REFERER}" "#{USER_AGENT}"/
50
+ end
51
+
52
+ def parse line
53
+ hash = @format.match(line) || raise("Apache LogLine Parser Error: Could not parse #{line}")
54
+ end
55
+ end
56
+ end
@@ -1,4 +1,3 @@
1
- require 'apache_log/parser'
2
1
  require 'sqlite3'
3
2
  require 'browser'
4
3
 
@@ -50,21 +49,20 @@ module LogSense
50
49
  platform_version)
51
50
  values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)')
52
51
 
53
- parser = ApacheLog::Parser.new(options[:format] || 'combined')
52
+ parser = ApacheLogLineParser.new
54
53
 
55
54
  content.each do |line|
56
55
  begin
57
56
  hash = parser.parse line
58
-
59
57
  ua = Browser.new(hash[:user_agent], accept_language: "en-us")
60
58
  ins.execute(
61
- hash[:datetime].iso8601,
62
- hash[:remote_host],
63
- hash[:user],
64
- hash[:datetime].strftime("%Y-%m-%d") + " " + hash[:remote_host] + " " + hash[:user_agent],
65
- hash[:request][:method],
66
- hash[:request][:path],
67
- (hash[:request][:path] ? File.extname(hash[:request][:path]) : ""),
59
+ DateTime.parse("#{hash[:date]}T#{hash[:time]}").iso8601,
60
+ hash[:ip],
61
+ hash[:userid],
62
+ unique_visitor_id(hash),
63
+ hash[:method],
64
+ hash[:url],
65
+ (hash[:url] ? File.extname(hash[:url]) : ""),
68
66
  hash[:status],
69
67
  hash[:size].to_i,
70
68
  hash[:referer],
@@ -75,13 +73,17 @@ module LogSense
75
73
  (ua.platform.name || ""),
76
74
  (ua.platform.version || "")
77
75
  )
78
- rescue
79
- STDERR.puts "Apache Log parser error: could not parse #{line}"
76
+ rescue StandardError => e
77
+ STDERR.puts e.message
80
78
  end
81
79
  end
82
80
 
83
81
  db
84
82
  end
85
83
 
84
+ def self.unique_visitor_id hash
85
+ "#{hash[:date]} #{hash[:ip]} #{hash[:user_agent]}"
86
+ end
87
+
86
88
  end
87
89
  end
@@ -4,22 +4,26 @@ def slugify string
4
4
  end
5
5
  %>
6
6
 
7
- <table id="<%= slugify(title || "") %>-table" class="table unstriped data-table <%= slugify(title || "") %>">
7
+ <table id="table-<%= index %>" class="table unstriped">
8
8
  <thead>
9
9
  <tr>
10
- <% header.each do |heading| %>
11
- <th class="<%= slugify(heading) %>"><%= heading %></th>
10
+ <% report[:header].each do |header| %>
11
+ <th><%= header %></th>
12
12
  <% end %>
13
13
  </tr>
14
14
  </thead>
15
15
  <tbody>
16
- <% rows.each do |row| %>
17
- <tr>
18
- <% row.each_with_index do |cell, i| %>
19
- <td class="<%= slugify (header[i] || "") %>"><%= cell %></td>
20
- <% end %>
21
- </tr>
22
- <% end %>
23
16
  </tbody>
24
17
  </table>
25
-
18
+ <script>
19
+ $(document).ready(function(){
20
+ $('#table-<%= index %>').dataTable({
21
+ data: data_<%= index %>,
22
+ columns: [
23
+ <% report[:header].each do |header| %>
24
+ { data: '<%= header %>', className: '<%= slugify(header) %>' },
25
+ <% end %>
26
+ ]
27
+ });
28
+ });
29
+ </script>
@@ -0,0 +1,12 @@
1
+ <script>
2
+ /* this is used both by Vega and DataTable */
3
+ data_<%= index %> = [
4
+ <% report[:rows].each do |row| %>
5
+ {
6
+ <% report[:header].each_with_index do |h, i| %>
7
+ "<%= h %>": <%= (row[i].class == Integer or row[i].class == Float) ? row[i] : "\"#{row[i]}\"" %>,
8
+ <% end %>
9
+ },
10
+ <% end %>
11
+ ]
12
+ </script>
@@ -17,6 +17,8 @@
17
17
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/foundation-sites@6.7.4/dist/css/foundation.min.css">
18
18
  <link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/v/zf/dt-1.11.3/datatables.min.css"/>
19
19
 
20
+ <script type="text/javascript" src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
21
+ <script type="text/javascript" src="https://cdn.datatables.net/v/zf/dt-1.11.3/datatables.min.js"></script>
20
22
 
21
23
  <script src="https://cdn.jsdelivr.net/npm/vega@5.21.0"></script>
22
24
  <script src="https://cdn.jsdelivr.net/npm/vega-lite@5.2.0"></script>
@@ -29,14 +31,14 @@
29
31
  }
30
32
 
31
33
  #offCanvas {
32
- color: white;
33
- background: #0D0630;
34
+ color: #DEDEDE;
35
+ background: #1C1C1C;
34
36
  border-right: none;
35
37
  box-shadow: none;
36
38
  padding: 0.5rem;
37
39
  }
38
40
  #offCanvas a {
39
- color: #E6F9AF;
41
+ color: #FFFFFF;
40
42
  }
41
43
 
42
44
  .contents-button {
@@ -69,7 +71,7 @@
69
71
 
70
72
  .card-divider {
71
73
  padding: 0.2rem 0.4rem 0.2rem 0.4rem;
72
- background: #0d0630;
74
+ background: #1C1C1C;
73
75
  color: white;
74
76
  }
75
77
 
@@ -426,7 +428,7 @@
426
428
  <%= report[:title] %>
427
429
  </h2>
428
430
  </div>
429
-
431
+ <%= render "report_data.html.erb", report: report, index: index %>
430
432
  <% if report[:vega_spec] %>
431
433
  <div id="<%= "plot-#{index}" %>"></div>
432
434
  <script>
@@ -436,22 +438,15 @@
436
438
  width: "container",
437
439
  description: "<%= report[:title] %>",
438
440
  data: {
439
- values: [
440
- <% report[:rows].each do |row| %>
441
- {
442
- <% report[:header].each_with_index do |h, i| %>
443
- "<%= h %>": <%= (row[i].class == Integer or row[i].class == Float) ? row[i] : "\"#{row[i]}\"" %>,
444
- <% end %>
445
- },
446
- <% end %>
447
- ]
441
+ values: data_<%= index %>
448
442
  },
449
443
  });
450
444
  vegaEmbed('#<%= "plot-#{index}"%>', plot_spec_<%= index %>);
451
445
  </script>
452
446
  <% end %>
453
- <div class="card-section">
454
- <%= render "output_table.html.erb", report %>
447
+
448
+ <div class="card-section">
449
+ <%= render "output_table.html.erb", report: report, index: index %>
455
450
  </div>
456
451
  </article>
457
452
  <% end %>
@@ -569,9 +564,7 @@
569
564
  </section>
570
565
  </div>
571
566
 
572
- <script type="text/javascript" src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
573
567
  <script type="text/javascript" src="js/vendor/what-input.js"></script>
574
- <script type="text/javascript" src="https://cdn.datatables.net/v/zf/dt-1.11.3/datatables.min.js"></script>
575
568
  <script src="https://cdn.jsdelivr.net/npm/vega@5"></script>
576
569
  <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/foundation-sites@6.7.4/dist/js/foundation.min.js" crossorigin="anonymous"></script>
577
570
  <script>
@@ -17,6 +17,8 @@
17
17
  <link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/foundation-sites@6.7.4/dist/css/foundation.min.css">
18
18
  <link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/v/zf/dt-1.11.3/datatables.min.css"/>
19
19
 
20
+ <script type="text/javascript" src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
21
+ <script type="text/javascript" src="https://cdn.datatables.net/v/zf/dt-1.11.3/datatables.min.js"></script>
20
22
 
21
23
  <script src="https://cdn.jsdelivr.net/npm/vega@5.21.0"></script>
22
24
  <script src="https://cdn.jsdelivr.net/npm/vega-lite@5.2.0"></script>
@@ -29,14 +31,14 @@
29
31
  }
30
32
 
31
33
  #offCanvas {
32
- color: white;
33
- background: #0D0630;
34
+ color: #CECECE;
35
+ background: #BD000D;
34
36
  border-right: none;
35
37
  box-shadow: none;
36
38
  padding: 0.5rem;
37
39
  }
38
40
  #offCanvas a {
39
- color: #E6F9AF;
41
+ color: #FFFFFF;
40
42
  }
41
43
 
42
44
  .contents-button {
@@ -341,7 +343,7 @@
341
343
  <%= report[:title] %>
342
344
  </h2>
343
345
  </div>
344
-
346
+ <%= render "report_data.html.erb", report: report, index: index %>
345
347
  <% if report[:vega_spec] %>
346
348
  <div id="<%= "plot-#{index}" %>"></div>
347
349
  <script>
@@ -351,22 +353,14 @@
351
353
  width: "container",
352
354
  description: "<%= report[:title] %>",
353
355
  data: {
354
- values: [
355
- <% report[:rows].each do |row| %>
356
- {
357
- <% report[:header].each_with_index do |h, i| %>
358
- "<%= h %>": <%= (row[i].class == Integer or row[i].class == Float) ? row[i] : "\"#{row[i]}\"" %>,
359
- <% end %>
360
- },
361
- <% end %>
362
- ]
356
+ values: data_<%= index %>
363
357
  },
364
358
  });
365
359
  vegaEmbed('#<%= "plot-#{index}"%>', plot_spec_<%= index %>);
366
360
  </script>
367
361
  <% end %>
368
362
  <div class="card-section">
369
- <%= render "output_table.html.erb", report %>
363
+ <%= render "output_table.html.erb", report: report, index: index %>
370
364
  </div>
371
365
  </article>
372
366
  <% end %>
@@ -392,9 +386,7 @@
392
386
  </section>
393
387
  </div>
394
388
 
395
- <script type="text/javascript" src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
396
389
  <script type="text/javascript" src="js/vendor/what-input.js"></script>
397
- <script type="text/javascript" src="https://cdn.datatables.net/v/zf/dt-1.11.3/datatables.min.js"></script>
398
390
  <script src="https://cdn.jsdelivr.net/npm/vega@5"></script>
399
391
  <script type="text/javascript" src="https://cdn.jsdelivr.net/npm/foundation-sites@6.7.4/dist/js/foundation.min.js" crossorigin="anonymous"></script>
400
392
  <script>
@@ -1,3 +1,3 @@
1
1
  module LogSense
2
- VERSION = "1.2.3"
2
+ VERSION = "1.3.4"
3
3
  end
data/lib/log_sense.rb CHANGED
@@ -1,5 +1,6 @@
1
1
  require 'log_sense/version'
2
2
  require 'log_sense/options_parser'
3
+ require 'log_sense/apache_log_line_parser'
3
4
  require 'log_sense/apache_log_parser'
4
5
  require 'log_sense/apache_data_cruncher'
5
6
  require 'log_sense/rails_log_parser'
data/log_sense.gemspec CHANGED
@@ -1,39 +1,38 @@
1
1
  require_relative 'lib/log_sense/version'
2
2
 
3
3
  Gem::Specification.new do |spec|
4
- spec.name = "log_sense"
4
+ spec.name = 'log_sense'
5
5
  spec.version = LogSense::VERSION
6
- spec.authors = ["Adolfo Villafiorita"]
7
- spec.email = ["adolfo.villafiorita@ict4g.net"]
6
+ spec.authors = ['Adolfo Fibrillation']
7
+ spec.email = ['adolfo@shair.tech']
8
8
 
9
- spec.summary = %q{Generate analytics from an Apache and Rails log file.}
10
- spec.description = %q{Generate analystics in HTML, txt, and SQLite format from an Apache and Rails log files.}
11
- spec.homepage = "https://www.ict4g.net/gitea/adolfo/log_sense"
12
- spec.license = "MIT"
13
- spec.required_ruby_version = Gem::Requirement.new(">= 2.3.0")
9
+ spec.summary = %q{Generate analytics for Apache and Rails log file.}
10
+ spec.description = %q{Generate analytics in HTML, txt, and SQLite format for Apache and Rails log files.}
11
+ spec.homepage = 'https://github.com/shair-tech/log_sense/log_sense'
12
+ spec.license = 'MIT'
13
+ spec.required_ruby_version = Gem::Requirement.new('>= 2.6.9')
14
14
 
15
- spec.metadata["allowed_push_host"] = "https://rubygems.org/"
15
+ spec.metadata['allowed_push_host'] = 'https://rubygems.org/'
16
16
 
17
- spec.metadata["homepage_uri"] = spec.homepage
18
- spec.metadata["source_code_uri"] = "https://www.ict4g.net/gitea/adolfo/log_sense"
19
- spec.metadata["changelog_uri"] = "https://www.ict4g.net/gitea/adolfo/log_sense/CHANGELOG.org"
17
+ spec.metadata['homepage_uri'] = spec.homepage
18
+ spec.metadata['source_code_uri'] = 'https://github.com/shair-tech/log_sense/log_sense'
19
+ spec.metadata['changelog_uri'] = 'https://github.com/shair-tech/log_sense/blob/main/CHANGELOG.org'
20
20
 
21
21
  # Specify which files should be added to the gem when it is released.
22
22
  # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
23
23
  spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
24
24
  `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
25
25
  end
26
- spec.bindir = "exe"
26
+ spec.bindir = 'exe'
27
27
  spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
28
- spec.require_paths = ["lib"]
28
+ spec.require_paths = ['lib']
29
29
 
30
- spec.add_dependency "apache_log-parser"
31
- spec.add_dependency "browser"
32
- spec.add_dependency "ipaddr"
33
- spec.add_dependency "iso_country_codes"
34
- spec.add_dependency "sqlite3"
35
- spec.add_dependency "terminal-table"
30
+ spec.add_dependency 'browser'
31
+ spec.add_dependency 'ipaddr'
32
+ spec.add_dependency 'iso_country_codes'
33
+ spec.add_dependency 'sqlite3'
34
+ spec.add_dependency 'terminal-table'
36
35
 
37
36
  spec.add_development_dependency 'byebug'
38
- spec.add_development_dependency "minitest"
37
+ spec.add_development_dependency 'minitest'
39
38
  end
metadata CHANGED
@@ -1,29 +1,15 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: log_sense
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.2.3
4
+ version: 1.3.4
5
5
  platform: ruby
6
6
  authors:
7
- - Adolfo Villafiorita
7
+ - Adolfo Fibrillation
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-12-22 00:00:00.000000000 Z
11
+ date: 2022-01-12 00:00:00.000000000 Z
12
12
  dependencies:
13
- - !ruby/object:Gem::Dependency
14
- name: apache_log-parser
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - ">="
18
- - !ruby/object:Gem::Version
19
- version: '0'
20
- type: :runtime
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - ">="
25
- - !ruby/object:Gem::Version
26
- version: '0'
27
13
  - !ruby/object:Gem::Dependency
28
14
  name: browser
29
15
  requirement: !ruby/object:Gem::Requirement
@@ -122,10 +108,10 @@ dependencies:
122
108
  - - ">="
123
109
  - !ruby/object:Gem::Version
124
110
  version: '0'
125
- description: Generate analystics in HTML, txt, and SQLite format from an Apache and
126
- Rails log files.
111
+ description: Generate analytics in HTML, txt, and SQLite format for Apache and Rails
112
+ log files.
127
113
  email:
128
- - adolfo.villafiorita@ict4g.net
114
+ - adolfo@shair.tech
129
115
  executables:
130
116
  - log_sense
131
117
  extensions: []
@@ -138,12 +124,14 @@ files:
138
124
  - LICENSE.txt
139
125
  - README.org
140
126
  - Rakefile
127
+ - apache-screenshot.png
141
128
  - bin/console
142
129
  - bin/setup
143
130
  - exe/log_sense
144
131
  - ip_locations/dbip-country-lite.sqlite3
145
132
  - lib/log_sense.rb
146
133
  - lib/log_sense/apache_data_cruncher.rb
134
+ - lib/log_sense/apache_log_line_parser.rb
147
135
  - lib/log_sense/apache_log_parser.rb
148
136
  - lib/log_sense/emitter.rb
149
137
  - lib/log_sense/ip_locator.rb
@@ -156,6 +144,7 @@ files:
156
144
  - lib/log_sense/templates/_output_table.html.erb
157
145
  - lib/log_sense/templates/_performance.html.erb
158
146
  - lib/log_sense/templates/_performance.txt.erb
147
+ - lib/log_sense/templates/_report_data.html.erb
159
148
  - lib/log_sense/templates/_summary.html.erb
160
149
  - lib/log_sense/templates/_summary.txt.erb
161
150
  - lib/log_sense/templates/apache.html.erb
@@ -166,14 +155,14 @@ files:
166
155
  - sample_logs/empty_log.log
167
156
  - sample_logs/safety-critical_org.log
168
157
  - sample_logs/spmbook_com.log
169
- homepage: https://www.ict4g.net/gitea/adolfo/log_sense
158
+ homepage: https://github.com/shair-tech/log_sense/log_sense
170
159
  licenses:
171
160
  - MIT
172
161
  metadata:
173
162
  allowed_push_host: https://rubygems.org/
174
- homepage_uri: https://www.ict4g.net/gitea/adolfo/log_sense
175
- source_code_uri: https://www.ict4g.net/gitea/adolfo/log_sense
176
- changelog_uri: https://www.ict4g.net/gitea/adolfo/log_sense/CHANGELOG.org
163
+ homepage_uri: https://github.com/shair-tech/log_sense/log_sense
164
+ source_code_uri: https://github.com/shair-tech/log_sense/log_sense
165
+ changelog_uri: https://github.com/shair-tech/log_sense/blob/main/CHANGELOG.org
177
166
  post_install_message:
178
167
  rdoc_options: []
179
168
  require_paths:
@@ -182,15 +171,15 @@ required_ruby_version: !ruby/object:Gem::Requirement
182
171
  requirements:
183
172
  - - ">="
184
173
  - !ruby/object:Gem::Version
185
- version: 2.3.0
174
+ version: 2.6.9
186
175
  required_rubygems_version: !ruby/object:Gem::Requirement
187
176
  requirements:
188
177
  - - ">="
189
178
  - !ruby/object:Gem::Version
190
179
  version: '0'
191
180
  requirements: []
192
- rubygems_version: 3.2.32
181
+ rubygems_version: 3.0.3.1
193
182
  signing_key:
194
183
  specification_version: 4
195
- summary: Generate analytics from an Apache and Rails log file.
184
+ summary: Generate analytics for Apache and Rails log file.
196
185
  test_files: []