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.
Files changed (39) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +215 -35
  3. data/app/assets/javascripts/rails/pretty/logger/application.js +16 -23
  4. data/app/assets/stylesheets/rails/pretty/logger/application.css +1 -15
  5. data/app/assets/stylesheets/rails/pretty/logger/dashboards.css +463 -141
  6. data/app/assets/stylesheets/rails/pretty/logger/list.css +1 -94
  7. data/app/controllers/rails/pretty/logger/application_controller.rb +31 -0
  8. data/app/controllers/rails/pretty/logger/dashboards_controller.rb +9 -4
  9. data/app/controllers/rails/pretty/logger/hourly_logs_controller.rb +36 -4
  10. data/app/helpers/rails/pretty/logger/application_helper.rb +32 -0
  11. data/app/helpers/rails/pretty/logger/dashboards_helper.rb +114 -14
  12. data/app/views/layouts/rails/pretty/logger/application.html.erb +9 -8
  13. data/app/views/partials/_error_pagination.html.erb +12 -10
  14. data/app/views/partials/_log_entries.html.erb +5 -0
  15. data/app/views/partials/_log_filters.html.erb +14 -0
  16. data/app/views/partials/_pretyyloggernavbar.html.erb +14 -9
  17. data/app/views/rails/pretty/logger/dashboards/index.html.erb +37 -20
  18. data/app/views/rails/pretty/logger/dashboards/logs.html.erb +33 -14
  19. data/app/views/rails/pretty/logger/hourly_logs/index.html.erb +49 -25
  20. data/app/views/rails/pretty/logger/hourly_logs/logs.html.erb +35 -14
  21. data/config/locales/rails_pretty_logger.en.yml +35 -0
  22. data/config/locales/rails_pretty_logger.tr.yml +35 -0
  23. data/lib/generators/rails_pretty_logger/install/install_generator.rb +29 -0
  24. data/lib/generators/rails_pretty_logger/install/templates/rails_pretty_logger.rb +20 -0
  25. data/lib/rails/pretty/logger/active_support_logger.rb +3 -7
  26. data/lib/rails/pretty/logger/config/logger_config.rb +0 -16
  27. data/lib/rails/pretty/logger/configuration.rb +18 -0
  28. data/lib/rails/pretty/logger/console_logger.rb +2 -2
  29. data/lib/rails/pretty/logger/engine.rb +22 -4
  30. data/lib/rails/pretty/logger/rails_logger.rb +62 -41
  31. data/lib/rails/pretty/logger/version.rb +1 -1
  32. data/lib/rails/pretty/logger.rb +547 -31
  33. data/lib/tasks/rails/pretty/logger_tasks.rake +36 -23
  34. metadata +79 -38
  35. data/Rakefile +0 -22
  36. data/app/assets/javascripts/rails/pretty/logger/dashboards.js +0 -2
  37. data/app/assets/javascripts/rails/pretty/logger/list.min.js +0 -2
  38. data/app/models/rails/pretty/logger/application_record.rb +0 -9
  39. data/app/assets/config/{rails_pretty_logger_manifest.js → manifest.js} +1 -1
@@ -1,94 +1 @@
1
- .clear_logs {
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: params[: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
- @log_file_list = PrettyLogger.get_hourly_log_file_list.select{ |_,file| file[:file_size] > 0 }
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: params[: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
- return "<div class='highlight'>#{line.remove('[HIGHLIGHT]')}</div>".html_safe if line.include?("[HIGHLIGHT]")
5
- if line.include?("Parameters:")
6
- parse_parameters(line)
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 check_rails_version
39
- Rails::VERSION::STRING[0..2].to_f < 5.2
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 parse_parameters(line)
43
- parameters = line[line.index("Parameters:") + 12 ..line.length]
44
- hash = JSON.parse parameters.gsub('=>', ':') rescue nil
45
- if hash.nil?
46
- line
47
- else
48
- h = hash.reduce("<strong> Parameters: </strong> <br/> ") {|memo, (k,v)| memo += "<strong> #{k}: </strong> #{v}, "} rescue nil
49
- h.html_safe rescue nil
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
- <% if check_rails_version %>
6
- <%= csrf_meta_tags %>
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 "rails/pretty/logger/application", media: "all" %>
13
- <%= javascript_include_tag "rails/pretty/logger/application" %>
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
- index + 1,
11
- send(locals[:path],
12
- log_file: params.fetch(:log_file),
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
- html_options = {class: "#{is_page_active(index, params)}"}
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,5 @@
1
+ <div class="log-entries">
2
+ <% log_data.fetch(:paginated_logs).each do |entry| %>
3
+ <%= rails_pretty_logger_log_entry(entry) %>
4
+ <% end %>
5
+ </div>
@@ -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
- <p>
4
- <%= link_to(path_name, hourly_logs_path, html_options = {class: "dashboard_button"}) %>
5
- </p>
6
- Log Files:
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
- <%= link_to(trim_name(value[:file_name]),
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: "Log file size is #{ value[:file_size] } MB. Are you sure to open this file? " }}) %>
17
+ data: { confirm: t("rails_pretty_logger.confirmations.open_file", size: value[:file_size]) }}) %>
12
18
  <% end %>
13
- </div>
14
- <hr>
19
+ </nav>
@@ -1,31 +1,48 @@
1
1
  <% if @log_file_list.count == 0 %>
2
- <div>
3
- <h1 class="message">There is no log file to show</h1>
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"> "RAILS_LOG_TO_STDOUT" is present. no logs kept, remove it for logging </h1>
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
- <p>
14
- <%= link_to('Hourly logs', hourly_logs_path, html_options = {class: "dashboard_button"}) %>
15
- </p>
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 %>