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.
@@ -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: []