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.
@@ -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
- include Rails::Pretty::Logger
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
@@ -1,7 +1,7 @@
1
1
  module Rails
2
2
  module Pretty
3
3
  module Logger
4
- VERSION = '0.1.0'
4
+ VERSION = '0.2.0'
5
5
  end
6
6
  end
7
7
  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.1.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-02-07 00:00:00.000000000 Z
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: ": Description of Rails::Pretty::Logger."
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: ": Summary of Rails::Pretty::Logger."
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: []