rails-pretty-logger 0.1.0 → 0.2.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.
@@ -2,9 +2,9 @@ require_dependency "rails/pretty/logger/application_controller"
2
2
 
3
3
  module Rails::Pretty::Logger
4
4
  class DashboardsController < ApplicationController
5
+ before_action :set_logger, except: [:index]
5
6
 
6
7
  def logs
7
- @log = PrettyLogger.new(params)
8
8
  @log_data = @log.log_data
9
9
  end
10
10
 
@@ -13,9 +13,18 @@ module Rails::Pretty::Logger
13
13
  end
14
14
 
15
15
  def clear_logs
16
- PrettyLogger.new(params).clear_logs
16
+ @log.clear_logs
17
17
  redirect_to logs_dashboards_path({log_file: params[:log_file]})
18
18
  end
19
19
 
20
+ private
21
+
22
+ def dashboard_params
23
+ params.permit( :log_file, :utf8, :_method, :authenticity_token, :commit, :page, date_range: [:end, :start, :divider])
24
+ end
25
+
26
+ def set_logger
27
+ @log = PrettyLogger.new(dashboard_params)
28
+ end
20
29
  end
21
30
  end
@@ -0,0 +1,30 @@
1
+ require_dependency "rails/pretty/logger/application_controller"
2
+
3
+ module Rails::Pretty::Logger
4
+ class HourlyLogsController < ApplicationController
5
+ before_action :set_logger, except: [:index]
6
+
7
+ def logs
8
+ @log_data = @log.log_data
9
+ end
10
+
11
+ def index
12
+ @log_file_list = PrettyLogger.get_hourly_log_file_list.select{ |_,file| file[:file_size] > 0 }
13
+ end
14
+
15
+ def clear_logs
16
+ @log.clear_logs
17
+ redirect_to hourly_logs_path({log_file: params[:log_file]})
18
+ end
19
+
20
+ private
21
+
22
+ def hourly_params
23
+ params.permit( :log_file, :utf8, :_method, :authenticity_token, :commit, :page, date_range: [:end, :start, :divider])
24
+ end
25
+
26
+ def set_logger
27
+ @log = PrettyLogger.new(hourly_params)
28
+ end
29
+ end
30
+ end
@@ -2,6 +2,15 @@ module Rails
2
2
  module Pretty
3
3
  module Logger
4
4
  module ApplicationHelper
5
+
6
+ def modify_name(name)
7
+ return "#{name [-13..-10]}/#{name[-9..-8]}/#{name[-7..-6]} : #{name[-4..-1]}"
8
+ end
9
+
10
+ def trim_name(name)
11
+ index = name.split("/log/").last.capitalize
12
+ end
13
+
5
14
  end
6
15
  end
7
16
  end
@@ -1,9 +1,7 @@
1
1
  module Rails::Pretty::Logger
2
2
  module DashboardsHelper
3
3
  def check_highlight(line)
4
- if line.include?("[HIGHLIGHT]")
5
- return "<div class='highlight'>#{line.delete('[HIGHLIGHT]')}</div>".html_safe
6
- end
4
+ return "<div class='highlight'>#{line.remove('[HIGHLIGHT]')}</div>".html_safe if line.include?("[HIGHLIGHT]")
7
5
  line
8
6
  end
9
7
 
@@ -11,6 +9,10 @@ module Rails::Pretty::Logger
11
9
  Time.now.strftime("%Y-%m-%d")
12
10
  end
13
11
 
12
+ def is_stdout?
13
+ ENV["RAILS_LOG_TO_STDOUT"].present?
14
+ end
15
+
14
16
  def set_divider(params)
15
17
  if params[:date_range].blank?
16
18
  100
@@ -22,15 +24,11 @@ module Rails::Pretty::Logger
22
24
  end
23
25
 
24
26
  def is_file_active(name, params)
25
- if params[:log_file] == name
26
- "active"
27
- end
27
+ "active" if params[:log_file] == name
28
28
  end
29
29
 
30
30
  def is_page_active(index, params)
31
- if params[:page].to_i == index
32
- "active"
33
- end
31
+ "active" if params[:page].to_i == index
34
32
  end
35
33
 
36
34
  def check_rails_version
@@ -0,0 +1,21 @@
1
+ <% if log_data.fetch(:error).present? %>
2
+ <p>
3
+ <%= log_data.fetch(:error) %>
4
+ </p>
5
+ <% end %>
6
+
7
+ <% if log_data.fetch(:error).blank? %>
8
+ <% log_data.fetch(:logs_count).times do |index| %>
9
+ <%= link_to(
10
+ index + 1,
11
+ send(locals[:path],
12
+ log_file: params.fetch(:log_file),
13
+ page: index,
14
+ 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
+ ) %>
19
+ <% end %>
20
+ <% end %>
21
+ <hr>
@@ -0,0 +1,14 @@
1
+
2
+ <div class="logger_navbar">
3
+ <p>
4
+ <%= link_to(path_name, hourly_logs_path, html_options = {class: "dashboard_button"}) %>
5
+ </p>
6
+ Log Files:
7
+ <% Rails::Pretty::Logger::PrettyLogger.get_log_file_list.each do |key, value| %>
8
+ <%= link_to(trim_name(value[:file_name]),
9
+ logs_dashboards_path(log_file: value[:file_name], date_range: { start: time_now, end: time_now }),
10
+ 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? " }}) %>
12
+ <% end %>
13
+ </div>
14
+ <hr>
@@ -1,23 +1,31 @@
1
1
  <% if @log_file_list.count == 0 %>
2
- <div>
3
- <h1 class="message">There is no log file to show</h1>
4
- </div>
2
+ <div>
3
+ <h1 class="message">There is no log file to show</h1>
4
+ </div>
5
+
6
+ <% elsif is_stdout?%>
7
+ <div>
8
+ <h1 class="message"> "RAILS_LOG_TO_STDOUT" is present. no logs kept, remove it for logging </h1>
9
+ </div>
5
10
 
6
11
  <% else %>
7
- <div>
8
- Choose your log file :
9
- <% @log_file_list .each do |key, value| %>
10
- <%= link_to(value[:file_name].capitalize,
11
- logs_dashboards_path(log_file: value[:file_name], date_range: { start: time_now, end: time_now }),
12
- html_options = {class: "dashboard_button",
13
- data: { confirm: "Log file size is #{ value[:file_size] } MB. Are you sure to open this file? " }}) %>
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? " }}) %>
14
22
 
15
- <%= link_to("x",
16
- clear_logs_dashboards_path(log_file: value[:file_name]),
17
- html_options = {class: "clear_logs",
18
- method: :post,
19
- data: { confirm: "Are you sure to clear all logs from #{value[:file_name].capitalize}? " }}) %>
20
- <% end %>
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 %>
21
29
 
22
- </div>
30
+ </div>
23
31
  <% end %>
@@ -1,36 +1,6 @@
1
+ <%= render "partials/navbar", path_name: 'Hourly logs' %>
1
2
 
2
- <div>
3
- Log Files:
4
- <% @log.file_list.each do |key, value| %>
5
- <%= link_to(value[:file_name].capitalize,
6
- logs_dashboards_path(log_file: value[:file_name], date_range: { start: time_now, end: time_now }),
7
- html_options = {class: "#{is_file_active(value[:file_name], params)}",
8
- data: { confirm: "Log file size is #{ value[:file_size] } MB. Are you sure to open this file? " }}) %>
9
- <% end %>
10
- </div>
11
- <hr>
12
-
13
- <% if @log_data[:error].present? %>
14
- <p>
15
- <%= @log_data[:error] %>
16
- </p>
17
- <% end %>
18
-
19
- <% if @log_data[:error].blank? %>
20
- <% @log_data[:logs_count].times do |index| %>
21
- <%= link_to(
22
- index + 1,
23
- logs_dashboards_path(
24
- log_file: params[:log_file],
25
- page: index,
26
- date_range: { start: @log.start_date, end: @log.end_date, divider: set_divider(params) }
27
- ),
28
- html_options = {class: "#{is_page_active(index, params)}"}
29
-
30
- ) %>
31
- <% end %>
32
- <% end %>
33
- <hr>
3
+ <%= render "partials/error_pagination", log: @log, log_data: @log_data , locals: {path: "logs_dashboards_path"} %>
34
4
 
35
5
  <div class="form-group">
36
6
  <%= form_for :date_range, url: logs_dashboards_path(log_file: params[:log_file]), method: :post do |f| %>
@@ -56,7 +26,6 @@
56
26
  <% end %>
57
27
  </div>
58
28
 
59
-
60
29
  <hr>
61
30
 
62
31
  <% @log_data[:paginated_logs].each do |line| %>
@@ -0,0 +1,39 @@
1
+ <% if @log_file_list.count == 0 %>
2
+ <div>
3
+ <h1 class="message">There is no log file to show</h1>
4
+ </div>
5
+
6
+ <% else %>
7
+
8
+ <div class="hourly-list">
9
+
10
+ <div id="hourly">
11
+
12
+ <div class="logger_navbar">
13
+ <p>
14
+ <%= link_to('Main Logs',dashboards_path, html_options = {class: "dashboard_button"}) %>
15
+ </p>
16
+
17
+
18
+ </div>
19
+ <input class="search" placeholder="Search" />
20
+ <button class="sort" data-sort="name">
21
+ Sort
22
+ </button>
23
+ <ul class="pagination"></ul>
24
+
25
+ <ul class="list">
26
+ <% @log_file_list .each do |key, value| %>
27
+ <li>
28
+ <h5 class="name">
29
+ <%= link_to(modify_name(value.fetch(:file_name)),
30
+ logs_hourly_logs_path(log_file: value.fetch(:file_name), date_range: { start: time_now, end: time_now }),
31
+ html_options = {class: "dashboard_button",
32
+ data: { confirm: "Log file size is #{ value.fetch(:file_size) } MB. Are you sure to open this file? " }}) %>
33
+ </h5>
34
+ <% end %>
35
+ </li>
36
+ </ul>
37
+ </div>
38
+ </div>
39
+ <% end %>
@@ -0,0 +1,37 @@
1
+ <div class="logger_navbar">
2
+ <p>
3
+ <%= link_to('Main Logs',dashboards_path, html_options = {class: "dashboard_button"}) %>
4
+ <%= link_to('Hourly Logs ', hourly_logs_path, html_options = {class: "dashboard_button"}) %>
5
+ </p>
6
+ </div>
7
+ <hr>
8
+ <% if @log_data[:logs_count] > 0 %>
9
+
10
+ <%= render "partials/error_pagination", log: @log, log_data: @log_data, locals: {path: "logs_hourly_logs_path"} %>
11
+
12
+ <% if @log_data[:logs_count] > 0 %>
13
+ <p>
14
+ <%= link_to("Clear logs",
15
+ clear_logs_hourly_logs_path(log_file: params[:log_file]),
16
+ html_options = {class: "clear_logs",
17
+ method: :post,
18
+ data: { confirm: "Are you sure to clear all logs? " }}) %>
19
+ </p>
20
+ <% end %>
21
+ </div>
22
+
23
+
24
+ <hr>
25
+
26
+ <% @log_data[:paginated_logs].each do |line| %>
27
+ <p>
28
+ <%= check_highlight(line) %>
29
+ </p>
30
+ <% end %>
31
+
32
+ <% else %>
33
+
34
+ <div>
35
+ <h1 class="message">There is no log file to show</h1>
36
+ </div>
37
+ <% end %>
data/config/routes.rb CHANGED
@@ -5,4 +5,10 @@ Rails::Pretty::Logger::Engine.routes.draw do
5
5
  post :logs, on: :collection
6
6
  post :clear_logs, on: :collection
7
7
  end
8
+
9
+ resources :hourly_logs, only: [:index] do
10
+ get :logs, on: :collection
11
+ post :logs, on: :collection
12
+ post :clear_logs, on: :collection
13
+ end
8
14
  end
@@ -1,156 +1,146 @@
1
1
  require "rails/pretty/logger/engine"
2
2
 
3
- module Rails
4
- module Pretty
5
- module Logger
3
+ module Rails::Pretty::Logger
6
4
 
7
- class PrettyLogger
5
+ class PrettyLogger
8
6
 
9
- def initialize(params)
10
- @log_file = File.join(Rails.root, 'log', "#{params[:log_file]}.log")
11
- @filter_params = params
12
- end
13
-
14
- def self.logger
15
- Rails.logger
16
- end
7
+ def initialize(params)
8
+ @log_file = params[:log_file]
9
+ @filter_params = params
10
+ end
17
11
 
18
- def self.highlight(log)
19
- self.logger.tagged('HIGHLIGHT') { logger.info log }
20
- end
12
+ def self.logger
13
+ Rails.logger
14
+ end
21
15
 
22
- def self.file_size(log_file)
23
- File.size?("./#{log_file}").to_f / 2**20
24
- end
16
+ def self.highlight(log)
17
+ self.logger.tagged('HIGHLIGHT') { logger.info log }
18
+ end
25
19
 
20
+ def self.file_size(log_file)
21
+ File.size?("#{log_file}").to_f / 2**20
22
+ end
26
23
 
27
- def self.get_log_file_list
28
- log = {}
29
- log_files = Dir["**/*.log"]
30
- log_files.each_with_index do |log_file,index|
31
- log[index] = {}
32
- log[index][:file_name] = File.basename(log_file, ".log")
33
- log[index][:file_size] = self.file_size(log_file).round(4)
34
- end
35
- return log
36
- end
24
+ def self.get_log_file_list
25
+ log_files = Dir["#{File.join(Rails.root, 'log')}" + "/**.*"]
26
+ self.logs_atr(log_files)
27
+ end
37
28
 
38
- def error
39
- @error
40
- end
29
+ def self.get_hourly_log_file_list
30
+ log_files = Dir["#{Rails.root}/log/hourly/**/*.*"].sort
31
+ self.logs_atr(log_files)
32
+ end
41
33
 
42
- def clear_logs
43
- open(@log_file, File::TRUNC) {}
44
- end
34
+ def self.logs_atr(log_files)
35
+ log = {}
36
+ log_files.each_with_index do |log_file,index|
37
+ log[index] = {}
38
+ log[index][:file_name] = log_file
39
+ log[index][:file_size] = self.file_size(log_file).round(4)
40
+ end
41
+ log
42
+ end
45
43
 
46
- def start_date
47
- if @filter_params[:date_range].present?
48
- @filter_params[:date_range][:start]
49
- else
50
- Time.now.strftime("%Y-%m-%d")
51
- end
52
- end
44
+ def clear_logs
45
+ open(@log_file, File::TRUNC) {}
46
+ end
53
47
 
54
- def end_date
55
- if @filter_params[:date_range].present?
56
- @filter_params[:date_range][:end]
57
- else
58
- Time.now.strftime("%Y-%m-%d")
59
- end
60
- end
48
+ def start_date
49
+ @filter_params.dig(:date_range, :start) || Time.now.strftime("%Y-%m-%d")
50
+ end
61
51
 
62
- def file_list
63
- PrettyLogger.get_log_file_list
64
- end
52
+ def end_date
53
+ @filter_params.dig(:date_range, :end) || Time.now.strftime("%Y-%m-%d")
54
+ end
65
55
 
66
- def filter_logs_with_date(file)
67
- arr = []
56
+ def filter_logs_with_date(file)
57
+ arr = []
58
+ start = false
59
+
60
+ IO.foreach(file) do |line|
61
+ if get_date_from_log_line(line)
62
+ start = true
63
+ arr.push(line)
64
+ elsif start && !(line_include_date?(line))
65
+ arr.push(line)
66
+ else
68
67
  start = false
69
-
70
- IO.foreach(file) do |line|
71
- if get_date_from_log_line(line)
72
- start = true
73
- arr.push(line)
74
- elsif start && !(line_include_date?(line))
75
- arr.push(line)
76
- else
77
- start = false
78
- end
79
- end
80
- return arr
81
68
  end
69
+ end
70
+ return arr
71
+ end
82
72
 
83
- def get_test_logs(file)
84
- arr = []
85
- IO.foreach(file) do |line|
86
- arr.push(line)
87
- end
88
- return arr
89
- end
73
+ def get_test_logs(file)
74
+ arr = []
75
+ IO.foreach(file) do |line|
76
+ arr.push(line)
77
+ end
78
+ return arr
79
+ end
90
80
 
91
- def get_logs_from_file(file)
92
- if @filter_params[:log_file].include?("test")
93
- get_test_logs(file)
94
- else
95
- filter_logs_with_date(file)
96
- end
97
- end
81
+ def get_logs_from_file(file)
82
+ if @filter_params[:log_file].include?("test") || @filter_params[:log_file].include?("hourly")
83
+ get_test_logs(file)
84
+ else
85
+ filter_logs_with_date(file)
86
+ end
87
+ end
98
88
 
99
- def get_date_from_log_line(line)
100
- params = @filter_params[:date_range]
101
- if line_include_date?(line)
102
- date_string_index = line.index("at ")
103
- string_date = line[date_string_index .. date_string_index + 13]
104
- date = string_date.to_date.strftime("%Y-%m-%d")
105
- if params.present?
106
- date.between?(params[:start], params[:end])
107
- else
108
- date.between?(Time.now.strftime("%Y-%m-%d"), Time.now.strftime("%Y-%m-%d"))
109
- end
110
- end
89
+ def get_date_from_log_line(line)
90
+ params = @filter_params[:date_range]
91
+ if line_include_date?(line)
92
+ date_string_index = line.index("at ")
93
+ string_date = line[date_string_index .. date_string_index + 13]
94
+ date = string_date.to_date.strftime("%Y-%m-%d")
95
+ start_date = @filter_params.dig(:date_range, :start)
96
+ end_date = @filter_params.dig(:date_range, :end)
97
+ if start_date.present? && end_date.present?
98
+ date.between?(start_date, end_date)
99
+ else
100
+ date.between?(Time.now.strftime("%Y-%m-%d"), Time.now.strftime("%Y-%m-%d"))
111
101
  end
102
+ end
103
+ end
112
104
 
113
- def line_include_date?(line)
114
- line.include?("Started")
115
- end
105
+ def line_include_date?(line)
106
+ line.include?("Started")
107
+ end
116
108
 
117
- def validate_date
118
- params = @filter_params[:date_range]
119
- if params.present?
120
- if (params[:start].present? && params[:end].present?)
121
- if (params[:start] > params[:end])
122
- "End Date should not be less than Start Date."
123
- end
124
- elsif params[:start].blank? || params[:end].blank?
125
- "Start and End Date must be given."
126
- end
127
- end
109
+ def validate_date
110
+ start_date = @filter_params.dig(:date_range, :start)
111
+ end_date = @filter_params.dig(:date_range, :end)
112
+ if (start_date.present? && end_date.present?)
113
+ if (start_date > end_date)
114
+ "End Date should not be less than Start Date."
128
115
  end
116
+ else
117
+ "Start and End Date must be given."
118
+ end
119
+ end
129
120
 
130
- def log_data
131
- error = validate_date
132
- divider = set_divider_value
133
- logs = get_logs_from_file(@log_file)
134
- logs_count = (logs.count.to_f / divider).ceil
135
- paginated_logs = logs[ @filter_params[:page].to_i * divider ..
136
- (@filter_params[:page].to_i * divider) + divider ]
137
- data = {}
138
- data[:logs_count] = logs_count
139
- data[:paginated_logs] = paginated_logs
140
- data[:error] = error
141
- return data
142
- end
121
+ def log_data
122
+ error = validate_date
123
+ divider = set_divider_value
124
+ logs = get_logs_from_file(@log_file)
125
+ logs_count = (logs.count.to_f / divider).ceil
126
+ paginated_logs = logs[ @filter_params[:page].to_i * divider ..
127
+ (@filter_params[:page].to_i * divider) + divider ]
128
+ data = {}
129
+ data[:logs_count] = logs_count
130
+ data[:paginated_logs] = paginated_logs
131
+ data[:error] = error
132
+ return data
133
+ end
143
134
 
144
- def set_divider_value
145
- if @filter_params[:date_range].blank?
146
- 100
147
- elsif @filter_params[:date_range][:divider].blank?
148
- 100
149
- else
150
- @filter_params[:date_range][:divider].to_i
151
- end
152
- end
135
+ def set_divider_value
136
+ if @filter_params[:date_range].blank?
137
+ 100
138
+ elsif @filter_params[:date_range][:divider].blank?
139
+ 100
140
+ else
141
+ @filter_params[:date_range][:divider].to_i
153
142
  end
154
143
  end
144
+
155
145
  end
156
146
  end