rails-pretty-logger 0.2.9 → 0.3.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/README.md +215 -35
- data/app/assets/javascripts/rails/pretty/logger/application.js +16 -23
- data/app/assets/stylesheets/rails/pretty/logger/application.css +1 -15
- data/app/assets/stylesheets/rails/pretty/logger/dashboards.css +463 -141
- data/app/assets/stylesheets/rails/pretty/logger/list.css +1 -94
- data/app/controllers/rails/pretty/logger/application_controller.rb +31 -0
- data/app/controllers/rails/pretty/logger/dashboards_controller.rb +9 -4
- data/app/controllers/rails/pretty/logger/hourly_logs_controller.rb +36 -4
- data/app/helpers/rails/pretty/logger/application_helper.rb +32 -0
- data/app/helpers/rails/pretty/logger/dashboards_helper.rb +114 -14
- data/app/views/layouts/rails/pretty/logger/application.html.erb +9 -8
- data/app/views/partials/_error_pagination.html.erb +12 -10
- data/app/views/partials/_log_entries.html.erb +5 -0
- data/app/views/partials/_log_filters.html.erb +14 -0
- data/app/views/partials/_pretyyloggernavbar.html.erb +14 -9
- data/app/views/rails/pretty/logger/dashboards/index.html.erb +37 -20
- data/app/views/rails/pretty/logger/dashboards/logs.html.erb +33 -14
- data/app/views/rails/pretty/logger/hourly_logs/index.html.erb +49 -25
- data/app/views/rails/pretty/logger/hourly_logs/logs.html.erb +35 -14
- data/config/locales/rails_pretty_logger.en.yml +35 -0
- data/config/locales/rails_pretty_logger.tr.yml +35 -0
- data/lib/generators/rails_pretty_logger/install/install_generator.rb +29 -0
- data/lib/generators/rails_pretty_logger/install/templates/rails_pretty_logger.rb +20 -0
- data/lib/rails/pretty/logger/active_support_logger.rb +3 -7
- data/lib/rails/pretty/logger/config/logger_config.rb +0 -16
- data/lib/rails/pretty/logger/configuration.rb +18 -0
- data/lib/rails/pretty/logger/console_logger.rb +2 -2
- data/lib/rails/pretty/logger/engine.rb +22 -4
- data/lib/rails/pretty/logger/rails_logger.rb +62 -41
- data/lib/rails/pretty/logger/version.rb +1 -1
- data/lib/rails/pretty/logger.rb +547 -31
- data/lib/tasks/rails/pretty/logger_tasks.rake +36 -23
- metadata +79 -38
- data/Rakefile +0 -22
- data/app/assets/javascripts/rails/pretty/logger/dashboards.js +0 -2
- data/app/assets/javascripts/rails/pretty/logger/list.min.js +0 -2
- data/app/models/rails/pretty/logger/application_record.rb +0 -9
- data/app/assets/config/{rails_pretty_logger_manifest.js → manifest.js} +1 -1
|
@@ -1,94 +1 @@
|
|
|
1
|
-
.
|
|
2
|
-
background-color: #F62817 !important ;
|
|
3
|
-
color: white;
|
|
4
|
-
padding: 15px 32px;
|
|
5
|
-
text-align: center;
|
|
6
|
-
text-decoration: none;
|
|
7
|
-
display: inline-block;
|
|
8
|
-
font-size: 14px;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
.message{
|
|
14
|
-
text-align: center;
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
.list {
|
|
19
|
-
font-family:sans-serif;
|
|
20
|
-
}
|
|
21
|
-
td {
|
|
22
|
-
padding:10px;
|
|
23
|
-
border:solid 1px #eee;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
input {
|
|
27
|
-
border:solid 1px #ccc;
|
|
28
|
-
border-radius: 5px;
|
|
29
|
-
padding:7px 14px;
|
|
30
|
-
margin-bottom:10px
|
|
31
|
-
}
|
|
32
|
-
input:focus {
|
|
33
|
-
outline:none;
|
|
34
|
-
border-color:#aaa;
|
|
35
|
-
}
|
|
36
|
-
.sort {
|
|
37
|
-
padding:8px 30px;
|
|
38
|
-
border-radius: 6px;
|
|
39
|
-
border:none;
|
|
40
|
-
display:inline-block;
|
|
41
|
-
color:#fff;
|
|
42
|
-
text-decoration: none;
|
|
43
|
-
background-color: #28a8e0;
|
|
44
|
-
height:30px;
|
|
45
|
-
}
|
|
46
|
-
.sort:hover {
|
|
47
|
-
text-decoration: none;
|
|
48
|
-
background-color:#1b8aba;
|
|
49
|
-
}
|
|
50
|
-
.sort:focus {
|
|
51
|
-
outline:none;
|
|
52
|
-
}
|
|
53
|
-
.sort:after {
|
|
54
|
-
display:inline-block;
|
|
55
|
-
width: 0;
|
|
56
|
-
height: 0;
|
|
57
|
-
border-left: 5px solid transparent;
|
|
58
|
-
border-right: 5px solid transparent;
|
|
59
|
-
border-bottom: 5px solid transparent;
|
|
60
|
-
content:"";
|
|
61
|
-
position: relative;
|
|
62
|
-
top:-10px;
|
|
63
|
-
right:-5px;
|
|
64
|
-
}
|
|
65
|
-
.sort.asc:after {
|
|
66
|
-
width: 0;
|
|
67
|
-
height: 0;
|
|
68
|
-
border-left: 5px solid transparent;
|
|
69
|
-
border-right: 5px solid transparent;
|
|
70
|
-
border-top: 5px solid #fff;
|
|
71
|
-
content:"";
|
|
72
|
-
position: relative;
|
|
73
|
-
top:4px;
|
|
74
|
-
right:-5px;
|
|
75
|
-
}
|
|
76
|
-
.sort.desc:after {
|
|
77
|
-
width: 0;
|
|
78
|
-
height: 0;
|
|
79
|
-
border-left: 5px solid transparent;
|
|
80
|
-
border-right: 5px solid transparent;
|
|
81
|
-
border-bottom: 5px solid #fff;
|
|
82
|
-
content:"";
|
|
83
|
-
position: relative;
|
|
84
|
-
top:-4px;
|
|
85
|
-
right:-5px;
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
.pagination li {
|
|
89
|
-
display: inline-table;
|
|
90
|
-
}
|
|
91
|
-
|
|
92
|
-
ul {
|
|
93
|
-
list-style-type: none;
|
|
94
|
-
}
|
|
1
|
+
/* Compatibility logical asset for applications that reference rails/pretty/logger/list.css. */
|
|
@@ -2,7 +2,38 @@ module Rails
|
|
|
2
2
|
module Pretty
|
|
3
3
|
module Logger
|
|
4
4
|
class ApplicationController < ActionController::Base
|
|
5
|
+
helper Rails::Pretty::Logger::ApplicationHelper
|
|
6
|
+
helper Rails::Pretty::Logger::DashboardsHelper
|
|
7
|
+
|
|
5
8
|
protect_from_forgery with: :exception
|
|
9
|
+
|
|
10
|
+
before_action :authenticate_rails_pretty_logger
|
|
11
|
+
|
|
12
|
+
rescue_from Rails::Pretty::Logger::PrettyLogger::InvalidLogFile, with: :invalid_log_file
|
|
13
|
+
rescue_from Rails::Pretty::Logger::PrettyLogger::FileTooLarge, with: :log_file_too_large
|
|
14
|
+
|
|
15
|
+
private
|
|
16
|
+
|
|
17
|
+
def authenticate_rails_pretty_logger
|
|
18
|
+
auth_hook = Rails::Pretty::Logger.configuration.authenticate_with || legacy_authenticate_with
|
|
19
|
+
instance_exec(&auth_hook) if auth_hook.respond_to?(:call)
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
def ensure_writable_rails_pretty_logger
|
|
23
|
+
head :forbidden if Rails::Pretty::Logger.configuration.read_only?
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def invalid_log_file
|
|
27
|
+
render plain: "Invalid log file", status: :bad_request
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def log_file_too_large
|
|
31
|
+
render plain: "Log file is too large", status: 413
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def legacy_authenticate_with
|
|
35
|
+
Rails.application.config.x.rails_pretty_logger.authenticate_with
|
|
36
|
+
end
|
|
6
37
|
end
|
|
7
38
|
end
|
|
8
39
|
end
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
require_dependency "rails/pretty/logger/application_controller"
|
|
2
2
|
|
|
3
|
-
module Rails::Pretty::Logger
|
|
3
|
+
module Rails::Pretty::Logger
|
|
4
4
|
class DashboardsController < ApplicationController
|
|
5
5
|
before_action :set_logger, except: [:index]
|
|
6
|
+
before_action :ensure_writable_rails_pretty_logger, only: [:clear_logs]
|
|
6
7
|
|
|
7
8
|
def logs
|
|
8
|
-
@log_data = @log.log_data
|
|
9
|
+
@log_data = tail_mode? ? @log.tail_log_data : @log.log_data
|
|
9
10
|
end
|
|
10
11
|
|
|
11
12
|
def index
|
|
@@ -14,17 +15,21 @@ module Rails::Pretty::Logger
|
|
|
14
15
|
|
|
15
16
|
def clear_logs
|
|
16
17
|
@log.clear_logs
|
|
17
|
-
redirect_to logs_dashboards_path({log_file:
|
|
18
|
+
redirect_to logs_dashboards_path({log_file: @log.log_file})
|
|
18
19
|
end
|
|
19
20
|
|
|
20
21
|
private
|
|
21
22
|
|
|
22
23
|
def dashboard_params
|
|
23
|
-
params.permit( :log_file, :utf8, :_method, :authenticity_token, :commit, :page, date_range: [:end, :start, :divider])
|
|
24
|
+
params.permit( :log_file, :mode, :group, :query, :severity, :utf8, :_method, :authenticity_token, :commit, :page, date_range: [:end, :start, :divider])
|
|
24
25
|
end
|
|
25
26
|
|
|
26
27
|
def set_logger
|
|
27
28
|
@log = PrettyLogger.new(dashboard_params)
|
|
28
29
|
end
|
|
30
|
+
|
|
31
|
+
def tail_mode?
|
|
32
|
+
dashboard_params[:mode] == "tail"
|
|
33
|
+
end
|
|
29
34
|
end
|
|
30
35
|
end
|
|
@@ -2,29 +2,61 @@ require_dependency "rails/pretty/logger/application_controller"
|
|
|
2
2
|
|
|
3
3
|
module Rails::Pretty::Logger
|
|
4
4
|
class HourlyLogsController < ApplicationController
|
|
5
|
+
PER_PAGE = 12
|
|
6
|
+
|
|
5
7
|
before_action :set_logger, except: [:index]
|
|
8
|
+
before_action :ensure_writable_rails_pretty_logger, only: [:clear_logs]
|
|
6
9
|
|
|
7
10
|
def logs
|
|
8
|
-
@log_data = @log.log_data
|
|
11
|
+
@log_data = tail_mode? ? @log.tail_log_data : @log.log_data
|
|
9
12
|
end
|
|
10
13
|
|
|
11
14
|
def index
|
|
12
|
-
|
|
15
|
+
logs = PrettyLogger.get_hourly_log_file_list.values.select { |file| file[:file_size] > 0 }
|
|
16
|
+
@hourly_logs_present = logs.any?
|
|
17
|
+
logs = filter_logs(logs)
|
|
18
|
+
logs = sort_logs(logs)
|
|
19
|
+
|
|
20
|
+
@page = [index_params[:page].to_i, 1].max
|
|
21
|
+
@total_pages = (logs.count.to_f / PER_PAGE).ceil
|
|
22
|
+
@total_pages = 1 if @total_pages.zero?
|
|
23
|
+
@page = @total_pages if @page > @total_pages
|
|
24
|
+
@log_file_list = logs.slice((@page - 1) * PER_PAGE, PER_PAGE) || []
|
|
13
25
|
end
|
|
14
26
|
|
|
15
27
|
def clear_logs
|
|
16
28
|
@log.clear_logs
|
|
17
|
-
redirect_to hourly_logs_path({log_file:
|
|
29
|
+
redirect_to hourly_logs_path({log_file: @log.log_file})
|
|
18
30
|
end
|
|
19
31
|
|
|
20
32
|
private
|
|
21
33
|
|
|
34
|
+
def index_params
|
|
35
|
+
params.permit(:search, :sort, :page)
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
def filter_logs(logs)
|
|
39
|
+
return logs if index_params[:search].blank?
|
|
40
|
+
|
|
41
|
+
query = index_params[:search].downcase
|
|
42
|
+
logs.select { |file| file[:file_name].downcase.include?(query) }
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def sort_logs(logs)
|
|
46
|
+
logs = logs.sort_by { |file| file[:file_name] }
|
|
47
|
+
index_params[:sort] == "desc" ? logs.reverse : logs
|
|
48
|
+
end
|
|
49
|
+
|
|
22
50
|
def hourly_params
|
|
23
|
-
params.permit( :log_file, :utf8, :_method, :authenticity_token, :commit, :page, date_range: [:end, :start, :divider])
|
|
51
|
+
params.permit( :log_file, :mode, :group, :query, :severity, :utf8, :_method, :authenticity_token, :commit, :page, date_range: [:end, :start, :divider])
|
|
24
52
|
end
|
|
25
53
|
|
|
26
54
|
def set_logger
|
|
27
55
|
@log = PrettyLogger.new(hourly_params)
|
|
28
56
|
end
|
|
57
|
+
|
|
58
|
+
def tail_mode?
|
|
59
|
+
hourly_params[:mode] == "tail"
|
|
60
|
+
end
|
|
29
61
|
end
|
|
30
62
|
end
|
|
@@ -9,5 +9,37 @@ module Rails::Pretty::Logger
|
|
|
9
9
|
index = name.split("/log/").last.capitalize
|
|
10
10
|
end
|
|
11
11
|
|
|
12
|
+
def rails_pretty_logger_read_only?
|
|
13
|
+
Rails::Pretty::Logger.configuration.read_only?
|
|
14
|
+
end
|
|
15
|
+
|
|
16
|
+
def rails_pretty_logger_tail_mode?
|
|
17
|
+
params[:mode] == "tail"
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def rails_pretty_logger_request_grouping?
|
|
21
|
+
params[:group] == "request"
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def rails_pretty_logger_severity_options
|
|
25
|
+
[["All levels", ""]] + Rails::Pretty::Logger::PrettyLogger::SEVERITIES.map { |severity| [severity, severity] }
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
def rails_pretty_logger_log_base_params(include_group: true)
|
|
29
|
+
log_params = { log_file: params[:log_file] }
|
|
30
|
+
log_params[:mode] = params[:mode] if params[:mode].present?
|
|
31
|
+
log_params[:group] = params[:group] if include_group && params[:group].present?
|
|
32
|
+
log_params
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def rails_pretty_logger_log_filter_params(include_mode: true, include_group: true)
|
|
36
|
+
log_params = { log_file: params[:log_file] }
|
|
37
|
+
log_params[:mode] = params[:mode] if include_mode && params[:mode].present?
|
|
38
|
+
log_params[:group] = params[:group] if include_group && params[:group].present?
|
|
39
|
+
log_params[:query] = params[:query] if params[:query].present?
|
|
40
|
+
log_params[:severity] = params[:severity] if params[:severity].present?
|
|
41
|
+
log_params
|
|
42
|
+
end
|
|
43
|
+
|
|
12
44
|
end
|
|
13
45
|
end
|
|
@@ -1,11 +1,20 @@
|
|
|
1
1
|
module Rails::Pretty::Logger
|
|
2
2
|
module DashboardsHelper
|
|
3
|
+
STRUCTURED_LOG_PRIMARY_KEYS = %w[@timestamp timestamp time datetime created_at severity level log_level message msg].freeze
|
|
4
|
+
|
|
3
5
|
def check_highlight(line)
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
6
|
+
rails_pretty_logger_log_entry(line)
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def rails_pretty_logger_log_entry(entry)
|
|
10
|
+
return rails_pretty_logger_request_group(entry) if entry.is_a?(Hash)
|
|
11
|
+
return rails_pretty_logger_structured_log(entry) if rails_pretty_logger_structured_payload(entry)
|
|
12
|
+
return tag.div(entry.remove("[HIGHLIGHT]"), class: "log-line highlight") if entry.include?("[HIGHLIGHT]")
|
|
13
|
+
|
|
14
|
+
if entry.include?("Parameters:")
|
|
15
|
+
tag.div(parse_parameters(entry), class: "log-line log-line--parameters")
|
|
7
16
|
else
|
|
8
|
-
line
|
|
17
|
+
tag.div(entry, class: "log-line")
|
|
9
18
|
end
|
|
10
19
|
end
|
|
11
20
|
|
|
@@ -35,21 +44,112 @@ module Rails::Pretty::Logger
|
|
|
35
44
|
"active" if params[:page].to_i == index
|
|
36
45
|
end
|
|
37
46
|
|
|
38
|
-
def
|
|
39
|
-
|
|
47
|
+
def parse_parameters(line)
|
|
48
|
+
parameters = line[line.index("Parameters:") + "Parameters:".length..]
|
|
49
|
+
hash = JSON.parse(parameters.gsub("=>", ":"))
|
|
50
|
+
parts = [tag.strong("Parameters:"), tag.br]
|
|
51
|
+
hash.each do |key, value|
|
|
52
|
+
parts << tag.strong("#{key}: ")
|
|
53
|
+
parts << value.to_s
|
|
54
|
+
parts << ", "
|
|
55
|
+
end
|
|
56
|
+
safe_join(parts)
|
|
57
|
+
rescue JSON::ParserError, TypeError
|
|
58
|
+
line
|
|
40
59
|
end
|
|
41
60
|
|
|
42
|
-
def
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
61
|
+
def rails_pretty_logger_request_group(group)
|
|
62
|
+
tag.details(class: rails_pretty_logger_request_group_classes(group), open: true) do
|
|
63
|
+
safe_join([
|
|
64
|
+
tag.summary(rails_pretty_logger_request_summary(group), class: "log-request__summary"),
|
|
65
|
+
tag.pre(group.fetch(:lines).join, class: "log-request__body")
|
|
66
|
+
])
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
def rails_pretty_logger_request_summary(group)
|
|
71
|
+
return t("rails_pretty_logger.logs.ungrouped_lines") unless group[:type] == :request
|
|
72
|
+
|
|
73
|
+
parts = [
|
|
74
|
+
tag.span(group[:method], class: "log-request__method"),
|
|
75
|
+
tag.span(group[:path], class: "log-request__path")
|
|
76
|
+
]
|
|
77
|
+
parts << tag.span(group[:status], class: "log-request__status") if group[:status].present?
|
|
78
|
+
parts << tag.span(group[:duration], class: "log-request__duration") if group[:duration].present?
|
|
79
|
+
|
|
80
|
+
safe_join(parts, " ")
|
|
81
|
+
end
|
|
82
|
+
|
|
83
|
+
def rails_pretty_logger_request_group_classes(group)
|
|
84
|
+
classes = ["log-request"]
|
|
85
|
+
classes << "log-request--error" if group[:status].to_i >= 500
|
|
86
|
+
classes.join(" ")
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def rails_pretty_logger_structured_log(line)
|
|
90
|
+
payload = rails_pretty_logger_structured_payload(line)
|
|
91
|
+
severity = rails_pretty_logger_structured_value(payload, *Rails::Pretty::Logger::PrettyLogger::STRUCTURED_SEVERITY_KEYS)
|
|
92
|
+
severity ||= rails_pretty_logger_structured_nested_log_level(payload)
|
|
93
|
+
timestamp = rails_pretty_logger_structured_value(payload, *Rails::Pretty::Logger::PrettyLogger::STRUCTURED_TIMESTAMP_KEYS)
|
|
94
|
+
message = payload["message"] || payload["msg"] || line
|
|
95
|
+
|
|
96
|
+
tag.div(class: rails_pretty_logger_structured_log_classes(severity)) do
|
|
97
|
+
safe_join([
|
|
98
|
+
tag.div(class: "structured-log__header") do
|
|
99
|
+
rails_pretty_logger_structured_header(severity, timestamp, message)
|
|
100
|
+
end,
|
|
101
|
+
rails_pretty_logger_structured_metadata(payload)
|
|
102
|
+
].compact)
|
|
50
103
|
end
|
|
51
104
|
end
|
|
52
105
|
|
|
106
|
+
def rails_pretty_logger_structured_header(severity, timestamp, message)
|
|
107
|
+
parts = []
|
|
108
|
+
parts << tag.span(severity, class: "structured-log__severity") if severity.present?
|
|
109
|
+
parts << tag.span(timestamp, class: "structured-log__timestamp") if timestamp.present?
|
|
110
|
+
parts << tag.strong(message, class: "structured-log__message")
|
|
111
|
+
|
|
112
|
+
safe_join(parts)
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
def rails_pretty_logger_structured_metadata(payload)
|
|
116
|
+
metadata = payload.reject { |key, _value| STRUCTURED_LOG_PRIMARY_KEYS.include?(key.to_s) }
|
|
117
|
+
return if metadata.blank?
|
|
118
|
+
|
|
119
|
+
tag.dl(class: "structured-log__metadata") do
|
|
120
|
+
safe_join(metadata.flat_map do |key, value|
|
|
121
|
+
[
|
|
122
|
+
tag.dt(key),
|
|
123
|
+
tag.dd(value.is_a?(Hash) || value.is_a?(Array) ? JSON.generate(value) : value.to_s)
|
|
124
|
+
]
|
|
125
|
+
end)
|
|
126
|
+
end
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
def rails_pretty_logger_structured_log_classes(severity)
|
|
130
|
+
classes = ["structured-log"]
|
|
131
|
+
classes << "structured-log--#{severity.to_s.downcase}" if severity.present?
|
|
132
|
+
classes.join(" ")
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
def rails_pretty_logger_structured_payload(line)
|
|
136
|
+
Rails::Pretty::Logger::PrettyLogger.structured_log_payload(line)
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
def rails_pretty_logger_structured_value(payload, *keys)
|
|
140
|
+
keys.each do |key|
|
|
141
|
+
return payload[key].to_s if payload[key].present?
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
nil
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
def rails_pretty_logger_structured_nested_log_level(payload)
|
|
148
|
+
nested_log = payload["log"]
|
|
149
|
+
return unless nested_log.respond_to?(:[])
|
|
150
|
+
|
|
151
|
+
nested_log["level"].to_s.upcase.presence
|
|
152
|
+
end
|
|
53
153
|
|
|
54
154
|
end
|
|
55
155
|
end
|
|
@@ -2,15 +2,16 @@
|
|
|
2
2
|
<html>
|
|
3
3
|
<head>
|
|
4
4
|
<title>Rails pretty logger</title>
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
<% else %>
|
|
8
|
-
<%= csrf_meta_tags %>
|
|
9
|
-
<%= csp_meta_tag %>
|
|
10
|
-
<% end %>
|
|
5
|
+
<%= csrf_meta_tags %>
|
|
6
|
+
<%= csp_meta_tag %>
|
|
11
7
|
|
|
12
|
-
<%= stylesheet_link_tag
|
|
13
|
-
|
|
8
|
+
<%= stylesheet_link_tag(
|
|
9
|
+
"rails/pretty/logger/application",
|
|
10
|
+
"rails/pretty/logger/dashboards",
|
|
11
|
+
"rails/pretty/logger/list",
|
|
12
|
+
media: "all"
|
|
13
|
+
) %>
|
|
14
|
+
<%= javascript_include_tag "rails/pretty/logger/application", defer: true %>
|
|
14
15
|
</head>
|
|
15
16
|
<body>
|
|
16
17
|
|
|
@@ -1,21 +1,23 @@
|
|
|
1
1
|
<% if log_data.fetch(:error).present? %>
|
|
2
|
-
<p>
|
|
2
|
+
<p class="form-error">
|
|
3
3
|
<%= log_data.fetch(:error) %>
|
|
4
4
|
</p>
|
|
5
5
|
<% end %>
|
|
6
6
|
|
|
7
|
-
<% if log_data.fetch(:error).blank? %>
|
|
7
|
+
<% if log_data.fetch(:error).blank? && log_data.fetch(:logs_count).positive? %>
|
|
8
|
+
<nav class="pagination" aria-label="<%= t("rails_pretty_logger.navigation.pagination") %>">
|
|
8
9
|
<% log_data.fetch(:logs_count).times do |index| %>
|
|
9
10
|
<%= link_to(
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
11
|
+
index + 1,
|
|
12
|
+
send(
|
|
13
|
+
locals[:path],
|
|
14
|
+
rails_pretty_logger_log_filter_params(include_mode: false).merge(
|
|
13
15
|
page: index,
|
|
14
16
|
date_range: { start: log.start_date, end: log.end_date, divider: set_divider(params) }
|
|
15
|
-
)
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
17
|
+
)
|
|
18
|
+
),
|
|
19
|
+
html_options = {class: "#{is_page_active(index, params)}"}
|
|
20
|
+
) %>
|
|
19
21
|
<% end %>
|
|
22
|
+
</nav>
|
|
20
23
|
<% end %>
|
|
21
|
-
<hr>
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
<%= form_with url: send(path), method: :get, scope: nil, class: "log_filters" do |form| %>
|
|
2
|
+
<%= form.hidden_field :log_file, value: params[:log_file] %>
|
|
3
|
+
<%= form.hidden_field :mode, value: params[:mode] if rails_pretty_logger_tail_mode? %>
|
|
4
|
+
<%= form.hidden_field :group, value: params[:group] if rails_pretty_logger_request_grouping? %>
|
|
5
|
+
|
|
6
|
+
<%= form.label :query, t("rails_pretty_logger.filters.search") %>
|
|
7
|
+
<%= form.search_field :query, value: params[:query], placeholder: t("rails_pretty_logger.filters.search_log_content") %>
|
|
8
|
+
|
|
9
|
+
<%= form.label :severity, t("rails_pretty_logger.filters.severity") %>
|
|
10
|
+
<%= form.select :severity, rails_pretty_logger_severity_options, selected: params[:severity] %>
|
|
11
|
+
|
|
12
|
+
<%= form.submit t("rails_pretty_logger.filters.filter") %>
|
|
13
|
+
<%= link_to(t("rails_pretty_logger.filters.clear_filters"), send(path, rails_pretty_logger_log_base_params)) %>
|
|
14
|
+
<% end %>
|
|
@@ -1,14 +1,19 @@
|
|
|
1
|
-
|
|
2
1
|
<div class="logger_navbar">
|
|
3
|
-
<
|
|
4
|
-
|
|
5
|
-
</
|
|
6
|
-
|
|
2
|
+
<div class="logger_navbar__heading">
|
|
3
|
+
<h1><%= t("rails_pretty_logger.navigation.main_logs") %></h1>
|
|
4
|
+
</div>
|
|
5
|
+
|
|
6
|
+
<nav class="logger_navbar__actions">
|
|
7
|
+
<%= link_to(path_name, hourly_logs_path, class: "dashboard_button") %>
|
|
8
|
+
</nav>
|
|
9
|
+
</div>
|
|
10
|
+
|
|
11
|
+
<nav class="log-file-strip" aria-label="<%= t("rails_pretty_logger.navigation.log_files") %>">
|
|
12
|
+
<span class="log-file-strip__label"><%= t("rails_pretty_logger.navigation.log_files") %></span>
|
|
7
13
|
<% Rails::Pretty::Logger::PrettyLogger.get_log_file_list.each do |key, value| %>
|
|
8
|
-
|
|
14
|
+
<%= link_to(trim_name(value[:file_name]),
|
|
9
15
|
logs_dashboards_path(log_file: value[:file_name], date_range: { start: time_now, end: time_now }),
|
|
10
16
|
html_options = {class: "#{is_file_active(value[:file_name], params)}",
|
|
11
|
-
data: { confirm: "
|
|
17
|
+
data: { confirm: t("rails_pretty_logger.confirmations.open_file", size: value[:file_size]) }}) %>
|
|
12
18
|
<% end %>
|
|
13
|
-
</
|
|
14
|
-
<hr>
|
|
19
|
+
</nav>
|
|
@@ -1,31 +1,48 @@
|
|
|
1
1
|
<% if @log_file_list.count == 0 %>
|
|
2
|
-
<div>
|
|
3
|
-
<h1 class="message"
|
|
2
|
+
<div class="empty-state">
|
|
3
|
+
<h1 class="message"><%= t("rails_pretty_logger.states.no_logs") %></h1>
|
|
4
4
|
</div>
|
|
5
5
|
|
|
6
6
|
<% elsif is_stdout?%>
|
|
7
|
-
<div>
|
|
8
|
-
<h1 class="message"
|
|
7
|
+
<div class="empty-state">
|
|
8
|
+
<h1 class="message"><%= t("rails_pretty_logger.states.stdout_logging") %></h1>
|
|
9
9
|
</div>
|
|
10
10
|
|
|
11
11
|
<% else %>
|
|
12
12
|
<div class="logger_navbar">
|
|
13
|
-
<
|
|
14
|
-
|
|
15
|
-
</
|
|
16
|
-
Log Files:
|
|
17
|
-
<% @log_file_list .each do |key, value| %>
|
|
18
|
-
<%= link_to(trim_name(value.fetch(:file_name)),
|
|
19
|
-
logs_dashboards_path(log_file: value.fetch(:file_name), date_range: { start: time_now, end: time_now }),
|
|
20
|
-
html_options = {class: "dashboard_button",
|
|
21
|
-
data: { confirm: "Log file size is #{ value[:file_size] } MB. Are you sure to open this file? " }}) %>
|
|
22
|
-
|
|
23
|
-
<%= link_to("x",
|
|
24
|
-
clear_logs_dashboards_path(log_file: value.fetch(:file_name)),
|
|
25
|
-
html_options = {class: "clear_logs",
|
|
26
|
-
method: :post,
|
|
27
|
-
data: { confirm: "Are you sure to clear all logs from #{value.fetch(:file_name).capitalize}? " }}) %>
|
|
28
|
-
<% end %>
|
|
13
|
+
<div class="logger_navbar__heading">
|
|
14
|
+
<h1><%= t("rails_pretty_logger.navigation.main_logs") %></h1>
|
|
15
|
+
</div>
|
|
29
16
|
|
|
17
|
+
<nav class="logger_navbar__actions">
|
|
18
|
+
<%= link_to(t("rails_pretty_logger.navigation.hourly_logs"), hourly_logs_path, class: "dashboard_button") %>
|
|
19
|
+
</nav>
|
|
30
20
|
</div>
|
|
21
|
+
|
|
22
|
+
<section class="log-file-list" aria-label="<%= t("rails_pretty_logger.navigation.log_files") %>">
|
|
23
|
+
<div class="log-file-list__header">
|
|
24
|
+
<h2><%= t("rails_pretty_logger.navigation.log_files") %></h2>
|
|
25
|
+
</div>
|
|
26
|
+
|
|
27
|
+
<% @log_file_list.each do |_key, value| %>
|
|
28
|
+
<div class="log-file-row">
|
|
29
|
+
<div class="log-file-row__main">
|
|
30
|
+
<%= link_to(trim_name(value.fetch(:file_name)),
|
|
31
|
+
logs_dashboards_path(log_file: value.fetch(:file_name), date_range: { start: time_now, end: time_now }),
|
|
32
|
+
html_options = {class: "log-file-row__name",
|
|
33
|
+
data: { confirm: t("rails_pretty_logger.confirmations.open_file", size: value[:file_size]) }}) %>
|
|
34
|
+
<span class="log-file-row__meta"><%= t("rails_pretty_logger.logs.file_size", size: value[:file_size]) %></span>
|
|
35
|
+
</div>
|
|
36
|
+
|
|
37
|
+
<% unless rails_pretty_logger_read_only? %>
|
|
38
|
+
<%= button_to(t("rails_pretty_logger.actions.clear"),
|
|
39
|
+
clear_logs_dashboards_path(log_file: value.fetch(:file_name)),
|
|
40
|
+
method: :post,
|
|
41
|
+
class: "clear_logs",
|
|
42
|
+
form: { class: "clear_logs_form",
|
|
43
|
+
data: { turbo_confirm: t("rails_pretty_logger.confirmations.clear_file", file: value.fetch(:file_name).capitalize) }}) %>
|
|
44
|
+
<% end %>
|
|
45
|
+
</div>
|
|
46
|
+
<% end %>
|
|
47
|
+
</section>
|
|
31
48
|
<% end %>
|