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.
- checksums.yaml +4 -4
- data/README.md +18 -1
- data/app/assets/javascripts/rails/pretty/logger/application.js +13 -0
- data/app/assets/javascripts/rails/pretty/logger/list.min.js +2 -0
- data/app/assets/stylesheets/rails/pretty/logger/dashboards.css +126 -112
- data/app/assets/stylesheets/rails/pretty/logger/list.css +94 -0
- data/app/controllers/rails/pretty/logger/dashboards_controller.rb +11 -2
- data/app/controllers/rails/pretty/logger/hourly_logs_controller.rb +30 -0
- data/app/helpers/rails/pretty/logger/application_helper.rb +9 -0
- data/app/helpers/rails/pretty/logger/dashboards_helper.rb +7 -9
- data/app/views/partials/_error_pagination.html.erb +21 -0
- data/app/views/partials/_navbar.html.erb +14 -0
- data/app/views/rails/pretty/logger/dashboards/index.html.erb +25 -17
- data/app/views/rails/pretty/logger/dashboards/logs.html.erb +2 -33
- data/app/views/rails/pretty/logger/hourly_logs/index.html.erb +39 -0
- data/app/views/rails/pretty/logger/hourly_logs/logs.html.erb +37 -0
- data/config/routes.rb +6 -0
- data/lib/rails/pretty/logger.rb +117 -127
- data/lib/rails/pretty/logger/active_support_logger.rb +107 -0
- data/lib/rails/pretty/logger/config/logger_config.rb +17 -0
- data/lib/rails/pretty/logger/console_formatter.rb +14 -0
- data/lib/rails/pretty/logger/console_logger.rb +14 -0
- data/lib/rails/pretty/logger/engine.rb +2 -5
- data/lib/rails/pretty/logger/rails_logger.rb +153 -0
- data/lib/rails/pretty/logger/version.rb +1 -1
- metadata +20 -4
@@ -0,0 +1,107 @@
|
|
1
|
+
require "rails/pretty/logger/console_formatter"
|
2
|
+
require "rails/pretty/logger/rails_logger"
|
3
|
+
|
4
|
+
module Rails::Pretty::Logger
|
5
|
+
|
6
|
+
class ActiveSupportLogger < RailsLogger
|
7
|
+
include ActiveSupport::LoggerThreadSafeLevel
|
8
|
+
include LoggerSilence
|
9
|
+
|
10
|
+
# Returns true if the logger destination matches one of the sources
|
11
|
+
#
|
12
|
+
# logger = Logger.new(STDOUT)
|
13
|
+
# ActiveSupport::Logger.logger_outputs_to?(logger, STDOUT)
|
14
|
+
# # => true
|
15
|
+
def self.logger_outputs_to?(logger, *sources)
|
16
|
+
logdev = logger.instance_variable_get("@logdev")
|
17
|
+
logger_source = logdev.dev if logdev.respond_to?(:dev)
|
18
|
+
sources.any? { |source| source == logger_source }
|
19
|
+
end
|
20
|
+
|
21
|
+
# Broadcasts logs to multiple loggers.
|
22
|
+
def self.broadcast(logger) # :nodoc:
|
23
|
+
Module.new do
|
24
|
+
define_method(:add) do |*args, &block|
|
25
|
+
logger.add(*args, &block)
|
26
|
+
super(*args, &block)
|
27
|
+
end
|
28
|
+
|
29
|
+
define_method(:<<) do |x|
|
30
|
+
logger << x
|
31
|
+
super(x)
|
32
|
+
end
|
33
|
+
|
34
|
+
define_method(:close) do
|
35
|
+
logger.close
|
36
|
+
super()
|
37
|
+
end
|
38
|
+
|
39
|
+
define_method(:progname=) do |name|
|
40
|
+
logger.progname = name
|
41
|
+
super(name)
|
42
|
+
end
|
43
|
+
|
44
|
+
define_method(:formatter=) do |formatter|
|
45
|
+
logger.formatter = formatter
|
46
|
+
super(formatter)
|
47
|
+
end
|
48
|
+
|
49
|
+
define_method(:level=) do |level|
|
50
|
+
logger.level = level
|
51
|
+
super(level)
|
52
|
+
end
|
53
|
+
|
54
|
+
define_method(:local_level=) do |level|
|
55
|
+
logger.local_level = level if logger.respond_to?(:local_level=)
|
56
|
+
super(level) if respond_to?(:local_level=)
|
57
|
+
end
|
58
|
+
|
59
|
+
define_method(:silence) do |level = Logger::ERROR, &block|
|
60
|
+
if logger.respond_to?(:silence)
|
61
|
+
logger.silence(level) do
|
62
|
+
if defined?(super)
|
63
|
+
super(level, &block)
|
64
|
+
else
|
65
|
+
block.call(self)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
else
|
69
|
+
if defined?(super)
|
70
|
+
super(level, &block)
|
71
|
+
else
|
72
|
+
block.call(self)
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
def initialize(*args)
|
80
|
+
super
|
81
|
+
@formatter = SimpleFormatter.new
|
82
|
+
after_initialize if respond_to? :after_initialize
|
83
|
+
end
|
84
|
+
|
85
|
+
def add(severity, message = nil, progname = nil, &block)
|
86
|
+
return true if @logdev.nil? || (severity || UNKNOWN) < level
|
87
|
+
super
|
88
|
+
end
|
89
|
+
|
90
|
+
RailsLogger::Severity.constants.each do |severity|
|
91
|
+
class_eval(<<-EOT, __FILE__, __LINE__ + 1)
|
92
|
+
def #{severity.downcase}? # def debug?
|
93
|
+
RailsLogger::#{severity} >= level # DEBUG >= level
|
94
|
+
end # end
|
95
|
+
EOT
|
96
|
+
end
|
97
|
+
|
98
|
+
# Simple formatter which only displays the message.
|
99
|
+
class SimpleFormatter < RailsLogger::Formatter
|
100
|
+
# This method is invoked when a log event occurs
|
101
|
+
def call(severity, timestamp, progname, msg)
|
102
|
+
"#{String === msg ? msg : msg.inspect}\n"
|
103
|
+
end
|
104
|
+
end
|
105
|
+
end
|
106
|
+
|
107
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require "rails/pretty/logger/console_logger"
|
2
|
+
require "rails/pretty/logger/active_support_logger"
|
3
|
+
|
4
|
+
|
5
|
+
module Rails
|
6
|
+
module Pretty
|
7
|
+
module Logger
|
8
|
+
module Config
|
9
|
+
|
10
|
+
class LoggerConfig < Rails::Application
|
11
|
+
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
module Rails::Pretty::Logger
|
4
|
+
|
5
|
+
class ConsoleFormatter < ::Logger::Formatter
|
6
|
+
def call(severity, timestamp, _progname, msg)
|
7
|
+
|
8
|
+
formatted_severity = format('%-5s', severity.to_s)
|
9
|
+
formatted_time = timestamp.strftime('%Y-%m-%d %H:%M:%S')
|
10
|
+
"#{formatted_time} || #{formatted_severity}| #{msg}\n"
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
@@ -0,0 +1,14 @@
|
|
1
|
+
require "rails/pretty/logger/console_formatter"
|
2
|
+
require "rails/pretty/logger/active_support_logger"
|
3
|
+
|
4
|
+
module Rails::Pretty::Logger
|
5
|
+
|
6
|
+
class ConsoleLogger < ActiveSupportLogger
|
7
|
+
|
8
|
+
def initialize(*args)
|
9
|
+
super(*args)
|
10
|
+
@formatter = ConsoleFormatter.new
|
11
|
+
end
|
12
|
+
end
|
13
|
+
|
14
|
+
end
|
@@ -4,12 +4,9 @@ module Rails
|
|
4
4
|
class Engine < ::Rails::Engine
|
5
5
|
isolate_namespace Rails::Pretty::Logger
|
6
6
|
ActiveSupport.on_load(:action_controller) do
|
7
|
-
|
8
|
-
end
|
9
|
-
|
10
|
-
config.generators do |g|
|
11
|
-
g.test_framework :rspec
|
7
|
+
include Rails::Pretty::Logger
|
12
8
|
end
|
9
|
+
|
13
10
|
end
|
14
11
|
end
|
15
12
|
end
|
@@ -0,0 +1,153 @@
|
|
1
|
+
|
2
|
+
module Rails::Pretty::Logger
|
3
|
+
|
4
|
+
class RailsLogger < ::Logger
|
5
|
+
|
6
|
+
def initialize(logdev, shift_age = 0, shift_size = 1048576, file_count: nil, level: DEBUG,
|
7
|
+
progname: nil, formatter: nil, datetime_format: nil,
|
8
|
+
shift_period_suffix: '%Y%m%d')
|
9
|
+
|
10
|
+
self.level = level
|
11
|
+
self.progname = progname
|
12
|
+
@default_formatter = Formatter.new
|
13
|
+
self.datetime_format = datetime_format
|
14
|
+
self.formatter = formatter
|
15
|
+
@logdev = nil
|
16
|
+
if logdev
|
17
|
+
log_name = "log/" + logdev + ".log"
|
18
|
+
@logdev = LoggerDevice.new(log_name, :shift_age => shift_age,
|
19
|
+
:shift_size => shift_size,
|
20
|
+
:shift_period_suffix => shift_period_suffix, file_count: file_count )
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
module Period
|
25
|
+
module_function
|
26
|
+
|
27
|
+
SiD = 24 * 60 * 60
|
28
|
+
|
29
|
+
def next_rotate_time(now, shift_age)
|
30
|
+
case shift_age
|
31
|
+
when 'hourly'
|
32
|
+
t = Time.mktime(now.year, now.month, now.mday, now.hour + 1)
|
33
|
+
when 'daily'
|
34
|
+
t = Time.mktime(now.year, now.month, now.mday) + SiD
|
35
|
+
when 'weekly'
|
36
|
+
t = Time.mktime(now.year, now.month, now.mday) + SiD * (7 - now.wday)
|
37
|
+
when 'monthly'
|
38
|
+
t = Time.mktime(now.year, now.month, 1) + SiD * 32
|
39
|
+
return Time.mktime(t.year, t.month, 1)
|
40
|
+
else
|
41
|
+
return now
|
42
|
+
end
|
43
|
+
if (t.hour.nonzero? or t.min.nonzero? or t.sec.nonzero?) && shift_age != 'hourly'
|
44
|
+
hour = t.hour
|
45
|
+
t = Time.mktime(t.year, t.month, t.mday)
|
46
|
+
t += SiD if hour > 12
|
47
|
+
|
48
|
+
elsif shift_age == 'hourly'
|
49
|
+
t = Time.mktime(now.year, now.month, now.mday, now.hour + 1)
|
50
|
+
end
|
51
|
+
t
|
52
|
+
end
|
53
|
+
|
54
|
+
def previous_period_end(now, shift_age)
|
55
|
+
case shift_age
|
56
|
+
when 'hourly'
|
57
|
+
t = Time.mktime(now.year, now.month, now.mday, now.hour - 1)
|
58
|
+
when 'daily'
|
59
|
+
t = Time.mktime(now.year, now.month, now.mday) - SiD / 2
|
60
|
+
when 'weekly'
|
61
|
+
t = Time.mktime(now.year, now.month, now.mday) - (SiD * now.wday + SiD / 2)
|
62
|
+
when 'monthly'
|
63
|
+
t = Time.mktime(now.year, now.month, 1) - SiD / 2
|
64
|
+
else
|
65
|
+
return now
|
66
|
+
end
|
67
|
+
|
68
|
+
if shift_age == 'hourly'
|
69
|
+
|
70
|
+
Time.mktime(t.year, t.month, t.mday, t.hour, t.min, t.sec)
|
71
|
+
else
|
72
|
+
Time.mktime(t.year, t.month, t.mday, 23, 59, 59)
|
73
|
+
end
|
74
|
+
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
class LoggerDevice < LogDevice
|
79
|
+
include Period
|
80
|
+
|
81
|
+
def initialize(log = nil, shift_age: nil, shift_size: nil, shift_period_suffix: nil, file_count: nil)
|
82
|
+
@dev = @filename = @shift_age = @shift_size = @shift_period_suffix = @file_count = nil
|
83
|
+
mon_initialize
|
84
|
+
set_dev(log)
|
85
|
+
if @filename
|
86
|
+
@shift_age = shift_age || 7
|
87
|
+
@shift_size = shift_size || 1048576
|
88
|
+
@shift_period_suffix = shift_period_suffix || '%Y%m%d'
|
89
|
+
@file_count = file_count || 48
|
90
|
+
unless @shift_age.is_a?(Integer)
|
91
|
+
base_time = @dev.respond_to?(:stat) ? @dev.stat.mtime : Time.now
|
92
|
+
@next_rotate_time = next_rotate_time(base_time, @shift_age)
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
def shift_log_period(period_end)
|
98
|
+
suffix = period_end.strftime(@shift_period_suffix)
|
99
|
+
|
100
|
+
suffix_year = period_end.strftime('%Y')
|
101
|
+
suffix_month = period_end.strftime('%m')
|
102
|
+
suffix_day = period_end.strftime('%d')
|
103
|
+
|
104
|
+
if @shift_age == 'hourly'
|
105
|
+
suffix = period_end.strftime('%Y%m%d_%H%M')
|
106
|
+
end
|
107
|
+
|
108
|
+
age_file = "#{@filename}.#{suffix}"
|
109
|
+
|
110
|
+
|
111
|
+
if FileTest.exist?(age_file)
|
112
|
+
# try to avoid filename crash caused by Timestamp change.
|
113
|
+
idx = 0
|
114
|
+
# .99 can be overridden; avoid too much file search with 'loop do'
|
115
|
+
while idx < 100
|
116
|
+
idx += 1
|
117
|
+
age_file = "#{@filename}.#{suffix}.#{idx}"
|
118
|
+
break unless FileTest.exist?(age_file)
|
119
|
+
end
|
120
|
+
end
|
121
|
+
|
122
|
+
#delete old files
|
123
|
+
log_files = Dir[ File.join(Rails.root, 'log', 'hourly') + "/#{suffix_year}/**/*"].reject {|fn| File.directory?(fn) }
|
124
|
+
|
125
|
+
log_files_length = log_files.length
|
126
|
+
|
127
|
+
while (log_files_length > @file_count) do
|
128
|
+
arr = []
|
129
|
+
log_files.each { |x| arr.push(File.ctime(x).to_i) }
|
130
|
+
|
131
|
+
file_index = arr.index(arr.min)
|
132
|
+
|
133
|
+
file_path = log_files[file_index]
|
134
|
+
File.delete(file_path) if File.exist?(file_path)
|
135
|
+
|
136
|
+
log_files = Dir[ File.join(Rails.root, 'log', 'hourly') + "/#{suffix_year}/**/*"].reject {|fn| File.directory?(fn) }
|
137
|
+
log_files_length = log_files.length
|
138
|
+
end
|
139
|
+
|
140
|
+
@dev.close rescue nil
|
141
|
+
|
142
|
+
File.rename("#{@filename}", age_file)
|
143
|
+
old_log_path = Rails.root.join(age_file)
|
144
|
+
new_path = File.join(Rails.root, 'log', 'hourly', suffix_year, suffix_month, suffix_day)
|
145
|
+
FileUtils.mkdir_p new_path
|
146
|
+
FileUtils.mv old_log_path, new_path, :force => true
|
147
|
+
@dev = create_logfile(@filename)
|
148
|
+
return true
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
end
|
153
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rails-pretty-logger
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Cem
|
8
|
+
- Mehmet
|
8
9
|
autorequire:
|
9
10
|
bindir: bin
|
10
11
|
cert_chain: []
|
11
|
-
date: 2019-
|
12
|
+
date: 2019-04-11 00:00:00.000000000 Z
|
12
13
|
dependencies:
|
13
14
|
- !ruby/object:Gem::Dependency
|
14
15
|
name: rails
|
@@ -58,9 +59,11 @@ dependencies:
|
|
58
59
|
- - "~>"
|
59
60
|
- !ruby/object:Gem::Version
|
60
61
|
version: '3.6'
|
61
|
-
description: "
|
62
|
+
description: " With Pretty logger, can check your logs from web page, can also easily
|
63
|
+
check your logs with hourly rotation "
|
62
64
|
email:
|
63
65
|
- cbaykam@gmail.com
|
66
|
+
- mehmetcelik4@gmail.com
|
64
67
|
executables: []
|
65
68
|
extensions: []
|
66
69
|
extra_rdoc_files: []
|
@@ -71,19 +74,31 @@ files:
|
|
71
74
|
- app/assets/config/rails_pretty_logger_manifest.js
|
72
75
|
- app/assets/javascripts/rails/pretty/logger/application.js
|
73
76
|
- app/assets/javascripts/rails/pretty/logger/dashboards.js
|
77
|
+
- app/assets/javascripts/rails/pretty/logger/list.min.js
|
74
78
|
- app/assets/stylesheets/rails/pretty/logger/application.css
|
75
79
|
- app/assets/stylesheets/rails/pretty/logger/dashboards.css
|
80
|
+
- app/assets/stylesheets/rails/pretty/logger/list.css
|
76
81
|
- app/controllers/rails/pretty/logger/application_controller.rb
|
77
82
|
- app/controllers/rails/pretty/logger/dashboards_controller.rb
|
83
|
+
- app/controllers/rails/pretty/logger/hourly_logs_controller.rb
|
78
84
|
- app/helpers/rails/pretty/logger/application_helper.rb
|
79
85
|
- app/helpers/rails/pretty/logger/dashboards_helper.rb
|
80
86
|
- app/models/rails/pretty/logger/application_record.rb
|
81
87
|
- app/views/layouts/rails/pretty/logger/application.html.erb
|
88
|
+
- app/views/partials/_error_pagination.html.erb
|
89
|
+
- app/views/partials/_navbar.html.erb
|
82
90
|
- app/views/rails/pretty/logger/dashboards/index.html.erb
|
83
91
|
- app/views/rails/pretty/logger/dashboards/logs.html.erb
|
92
|
+
- app/views/rails/pretty/logger/hourly_logs/index.html.erb
|
93
|
+
- app/views/rails/pretty/logger/hourly_logs/logs.html.erb
|
84
94
|
- config/routes.rb
|
85
95
|
- lib/rails/pretty/logger.rb
|
96
|
+
- lib/rails/pretty/logger/active_support_logger.rb
|
97
|
+
- lib/rails/pretty/logger/config/logger_config.rb
|
98
|
+
- lib/rails/pretty/logger/console_formatter.rb
|
99
|
+
- lib/rails/pretty/logger/console_logger.rb
|
86
100
|
- lib/rails/pretty/logger/engine.rb
|
101
|
+
- lib/rails/pretty/logger/rails_logger.rb
|
87
102
|
- lib/rails/pretty/logger/version.rb
|
88
103
|
- lib/tasks/rails/pretty/logger_tasks.rake
|
89
104
|
homepage: https://github.com/kekik/rails-pretty-logger
|
@@ -109,5 +124,6 @@ rubyforge_project:
|
|
109
124
|
rubygems_version: 2.6.11
|
110
125
|
signing_key:
|
111
126
|
specification_version: 4
|
112
|
-
summary:
|
127
|
+
summary: Pretty Logger is a logging framework which can be checked from '/your-web-page/rails-pretty-logger/dashboards',
|
128
|
+
can also debug easily with highlight method. And can add Hourly log rotation.
|
113
129
|
test_files: []
|