rails-pretty-logger 0.1.0 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -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