log_sense 1.5.0 → 1.5.1
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/CHANGELOG.org +9 -2
- data/README.org +2 -1
- data/exe/log_sense +10 -3
- data/lib/log_sense/emitter.rb +17 -14
- data/lib/log_sense/options_parser.rb +5 -0
- data/lib/log_sense/templates/_command_invocation.html.erb +4 -0
- data/lib/log_sense/templates/_command_invocation.txt.erb +1 -0
- data/lib/log_sense/templates/_navigation.html.erb +2 -1
- data/lib/log_sense/templates/_stylesheet.css +144 -0
- data/lib/log_sense/templates/apache.html.erb +45 -190
- data/lib/log_sense/templates/rails.html.erb +49 -185
- data/lib/log_sense/version.rb +1 -1
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1f20a0d2041df1f2414bd0015fff27764c28a89dfd2d45fdb275141638bc5784
|
4
|
+
data.tar.gz: 14426b7383fe9b0077c2852f177545384a369f35489aa5d95372c20cbe19732d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9defcff35a5b3802d7d1a7db596a30aa01e28d3b9d784619de5f61713a587e427ccce76fcfcd478e946a0822af8d0822b23bad6392c2a71690ccd07250d5cfb7
|
7
|
+
data.tar.gz: 8b9143feb4f7508de9b7f60eddacafc4713c064f8bda21ed9ae92de364aa5e94fed36ff6d12f2b2aa108337d92c25868bce21d172397f48ff3c41ed93dc9a2b5
|
data/CHANGELOG.org
CHANGED
@@ -2,15 +2,22 @@
|
|
2
2
|
#+AUTHOR: Adolfo Villafiorita
|
3
3
|
#+STARTUP: showall
|
4
4
|
|
5
|
+
* 1.5.1
|
6
|
+
|
7
|
+
- [User] Option --input-files allows to specify input files
|
8
|
+
in addition to passing filenames to the command line
|
9
|
+
- [User] Minor changes to the layout of HTML reports
|
10
|
+
- [User] Add version number in reports
|
11
|
+
- [Fixed] Duplicated entries in navigation
|
12
|
+
- [Code] Updated and added minitest(s)
|
13
|
+
|
5
14
|
* 1.5.0
|
6
15
|
|
7
16
|
- [User] Present Unique Visits / day as integer
|
8
17
|
- [User] Added Country and Streaks report for rails
|
9
18
|
- [User] Changed Streak report in Apache
|
10
|
-
|
11
19
|
- [Gem] Updated DBIP
|
12
20
|
- [Gem] Updated Bundle
|
13
|
-
|
14
21
|
- [Code] Refactored all reports, so that they are specified
|
15
22
|
in the same way
|
16
23
|
- [Code] Refactor warning message in textual reports
|
data/README.org
CHANGED
@@ -76,6 +76,7 @@ generated files are then made available on a private area on the web.
|
|
76
76
|
Usage: log_sense [options] [logfile ...]
|
77
77
|
--title=TITLE Title to use in the report
|
78
78
|
-f, --input-format=FORMAT Input format (either rails or apache)
|
79
|
+
-i, --input-files=file,file, Input files (can also be passed directly)
|
79
80
|
-t, --output-format=FORMAT Output format: html, org, txt, sqlite. See below for available formats
|
80
81
|
-o, --output-file=OUTPUT_FILE Output file
|
81
82
|
-b, --begin=DATE Consider entries after or on DATE
|
@@ -88,7 +89,7 @@ generated files are then made available on a private area on the web.
|
|
88
89
|
-v, --version Prints version information
|
89
90
|
-h, --help Prints this help
|
90
91
|
|
91
|
-
This is version 1.5.
|
92
|
+
This is version 1.5.1
|
92
93
|
|
93
94
|
Output formats
|
94
95
|
rails parsing can produce the following outputs:
|
data/exe/log_sense
CHANGED
@@ -11,11 +11,18 @@ require 'log_sense.rb'
|
|
11
11
|
@options = LogSense::OptionsParser.parse ARGV
|
12
12
|
@output_file = @options[:output_file]
|
13
13
|
|
14
|
-
|
15
|
-
|
14
|
+
#
|
15
|
+
# Input files can be gotten from an option and from what remains in
|
16
|
+
# ARGV
|
17
|
+
#
|
18
|
+
@input_filenames = @options[:input_filenames] + ARGV
|
19
|
+
@non_existing = @input_filenames.reject { |x| File.exist?(x) }
|
20
|
+
|
21
|
+
unless @non_existing.empty?
|
22
|
+
$stderr.puts "Error: input file(s) '#{@non_existing.join(', ')}' do not exist"
|
16
23
|
exit 1
|
17
24
|
end
|
18
|
-
@input_files =
|
25
|
+
@input_files = @input_filenames.empty? ? [$stdin] : @input_filenames.map { |x| File.open(x, 'r') }
|
19
26
|
|
20
27
|
#
|
21
28
|
# Parse Log and Track Statistics
|
data/lib/log_sense/emitter.rb
CHANGED
@@ -8,7 +8,7 @@ module LogSense
|
|
8
8
|
# Emit Data
|
9
9
|
#
|
10
10
|
module Emitter
|
11
|
-
def self.emit
|
11
|
+
def self.emit(data = {}, options = {})
|
12
12
|
@input_format = options[:input_format] || 'apache'
|
13
13
|
@output_format = options[:output_format] || 'html'
|
14
14
|
|
@@ -78,12 +78,12 @@ module LogSense
|
|
78
78
|
data
|
79
79
|
else
|
80
80
|
table_columns = data[0].size
|
81
|
-
data.map
|
82
|
-
(0..table_columns - 1).each.map
|
81
|
+
data.map do |x|
|
82
|
+
(0..table_columns - 1).each.map do |col|
|
83
83
|
should_shorten = x[col] && x[col].size > width - 3 && to_shorten.include?(col)
|
84
84
|
should_shorten ? "#{x[col][0..(width - 3)]}..." : x[col]
|
85
|
-
|
86
|
-
|
85
|
+
end
|
86
|
+
end
|
87
87
|
end
|
88
88
|
end
|
89
89
|
|
@@ -98,7 +98,8 @@ module LogSense
|
|
98
98
|
# datatable_options: specific options for datatable
|
99
99
|
def self.apache_report_specification(data = {})
|
100
100
|
[
|
101
|
-
{
|
101
|
+
{
|
102
|
+
title: 'Daily Distribution',
|
102
103
|
header: %w[Day DOW Hits Visits Size],
|
103
104
|
column_alignment: %i[left left right right right],
|
104
105
|
rows: data[:daily_distribution],
|
@@ -166,9 +167,9 @@ module LogSense
|
|
166
167
|
'x': {'field': 'Day', 'type': 'temporal'},
|
167
168
|
}
|
168
169
|
}
|
169
|
-
|
170
170
|
},
|
171
|
-
{
|
171
|
+
{
|
172
|
+
title: 'Time Distribution',
|
172
173
|
header: %w[Hour Hits Visits Size],
|
173
174
|
column_alignment: %i[left right right right],
|
174
175
|
rows: data[:time_distribution],
|
@@ -268,7 +269,8 @@ module LogSense
|
|
268
269
|
}
|
269
270
|
}
|
270
271
|
},
|
271
|
-
{
|
272
|
+
{
|
273
|
+
title: 'Browsers',
|
272
274
|
header: %w[Browser Hits Visits Size],
|
273
275
|
column_alignment: %i[left right right right],
|
274
276
|
rows: data[:browsers],
|
@@ -294,7 +296,8 @@ module LogSense
|
|
294
296
|
}
|
295
297
|
}
|
296
298
|
},
|
297
|
-
{
|
299
|
+
{
|
300
|
+
title: 'Platforms',
|
298
301
|
header: %w[Platform Hits Visits Size],
|
299
302
|
column_alignment: %i[left right right right],
|
300
303
|
rows: data[:platforms],
|
@@ -357,8 +360,8 @@ module LogSense
|
|
357
360
|
k[1],
|
358
361
|
v.map { |x| x[2] }.compact.select { |x| x.match(/\.html?$/) }.size,
|
359
362
|
v.map { |x| x[2] }.compact.reject { |x| x.match(/\.html?$/) }.size,
|
360
|
-
v.map { |x| x[2] }.compact.select { |x| x.match(/\.html?$/) }.join('
|
361
|
-
v.map { |x| x[2] }.compact.reject { |x| x.match(/\.html?$/) }.join('
|
363
|
+
v.map { |x| x[2] }.compact.select { |x| x.match(/\.html?$/) }.join(' · '),
|
364
|
+
v.map { |x| x[2] }.compact.reject { |x| x.match(/\.html?$/) }.join(' · ')
|
362
365
|
]
|
363
366
|
end,
|
364
367
|
col: 'small-12 cell'
|
@@ -529,7 +532,7 @@ module LogSense
|
|
529
532
|
[
|
530
533
|
k,
|
531
534
|
v.map { |x| x[1] }.inject(&:+),
|
532
|
-
v.map { |x| x[0] }.join('
|
535
|
+
v.map { |x| x[0] }.join(' · ')
|
533
536
|
]
|
534
537
|
end
|
535
538
|
},
|
@@ -543,7 +546,7 @@ module LogSense
|
|
543
546
|
k[0],
|
544
547
|
k[1],
|
545
548
|
v.size,
|
546
|
-
v.map { |x| x[2] }.join('
|
549
|
+
v.map { |x| x[2] }.join(' · ')
|
547
550
|
]
|
548
551
|
end,
|
549
552
|
col: 'small-12 cell'
|
@@ -22,6 +22,10 @@ module LogSense
|
|
22
22
|
args[:input_format] = n
|
23
23
|
end
|
24
24
|
|
25
|
+
opts.on('-iFORMAT', '--input-files=file,file,', Array, 'Input files (can also be passed directly)') do |n|
|
26
|
+
args[:input_filenames] = n
|
27
|
+
end
|
28
|
+
|
25
29
|
opts.on('-tFORMAT', '--output-format=FORMAT', String, 'Output format: html, org, txt, sqlite. See below for available formats') do |n|
|
26
30
|
args[:output_format] = n
|
27
31
|
end
|
@@ -95,6 +99,7 @@ module LogSense
|
|
95
99
|
opt_parser.parse!(options)
|
96
100
|
|
97
101
|
args[:limit] ||= limit
|
102
|
+
args[:input_filenames] ||= []
|
98
103
|
args[:input_format] ||= 'apache'
|
99
104
|
args[:output_format] ||= 'html'
|
100
105
|
args[:ignore_crawlers] ||= false
|
@@ -14,7 +14,8 @@
|
|
14
14
|
|
15
15
|
<p>
|
16
16
|
Generated by
|
17
|
-
<a href="https://github.com/avillafiorita/log_sense">LogSense</a
|
17
|
+
<a href="https://github.com/avillafiorita/log_sense">LogSense</a><br />
|
18
|
+
version <%= LogSense::VERSION %><br />
|
18
19
|
on <%= DateTime.now.strftime("%Y-%m-%d %H:%M") %>.<br />
|
19
20
|
<a href='https://db-ip.com'>IP Geolocation by DB-IP</a>
|
20
21
|
</p>
|
@@ -0,0 +1,144 @@
|
|
1
|
+
body {
|
2
|
+
font-family: 'Fira Sans', sans-serif;
|
3
|
+
font-size: 12px;
|
4
|
+
}
|
5
|
+
|
6
|
+
#offCanvas {
|
7
|
+
color: #DEDEDE;
|
8
|
+
background: #1C1C1C;
|
9
|
+
border-right: none;
|
10
|
+
box-shadow: none;
|
11
|
+
padding: 0.5rem;
|
12
|
+
|
13
|
+
font-size: 14px;
|
14
|
+
}
|
15
|
+
|
16
|
+
#offCanvas a {
|
17
|
+
color: #FFFFFF;
|
18
|
+
}
|
19
|
+
|
20
|
+
nav {
|
21
|
+
margin-left: 0.5rem;
|
22
|
+
}
|
23
|
+
|
24
|
+
nav h2 {
|
25
|
+
padding-left: 0rem;
|
26
|
+
}
|
27
|
+
|
28
|
+
#toggle-button {
|
29
|
+
font-size: 2rem;
|
30
|
+
margin-left: 1rem;
|
31
|
+
}
|
32
|
+
|
33
|
+
.main-section {
|
34
|
+
}
|
35
|
+
|
36
|
+
h1 {
|
37
|
+
font-family: 'Fira Sans', sans-serif;
|
38
|
+
font-size: 2rem;
|
39
|
+
font-weight: bold;
|
40
|
+
}
|
41
|
+
|
42
|
+
h2 {
|
43
|
+
font-family: 'Fira Sans', sans-serif;
|
44
|
+
font-size: 1.2rem;
|
45
|
+
font-weight: bold;
|
46
|
+
|
47
|
+
color: white;
|
48
|
+
background: #1C1C1C;
|
49
|
+
|
50
|
+
padding: 0.2rem 0.8rem 0.2rem 0.8rem;
|
51
|
+
border-radius: 5px 5px 0px 0px;
|
52
|
+
}
|
53
|
+
|
54
|
+
th {
|
55
|
+
padding: 0.2rem 1.2rem 0.2rem 0.2rem !important
|
56
|
+
}
|
57
|
+
|
58
|
+
td {
|
59
|
+
padding: 0.2rem 1rem 0.2rem 0.2rem !important;
|
60
|
+
}
|
61
|
+
|
62
|
+
.dataTables_wrapper {
|
63
|
+
width: 100%;
|
64
|
+
padding: 0.5rem;
|
65
|
+
}
|
66
|
+
|
67
|
+
article {
|
68
|
+
margin-top: 1rem;
|
69
|
+
border-radius: 5px;
|
70
|
+
}
|
71
|
+
|
72
|
+
|
73
|
+
.plot-canvas {
|
74
|
+
width: 100%;
|
75
|
+
}
|
76
|
+
|
77
|
+
input, select {
|
78
|
+
font-size: 0.8rem !important;
|
79
|
+
height: 1.5rem !important;
|
80
|
+
padding: 0.2rem 0.4rem 0.2rem 0.4rem !important;
|
81
|
+
}
|
82
|
+
|
83
|
+
.dataTables_info {
|
84
|
+
font-size: small;
|
85
|
+
color: rgb(202, 202, 202);
|
86
|
+
}
|
87
|
+
|
88
|
+
ul.pagination, li.paginate_button {
|
89
|
+
font-size: small;
|
90
|
+
margin-top: 0px !important;
|
91
|
+
margin-bottom: 0px !important;
|
92
|
+
padding-top: 0px !important;
|
93
|
+
padding-bottom: 0px !important;
|
94
|
+
}
|
95
|
+
|
96
|
+
.stats-list {
|
97
|
+
list-style-type: none;
|
98
|
+
clear: left;
|
99
|
+
margin: 0;
|
100
|
+
padding: 0;
|
101
|
+
text-align: center;
|
102
|
+
margin-bottom: 30px;
|
103
|
+
}
|
104
|
+
|
105
|
+
.stats-list .stats-list-positive {
|
106
|
+
color: #228b22;
|
107
|
+
}
|
108
|
+
|
109
|
+
.stats-list .stats-list-negative {
|
110
|
+
color: #a52a2a;
|
111
|
+
}
|
112
|
+
|
113
|
+
.stats-list > li {
|
114
|
+
display: inline-block;
|
115
|
+
margin-right: 10px;
|
116
|
+
padding-right: 10px;
|
117
|
+
border-right: 1px solid #cacaca;
|
118
|
+
text-align: center;
|
119
|
+
font-size: 1.1em;
|
120
|
+
font-weight: bold;
|
121
|
+
}
|
122
|
+
|
123
|
+
.stats-list > li:last-child {
|
124
|
+
border: none;
|
125
|
+
margin: 0;
|
126
|
+
padding: 0;
|
127
|
+
}
|
128
|
+
|
129
|
+
.stats-list > li .stats-list-label {
|
130
|
+
display: block;
|
131
|
+
margin-top: 2px;
|
132
|
+
font-size: 0.9em;
|
133
|
+
font-weight: normal;
|
134
|
+
}
|
135
|
+
|
136
|
+
.hits, .visits, .size, .count, .s2xx, .s3xx, .so4xx, .total-hits, .total-visits {
|
137
|
+
text-align: right !important;
|
138
|
+
}
|
139
|
+
|
140
|
+
td {
|
141
|
+
vertical-align: top;
|
142
|
+
}
|
143
|
+
|
144
|
+
|
@@ -8,13 +8,14 @@
|
|
8
8
|
<meta charset="utf-8" />
|
9
9
|
<meta http-equiv="x-ua-compatible" content="ie=edge">
|
10
10
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
11
|
-
<meta name="author" content="Log Sense">
|
12
|
-
<meta name="description" content="Analysis of <%= data[:log_file] %>">
|
13
11
|
|
14
|
-
<
|
15
|
-
<
|
16
|
-
<link href="https://fonts.googleapis.com/css2?family=PT+Sans&display=swap" rel="stylesheet">
|
12
|
+
<meta name="author" content="Shair.Tech">
|
13
|
+
<meta name="description" content="Analysis of <%= data[:filenames].join(', ') %>">
|
17
14
|
|
15
|
+
<link rel="preconnect" href="https://fonts.googleapis.com">
|
16
|
+
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
17
|
+
<link href="https://fonts.googleapis.com/css2?family=Fira+Sans:wght@300;700&display=swap" rel="stylesheet">
|
18
|
+
|
18
19
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/foundicons/3.0.0/foundation-icons.min.css">
|
19
20
|
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/foundation-sites@6.7.4/dist/css/foundation.min.css">
|
20
21
|
<link rel="stylesheet" type="text/css" href="https://cdn.datatables.net/v/zf/dt-1.11.3/datatables.min.css"/>
|
@@ -27,181 +28,45 @@
|
|
27
28
|
<script src="https://cdn.jsdelivr.net/npm/vega-embed@6.20.2"></script>
|
28
29
|
|
29
30
|
<style>
|
30
|
-
|
31
|
-
font-family: 'PT Sans', sans-serif;
|
32
|
-
font-size: 80%;
|
33
|
-
}
|
34
|
-
|
35
|
-
#offCanvas {
|
36
|
-
color: #DEDEDE;
|
37
|
-
background: #1C1C1C;
|
38
|
-
border-right: none;
|
39
|
-
box-shadow: none;
|
40
|
-
padding: 0.5rem;
|
41
|
-
}
|
42
|
-
#offCanvas a {
|
43
|
-
color: #FFFFFF;
|
44
|
-
}
|
45
|
-
|
46
|
-
.contents-button {
|
47
|
-
font-size: xx-large;
|
48
|
-
}
|
49
|
-
|
50
|
-
.main-section {
|
51
|
-
margin-left: 45px;
|
52
|
-
}
|
53
|
-
|
54
|
-
h1 {
|
55
|
-
font-size: 1.8rem;
|
56
|
-
}
|
57
|
-
|
58
|
-
h2 {
|
59
|
-
font-size: 1.2rem;
|
60
|
-
}
|
61
|
-
|
62
|
-
th {
|
63
|
-
padding: 0.2rem 1.2rem 0.2rem 0.2rem !important
|
64
|
-
}
|
65
|
-
|
66
|
-
td {
|
67
|
-
padding: 0.2rem 1rem 0.2rem 0.2rem !important;
|
68
|
-
}
|
69
|
-
|
70
|
-
.hits, .visits, .size, .count, .s2xx, .s3xx, .so4xx, .total-hits, .total-visits {
|
71
|
-
text-align: right !important;
|
72
|
-
}
|
73
|
-
|
74
|
-
.card-divider {
|
75
|
-
padding: 0.2rem 0.4rem 0.2rem 0.4rem;
|
76
|
-
background: #1C1C1C;
|
77
|
-
color: white;
|
78
|
-
}
|
79
|
-
|
80
|
-
input, select {
|
81
|
-
font-size: 0.8rem !important;
|
82
|
-
height: 1.5rem !important;
|
83
|
-
padding: 0.2rem 0.4rem 0.2rem 0.4rem !important;
|
84
|
-
}
|
85
|
-
|
86
|
-
.dataTables_info {
|
87
|
-
font-size: small;
|
88
|
-
color: rgb(202, 202, 202);
|
89
|
-
}
|
90
|
-
|
91
|
-
ul.pagination, li.paginate_button {
|
92
|
-
font-size: small;
|
93
|
-
margin-top: 0px !important;
|
94
|
-
margin-bottom: 0px !important;
|
95
|
-
padding-top: 0px !important;
|
96
|
-
padding-bottom: 0px !important;
|
97
|
-
}
|
98
|
-
|
99
|
-
.stats-list {
|
100
|
-
list-style-type: none;
|
101
|
-
clear: left;
|
102
|
-
margin: 0;
|
103
|
-
padding: 0;
|
104
|
-
text-align: center;
|
105
|
-
margin-bottom: 30px;
|
106
|
-
}
|
107
|
-
|
108
|
-
.stats-list .stats-list-positive {
|
109
|
-
color: #228b22;
|
110
|
-
}
|
111
|
-
|
112
|
-
.stats-list .stats-list-negative {
|
113
|
-
color: #a52a2a;
|
114
|
-
}
|
115
|
-
|
116
|
-
.stats-list > li {
|
117
|
-
display: inline-block;
|
118
|
-
margin-right: 10px;
|
119
|
-
padding-right: 10px;
|
120
|
-
border-right: 1px solid #cacaca;
|
121
|
-
text-align: center;
|
122
|
-
font-size: 1.1em;
|
123
|
-
font-weight: bold;
|
124
|
-
}
|
125
|
-
|
126
|
-
.stats-list > li:last-child {
|
127
|
-
border: none;
|
128
|
-
margin: 0;
|
129
|
-
padding: 0;
|
130
|
-
}
|
131
|
-
|
132
|
-
.stats-list > li .stats-list-label {
|
133
|
-
display: block;
|
134
|
-
margin-top: 2px;
|
135
|
-
font-size: 0.9em;
|
136
|
-
font-weight: normal;
|
137
|
-
}
|
138
|
-
|
139
|
-
#streaks-table .ip {
|
140
|
-
vertical-align: top;
|
141
|
-
}
|
142
|
-
#streaks-table .date {
|
143
|
-
font-weight: bold;
|
144
|
-
}
|
145
|
-
#streaks-table .res-title {
|
146
|
-
font-decoration: underline;
|
147
|
-
}
|
31
|
+
<%= render "stylesheet.css" %>
|
148
32
|
</style>
|
149
|
-
|
150
33
|
</head>
|
151
34
|
|
152
35
|
<body>
|
153
36
|
<div class="off-canvas-wrapper">
|
154
37
|
<div class="off-canvas position-left" id="offCanvas" data-off-canvas>
|
155
38
|
<%= render "navigation.html.erb",
|
156
|
-
menus: Emitter::apache_report_specification.map { |x| x[:title] }
|
157
|
-
["Streaks", "Command Invocation", "Performance"] %>
|
39
|
+
menus: Emitter::apache_report_specification.map { |x| x[:title] } %>
|
158
40
|
</div>
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
<div class="contents-button">
|
164
|
-
<i id="hamburger" class="fi-list" data-toggle="offCanvas"></i>
|
165
|
-
</div>
|
166
|
-
</div>
|
167
|
-
</div>
|
41
|
+
<div class="off-canvas-content" data-off-canvas-content>
|
42
|
+
<button id="toggle-button" type="button" data-toggle="offCanvas">
|
43
|
+
☰
|
44
|
+
</button>
|
168
45
|
|
169
|
-
<section class="main-section">
|
46
|
+
<section class="main-section grid-container fluid">
|
170
47
|
<h1><%= options[:title] || "Log Sense Apache Log Report" %></h1>
|
171
48
|
|
172
49
|
<p><b>Input File(s):</b> <%= data[:filenames].empty? ? "stdin" : data[:filenames].join(", ") %></p>
|
173
50
|
|
174
|
-
<div class="grid-x grid-
|
175
|
-
<article class="
|
176
|
-
<
|
177
|
-
|
178
|
-
</div>
|
179
|
-
<div class="card-section">
|
180
|
-
<%= render "summary.html.erb", data: data %>
|
181
|
-
</div>
|
51
|
+
<div class="grid-x grid-padding-x">
|
52
|
+
<article class="small-12 large-6 cell">
|
53
|
+
<h2 id="<%= Emitter::slugify "Summary" %>">Summary</h2>
|
54
|
+
<%= render "summary.html.erb", data: data %>
|
182
55
|
</article>
|
183
56
|
|
184
|
-
<article class="
|
185
|
-
<
|
186
|
-
|
187
|
-
</div>
|
188
|
-
<div class="card-section">
|
189
|
-
<%= render "log_structure.html.erb", data: data %>
|
190
|
-
</div>
|
57
|
+
<article class="small-12 large-6 cell">
|
58
|
+
<h2 id="<%= Emitter::slugify "Summary" %>">Log Structure</h2>
|
59
|
+
<%= render "log_structure.html.erb", data: data %>
|
191
60
|
</article>
|
192
|
-
</div>
|
193
61
|
|
194
|
-
<div class="grid-x grid-margin-x">
|
195
62
|
<% @reports.each_with_index do |report, index| %>
|
196
|
-
<article class="
|
197
|
-
<
|
198
|
-
|
199
|
-
<%= report[:title] %>
|
200
|
-
</h2>
|
201
|
-
</div>
|
63
|
+
<article class="<%= report[:col] || "small-12 large-6" %> cell">
|
64
|
+
<h2 id="<%= Emitter::slugify report[:title] %>"><%= report[:title] %></h2>
|
65
|
+
|
202
66
|
<%= render "report_data.html.erb", report: report, index: index %>
|
203
67
|
<% if report[:vega_spec] %>
|
204
|
-
<div id="<%= "plot-#{index}" %>"
|
68
|
+
<div id="<%= "plot-#{index}" %>" class="plot-canvas">
|
69
|
+
</div>
|
205
70
|
<script>
|
206
71
|
plot_spec_<%= index %> = Object.assign(
|
207
72
|
<%= report[:vega_spec].to_json %>,
|
@@ -216,45 +81,35 @@
|
|
216
81
|
</script>
|
217
82
|
<% end %>
|
218
83
|
|
219
|
-
|
220
|
-
<%= render "output_table.html.erb", report: report, index: index %>
|
221
|
-
</div>
|
84
|
+
<%= render "output_table.html.erb", report: report, index: index %>
|
222
85
|
</article>
|
223
86
|
<% end %>
|
224
|
-
</div>
|
225
87
|
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
<%= render "command_invocation.html.erb", data: data, options: options %>
|
232
|
-
</article>
|
233
|
-
</div>
|
234
|
-
|
235
|
-
<div class="small-12 large-6 cell">
|
236
|
-
<article>
|
237
|
-
<h2 id="<%= Emitter::slugify "Performance" %>">Performance</h2>
|
88
|
+
<article class="small-12 large-6 cell">
|
89
|
+
<h2 id="<%= Emitter::slugify "Command Invocation" %>">Command Invocation</h2>
|
90
|
+
<%= render "command_invocation.html.erb", data: data, options: options %>
|
91
|
+
</article>
|
238
92
|
|
239
|
-
|
240
|
-
</
|
241
|
-
|
93
|
+
<article class="small-12 large-6 cell">
|
94
|
+
<h2 id="<%= Emitter::slugify "Performance" %>">Performance</h2>
|
95
|
+
<%= render "performance.html.erb", data: data %>
|
96
|
+
</article>
|
242
97
|
</div>
|
243
98
|
</section>
|
244
99
|
</div>
|
100
|
+
</div>
|
245
101
|
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
102
|
+
<script type="text/javascript" src="js/vendor/what-input.js"></script>
|
103
|
+
<script src="https://cdn.jsdelivr.net/npm/vega@5"></script>
|
104
|
+
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/foundation-sites@6.7.4/dist/js/foundation.min.js" crossorigin="anonymous"></script>
|
105
|
+
<script>
|
106
|
+
$(document).foundation();
|
251
107
|
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
});
|
108
|
+
$(document).ready(function () {
|
109
|
+
$('.data-table').each(function () {
|
110
|
+
$(this).DataTable();
|
256
111
|
});
|
257
|
-
|
258
|
-
</
|
112
|
+
});
|
113
|
+
</script>
|
259
114
|
</body>
|
260
115
|
</html>
|
@@ -8,12 +8,13 @@
|
|
8
8
|
<meta charset="utf-8" />
|
9
9
|
<meta http-equiv="x-ua-compatible" content="ie=edge">
|
10
10
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
11
|
-
<meta name="author" content="Log Sense">
|
12
|
-
<meta name="description" content="Analysis of <%= data[:log_file] %>">
|
13
11
|
|
14
|
-
<
|
15
|
-
<
|
16
|
-
|
12
|
+
<meta name="author" content="Shair.Tech">
|
13
|
+
<meta name="description" content="Analysis of <%= data[:filenames].join(', ') %>">
|
14
|
+
|
15
|
+
<link rel="preconnect" href="https://fonts.googleapis.com">
|
16
|
+
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
17
|
+
<link href="https://fonts.googleapis.com/css2?family=Fira+Sans:wght@300;700&display=swap" rel="stylesheet">
|
17
18
|
|
18
19
|
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/foundicons/3.0.0/foundation-icons.min.css">
|
19
20
|
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/foundation-sites@6.7.4/dist/css/foundation.min.css">
|
@@ -27,126 +28,16 @@
|
|
27
28
|
<script src="https://cdn.jsdelivr.net/npm/vega-embed@6.20.2"></script>
|
28
29
|
|
29
30
|
<style>
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
}
|
34
|
-
|
31
|
+
<%= render "stylesheet.css" %>
|
32
|
+
</style>
|
33
|
+
<style>
|
35
34
|
#offCanvas {
|
36
|
-
|
37
|
-
background: #BD000D;
|
38
|
-
border-right: none;
|
39
|
-
box-shadow: none;
|
40
|
-
padding: 0.5rem;
|
41
|
-
}
|
42
|
-
#offCanvas a {
|
43
|
-
color: #FFFFFF;
|
44
|
-
}
|
45
|
-
|
46
|
-
.contents-button {
|
47
|
-
font-size: xx-large;
|
35
|
+
background: #d30001 !important;
|
48
36
|
}
|
49
|
-
|
50
|
-
.main-section {
|
51
|
-
margin-left: 45px;
|
52
|
-
}
|
53
|
-
|
54
|
-
h1 {
|
55
|
-
font-size: 1.8rem;
|
56
|
-
}
|
57
|
-
|
58
37
|
h2 {
|
59
|
-
|
60
|
-
}
|
61
|
-
|
62
|
-
th {
|
63
|
-
padding: 0.2rem 1.2rem 0.2rem 0.2rem !important
|
64
|
-
}
|
65
|
-
|
66
|
-
td {
|
67
|
-
padding: 0.2rem 1rem 0.2rem 0.2rem !important;
|
68
|
-
}
|
69
|
-
|
70
|
-
.hits, .visits, .size, .count, .s2xx, .s3xx, .so4xx, .total-hits, .total-visits {
|
71
|
-
text-align: right !important;
|
72
|
-
}
|
73
|
-
|
74
|
-
.card-divider {
|
75
|
-
padding: 0.2rem 0.4rem 0.2rem 0.4rem;
|
76
|
-
background: #D30001;
|
77
|
-
color: white;
|
78
|
-
}
|
79
|
-
|
80
|
-
input, select {
|
81
|
-
font-size: 0.8rem !important;
|
82
|
-
height: 1.5rem !important;
|
83
|
-
padding: 0.2rem 0.4rem 0.2rem 0.4rem !important;
|
84
|
-
}
|
85
|
-
|
86
|
-
.dataTables_info {
|
87
|
-
font-size: small;
|
88
|
-
color: rgb(202, 202, 202);
|
89
|
-
}
|
90
|
-
|
91
|
-
ul.pagination, li.paginate_button {
|
92
|
-
font-size: small;
|
93
|
-
margin-top: 0px !important;
|
94
|
-
margin-bottom: 0px !important;
|
95
|
-
padding-top: 0px !important;
|
96
|
-
padding-bottom: 0px !important;
|
97
|
-
}
|
98
|
-
|
99
|
-
.stats-list {
|
100
|
-
list-style-type: none;
|
101
|
-
clear: left;
|
102
|
-
margin: 0;
|
103
|
-
padding: 0;
|
104
|
-
text-align: center;
|
105
|
-
margin-bottom: 30px;
|
106
|
-
}
|
107
|
-
|
108
|
-
.stats-list .stats-list-positive {
|
109
|
-
color: #228b22;
|
110
|
-
}
|
111
|
-
|
112
|
-
.stats-list .stats-list-negative {
|
113
|
-
color: #a52a2a;
|
114
|
-
}
|
115
|
-
|
116
|
-
.stats-list > li {
|
117
|
-
display: inline-block;
|
118
|
-
margin-right: 10px;
|
119
|
-
padding-right: 10px;
|
120
|
-
border-right: 1px solid #cacaca;
|
121
|
-
text-align: center;
|
122
|
-
font-size: 1.1em;
|
123
|
-
font-weight: bold;
|
124
|
-
}
|
125
|
-
|
126
|
-
.stats-list > li:last-child {
|
127
|
-
border: none;
|
128
|
-
margin: 0;
|
129
|
-
padding: 0;
|
130
|
-
}
|
131
|
-
|
132
|
-
.stats-list > li .stats-list-label {
|
133
|
-
display: block;
|
134
|
-
margin-top: 2px;
|
135
|
-
font-size: 0.9em;
|
136
|
-
font-weight: normal;
|
137
|
-
}
|
138
|
-
|
139
|
-
#streaks-table .ip {
|
140
|
-
vertical-align: top;
|
141
|
-
}
|
142
|
-
#streaks-table .date {
|
143
|
-
font-weight: bold;
|
144
|
-
}
|
145
|
-
#streaks-table .res-title {
|
146
|
-
font-decoration: underline;
|
38
|
+
background: #d30001 !important;
|
147
39
|
}
|
148
40
|
</style>
|
149
|
-
|
150
41
|
</head>
|
151
42
|
|
152
43
|
<body>
|
@@ -155,51 +46,35 @@
|
|
155
46
|
<%= render "navigation.html.erb",
|
156
47
|
menus: Emitter::rails_report_specification.map { |x| x[:title] } %>
|
157
48
|
</div>
|
158
|
-
<div class="off-canvas-content
|
159
|
-
<
|
160
|
-
|
161
|
-
|
162
|
-
<i id="hamburger" class="fi-list" data-toggle="offCanvas"></i>
|
163
|
-
</div>
|
164
|
-
</div>
|
165
|
-
</div>
|
49
|
+
<div class="off-canvas-content" data-off-canvas-content>
|
50
|
+
<button id="toggle-button" type="button" data-toggle="offCanvas">
|
51
|
+
☰
|
52
|
+
</button>
|
166
53
|
|
167
|
-
<section class="main-section">
|
54
|
+
<section class="main-section grid-container fluid">
|
168
55
|
<h1><%= options[:title] || "Log Sense Rails Log Report" %></h1>
|
169
56
|
|
170
57
|
<p><b>Input File(s):</b> <%= data[:filenames].empty? ? "stdin" : data[:filenames].join(", ") %></p>
|
171
58
|
|
172
|
-
<div class="grid-x grid-
|
173
|
-
<article class="
|
174
|
-
<
|
175
|
-
|
176
|
-
</div>
|
177
|
-
<div class="card-section">
|
178
|
-
<%= render "summary.html.erb", data: data %>
|
179
|
-
</div>
|
59
|
+
<div class="grid-x grid-padding-x">
|
60
|
+
<article class="small-12 large-6 cell">
|
61
|
+
<h2 id="<%= Emitter::slugify "Summary" %>">Summary</h2>
|
62
|
+
<%= render "summary.html.erb", data: data %>
|
180
63
|
</article>
|
181
64
|
|
182
|
-
<article class="
|
183
|
-
<
|
184
|
-
|
185
|
-
</div>
|
186
|
-
<div class="card-section">
|
187
|
-
<%= render "log_structure.html.erb", data: data %>
|
188
|
-
</div>
|
65
|
+
<article class="small-12 large-6 cell">
|
66
|
+
<h2 id="<%= Emitter::slugify "Summary" %>">Log Structure</h2>
|
67
|
+
<%= render "log_structure.html.erb", data: data %>
|
189
68
|
</article>
|
190
|
-
</div>
|
191
69
|
|
192
|
-
<div class="grid-x grid-margin-x">
|
193
70
|
<% @reports.each_with_index do |report, index| %>
|
194
|
-
<article class="
|
195
|
-
<
|
196
|
-
|
197
|
-
<%= report[:title] %>
|
198
|
-
</h2>
|
199
|
-
</div>
|
71
|
+
<article class="cell <%= report[:col] || "small-12 large-6" %>" >
|
72
|
+
<h2 id="<%= Emitter::slugify report[:title] %>"><%= report[:title] %></h2>
|
73
|
+
|
200
74
|
<%= render "report_data.html.erb", report: report, index: index %>
|
201
75
|
<% if report[:vega_spec] %>
|
202
|
-
<div id="<%= "plot-#{index}" %>"
|
76
|
+
<div id="<%= "plot-#{index}" %>" class="plot-canvas">
|
77
|
+
</div>
|
203
78
|
<script>
|
204
79
|
plot_spec_<%= index %> = Object.assign(
|
205
80
|
<%= report[:vega_spec].to_json %>,
|
@@ -213,47 +88,36 @@
|
|
213
88
|
vegaEmbed('#<%= "plot-#{index}"%>', plot_spec_<%= index %>);
|
214
89
|
</script>
|
215
90
|
<% end %>
|
216
|
-
<div class="card-section">
|
217
|
-
<%= render "output_table.html.erb", report: report, index: index %>
|
218
|
-
</div>
|
219
|
-
</article>
|
220
|
-
<% end %>
|
221
|
-
</div>
|
222
91
|
|
223
|
-
|
224
|
-
<div class="cell small-12 large-6">
|
225
|
-
<article>
|
226
|
-
<h2 id="<%= Emitter::slugify "Command Invocation" %>">
|
227
|
-
Command Invocation
|
228
|
-
</h2>
|
229
|
-
|
230
|
-
<%= render "command_invocation.html.erb", data: data, options: options %>
|
92
|
+
<%= render "output_table.html.erb", report: report, index: index %>
|
231
93
|
</article>
|
232
|
-
|
94
|
+
<% end %>
|
233
95
|
|
234
|
-
<
|
235
|
-
<
|
236
|
-
|
96
|
+
<article class="small-12 large-6 cell">
|
97
|
+
<h2 id="<%= Emitter::slugify "Command Invocation" %>">Command Invocation</h2>
|
98
|
+
<%= render "command_invocation.html.erb", data: data, options: options %>
|
99
|
+
</article>
|
237
100
|
|
238
|
-
|
239
|
-
</
|
240
|
-
|
101
|
+
<article class="small-12 large-6 cell">
|
102
|
+
<h2 id="<%= Emitter::slugify "Performance" %>">Performance</h2>
|
103
|
+
<%= render "performance.html.erb", data: data %>
|
104
|
+
</article>
|
241
105
|
</div>
|
242
106
|
</section>
|
243
107
|
</div>
|
108
|
+
</div>
|
244
109
|
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
110
|
+
<script type="text/javascript" src="js/vendor/what-input.js"></script>
|
111
|
+
<script src="https://cdn.jsdelivr.net/npm/vega@5"></script>
|
112
|
+
<script type="text/javascript" src="https://cdn.jsdelivr.net/npm/foundation-sites@6.7.4/dist/js/foundation.min.js" crossorigin="anonymous"></script>
|
113
|
+
<script>
|
114
|
+
$(document).foundation();
|
250
115
|
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
});
|
116
|
+
$(document).ready(function () {
|
117
|
+
$('.data-table').each(function () {
|
118
|
+
$(this).DataTable();
|
255
119
|
});
|
256
|
-
|
257
|
-
</
|
120
|
+
});
|
121
|
+
</script>
|
258
122
|
</body>
|
259
123
|
</html>
|
data/lib/log_sense/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: log_sense
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.5.
|
4
|
+
version: 1.5.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Adolfo Fibrillation
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2022-03-
|
11
|
+
date: 2022-03-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: browser
|
@@ -147,6 +147,7 @@ files:
|
|
147
147
|
- lib/log_sense/templates/_performance.html.erb
|
148
148
|
- lib/log_sense/templates/_performance.txt.erb
|
149
149
|
- lib/log_sense/templates/_report_data.html.erb
|
150
|
+
- lib/log_sense/templates/_stylesheet.css
|
150
151
|
- lib/log_sense/templates/_summary.html.erb
|
151
152
|
- lib/log_sense/templates/_summary.txt.erb
|
152
153
|
- lib/log_sense/templates/_warning.txt.erb
|