hot_catch 0.1.2 → 0.1.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 9c3ffc6c97a1c071dd500eb5bf63d32525484983
4
- data.tar.gz: 3ab01fd9408f014fe245dfbfba5cc75d83b372e5
3
+ metadata.gz: d30ed8cb373a76a5c27b352bb56a5f0694bf4f7e
4
+ data.tar.gz: 7938dab531e6cde13405ea25831f5097f1a6a75a
5
5
  SHA512:
6
- metadata.gz: 51f63b5bd8658ac2feed968223acecf87264c1d7dd2b02b095f53ae24d2ffd82655a4ea7f73d6e6d4e126bb5c943f61537d1beef7b572aa088d1559fe3e7dd24
7
- data.tar.gz: d37489e27e967197f739988a0418c706d549f5fb55f9f3e4b015903668593db468d3ee678cbdec022558af476de5fcd5bc99913e381a007adb9f08c9057a3572
6
+ metadata.gz: 8d70f6af9e7b6133465bcb85c9acb36639ca44f9c8522bb5fb598fc69e8a25c3f24fddf006cdf4ee064c4dde5a6e8efe51f3d604ba07cedb050d84ba4a2ec7da
7
+ data.tar.gz: 6f430732e4f7432361d6c09d0ecc94d873730a3442f49bb6c312a8fcca9b377e9e6d70f876e023dee1ba2524d564251751983fed363b8dbf6ec6a71f2517049c
data/README.md CHANGED
@@ -1,18 +1,5 @@
1
1
  # HotCatch
2
- Данный гем позволяет изменить логирование в базу данных и посылать
3
- запросы на главный сервер.
4
-
5
- ## Использование
6
- Логи можно посмотреть в консоли:
7
- ```ruby
8
- > HotCatchLog.all
9
- > HotCatchLog.first.log_data
10
- ```
11
- В данной реализации логи разделены по статусам запросов (поле `status HotCatchLog`).
12
- Кроме того одинаковые ошибки собираются в одну, при этом увеличивается счётчик в моделе `HotCatchLog` поле `count_log`.
13
-
14
- Ответы от сервера, куда отправляются логи, доступен в файле `log/hot_catch_log_response_errors`.
15
- Если всё порядке - этого файла нет или он пуст.
2
+ Данный гем позволяет посылать лог-данные на главный сервер.
16
3
 
17
4
  ## Установка
18
5
  1. Добавить гем в `Gemfile`
@@ -22,11 +9,14 @@ gem 'hot_catch'
22
9
  2. `$ bundle install`
23
10
  3. Запустить генератор установки: `$ rails generate hot_catch:install`
24
11
  Для удаления: `$ rails generate hot_catch:uninstall`
25
- 4. `$ rails db:migrate`
26
- 5. Изменить в `config/hot_catch_config.json` url - адрес сервера для отправки лог файлов.
12
+ 4. Изменить в `config/hot_catch_config.json` url - адрес сервера для отправки лог файлов.
27
13
  Автоматически запросы посылаются на адрес *url/main_hot_catch_logs*, но нужно указать только *url*.
28
14
 
29
- Это всё! Теперь все логи формируются в базе данных.
15
+ Это всё! Теперь логи автоматически посылаются на сервер.
16
+
17
+ ## Примечание
18
+ Ответы от сервера, куда отправляются логи, доступен в файле `log/hot_catch_log_response_errors`.
19
+ Если всё порядке - этого файла нет или он пуст.
30
20
 
31
21
  ## License
32
22
  The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
@@ -7,35 +7,7 @@ module HotCatch
7
7
  # Включение всех файлов из указанной папки относительно __FILE__ (то есть текущего файла)
8
8
  source_root File.expand_path('../../../hot_catch', __FILE__)
9
9
  # include Rails::Generators::Migration
10
-
11
- def add_model_hot_catch
12
- create_file "db/migrate/20170729154223_create_hot_catch_log.rb" do
13
- <<RUBY
14
- class CreateHotCatchLog < ActiveRecord::Migration[5.0]
15
- def change
16
- create_table :hot_catch_logs do |t|
17
- t.string :log_data, null: false
18
- t.integer :count_log, default: 1, null: false
19
- t.string :status, null: false
20
-
21
- t.timestamps
22
- end
23
- end
24
- end
25
- RUBY
26
- end
27
-
28
- create_file "app/models/application_record.rb" do
29
- "class ApplicationRecord < ActiveRecord::Base
30
- self.abstract_class = true
31
- end"
32
- end unless File.exist? "app/models/application_record.rb"
33
-
34
-
35
- copy_file "hot_catch_log.rb", "app/models/hot_catch_log.rb"
36
- end
37
-
38
-
10
+
39
11
  def add_rack_logger
40
12
  copy_file "hot_catch_logger.rb", "config/hot_catch_logger.rb"
41
13
  end
@@ -6,11 +6,6 @@ module HotCatch
6
6
  class UninstallGenerator < Rails::Generators::Base
7
7
  # include Rails::Generators::Migration
8
8
 
9
- def remove_model_hot_catch
10
- remove_file "db/migrate/20170729154223_create_hot_catch_log.rb"
11
- remove_file "app/models/hot_catch_log.rb"
12
- end
13
-
14
9
  def remove_rack_logger
15
10
  remove_file "config/hot_catch_logger.rb"
16
11
  end
@@ -25,7 +20,6 @@ module HotCatch
25
20
 
26
21
  def remove_log_files
27
22
  remove_file "tmp/hot_catch_buf_file"
28
- remove_file "tmp/hot_catch_buf_file2"
29
23
  end
30
24
 
31
25
  def remove_hot_catch_config
data/lib/hot_catch.rb CHANGED
@@ -12,11 +12,8 @@ module HotCatch
12
12
  # ====================================
13
13
  # body_log = {main_hot_catch_log: {
14
14
  # "log_data":"some message",
15
- # "name_app":"new6_app",
16
- # "count_log":10,
17
- # "id_log_origin_app":1,
18
- # "from_log":"Rails",
19
- # "status":"SERVER_ERROR"}
15
+ # "name_app":"my_app",
16
+ # "from_log":"Rails"}
20
17
  # }
21
18
  # ====================================
22
19
  # 4. sender_logs.send_log(body_log)
@@ -30,14 +27,12 @@ module HotCatch
30
27
  @url += "/main_hot_catch_logs"
31
28
  end
32
29
 
33
- def rails_g_log(log_data, count_log, id_log, status)
30
+ def rails_g_log(log_data, status)
34
31
  send_log(
35
32
  {main_hot_catch_log:
36
33
  {
37
34
  "log_data":log_data,
38
35
  "name_app":Rails.application.class.parent_name,
39
- "count_log":count_log,
40
- "id_log_origin_app":id_log,
41
36
  "from_log":"Rails",
42
37
  "status":status
43
38
  }
@@ -47,10 +42,14 @@ module HotCatch
47
42
 
48
43
  def send_log(body_log)
49
44
  response = call(@url, body_log)
50
- # логируется, если на запрос пришёл какой-либо ответ
45
+ # если на зпрос пришёл ответ, то пришло уведомление об ошибке, которое логируется
51
46
  unless response.empty?
52
47
  str = "\n" + (?-*20) + "\n#{Time.now}\nlogs:\n#{body_log.to_s}\nresponse\n:#{response}\n" + (?-*20) + "\n"
53
- File.open("log/hot_catch_log_response_errors", 'a'){ |file| file.write str }
48
+ File.open("log/hot_catch_log_response_errors", 'a'){ |file| file.write str.encode('UTF-8', {
49
+ :invalid => :replace,
50
+ :undef => :replace,
51
+ :replace => '?'
52
+ }) }
54
53
  end
55
54
  end
56
55
 
@@ -24,7 +24,7 @@ class CustomActiveRecordLogSubscriber < ActiveRecord::LogSubscriber
24
24
  # name = colorize_payload_name(name, payload[:name])
25
25
  # sql = color(sql, sql_color(sql), true)
26
26
 
27
- debug " #{name} #{sql}#{binds}" unless payload[:sql].to_s =~ /hot_catch_logs|COMMIT|BEGIN/i
27
+ debug " #{name} #{sql}#{binds}" unless payload[:sql].to_s =~ /hot_catch_logs|COMMIT|BEGIN|Rendering|Rendered/i
28
28
  end
29
29
  end
30
30
 
@@ -5,9 +5,6 @@ require 'action_dispatch/http/request'
5
5
  require 'rack/body_proxy'
6
6
  # require 'rack/utils'
7
7
 
8
- require_relative '../app/models/application_record.rb'
9
- require_relative '../app/models/hot_catch_log.rb'
10
-
11
8
  module Rails
12
9
  module Rack
13
10
  # Sets log tags, logs the request, calls the app, and flushes the logs.
@@ -36,10 +33,6 @@ module Rails
36
33
  def call_app(request, env)
37
34
  instrumenter = ActiveSupport::Notifications.instrumenter
38
35
  instrumenter.start 'request.action_dispatch', request: request
39
-
40
- # Флаг начала запроса
41
- logger << "\nBEGIN\n"
42
-
43
36
  logger.info { started_request_message(request) }
44
37
  resp = @app.call(env)
45
38
  resp[2] = ::Rack::BodyProxy.new(resp[2]) { finish(request) }
@@ -76,31 +69,17 @@ module Rails
76
69
  private
77
70
 
78
71
  def finish(request)
79
- # Если быстро обновлять страницу, то конец лога не успевает записаться.
80
- # Для этого записываем последний лог в новый файл и с новым запросом считываем
81
- # его и записанный конец лога из изначального лог-файла.
82
-
83
72
  # Считали данные из основного лог-файла
84
- logs = ""
85
- File.open('tmp/hot_catch_buf_file'){ |file| logs = file.read}
73
+ log = ""
74
+ File.open('tmp/hot_catch_buf_file'){ |file| log = file.read}
86
75
  File.open('tmp/hot_catch_buf_file', 'w'){ |file| file.print "" }
87
- logs = logs.split("BEGIN").delete_if{|x| !x.present? }
88
-
89
- # Считали данные из дополнительного лог-файла и записали начало последнего лога
90
- add_log = ""
91
- File.open('tmp/hot_catch_buf_file2'){ |file| add_log = file.read} if File.exist?('tmp/hot_catch_buf_file2')
92
- File.open('tmp/hot_catch_buf_file2', 'w'){ |file| file.print logs[-1] }
93
- logs.delete_at(-1)
94
-
95
- # Собираем начало лога и конец
96
- add_log = add_log + (logs[0]).to_s
97
- HotCatchLog.process_data_log(add_log) unless add_log.strip =~ /assets/
98
-
99
- logs.delete_at(0)
100
- # Обрабатываем остальные логи, если есть
101
- logs.each {|log| HotCatchLog.process_data_log(log) unless log.strip =~ /assets/}
102
-
103
76
 
77
+ # получаем статус из лога
78
+ status = log.match(/!!!(\d{3})!!!/)
79
+ status = status[1] if status
80
+ log.gsub!(/!!!(\d{3})!!!\s/, "")
81
+ # отправляем логи
82
+ Rails.application.config.sender_logs.rails_g_log(log, status) unless log.strip =~ /assets/
104
83
 
105
84
  instrumenter = ActiveSupport::Notifications.instrumenter
106
85
  instrumenter.finish 'request.action_dispatch', request: request
@@ -1,3 +1,3 @@
1
1
  module HotCatch
2
- VERSION = '0.1.2'
2
+ VERSION = '0.1.3'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: hot_catch
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.2
4
+ version: 0.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Davhot
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-08-20 00:00:00.000000000 Z
11
+ date: 2017-09-10 00:00:00.000000000 Z
12
12
  dependencies: []
13
13
  description: Description of Testgem.
14
14
  email:
@@ -24,7 +24,6 @@ files:
24
24
  - lib/generators/hot_catch/uninstall_generator.rb
25
25
  - lib/hot_catch.rb
26
26
  - lib/hot_catch/custom_log_subscribers.rb
27
- - lib/hot_catch/hot_catch_log.rb
28
27
  - lib/hot_catch/hot_catch_logger.rb
29
28
  - lib/hot_catch/version.rb
30
29
  - lib/tasks/hot_catch_tasks.rake
@@ -1,70 +0,0 @@
1
- class HotCatchLog < ApplicationRecord
2
-
3
- validates :log_data, :status, presence: true
4
- validates :count_log, presence: true, numericality: {only_integer: true, greater_than: 0}
5
-
6
- STATUSES = ["STATUS", "SUCCESS", "REDIRECTION", "CLIENT_ERROR", "SERVER_ERROR", "WARNING"]
7
-
8
- # Проверка лога на уникальность
9
- def self.process_data_log(str)
10
- str, status = get_status(str)
11
-
12
- # Если статус не найден, то возможна ошибка в контроллере
13
- status = STATUSES[3] if !status && str =~ /ActionController/
14
-
15
- str2 = strip_str(str)
16
- opt = true
17
-
18
- HotCatchLog.where(status: status).each do |cur_log|
19
- if strip_str(cur_log.log_data) == str2
20
- cur_log.count_log += 1
21
- cur_log.save
22
-
23
- # Отправка лога на сервер
24
- Rails.application.config.sender_logs.rails_g_log(cur_log.log_data,
25
- cur_log.count_log, cur_log.id, cur_log.status)
26
-
27
- opt = false
28
- return
29
- end
30
- end
31
-
32
- if opt && str.strip.present? && status.present?
33
- l = HotCatchLog.create(log_data: format_log(str), status: status)
34
-
35
- # Отправка лога на сервер
36
- # args: log_data, count_log, id_log, status
37
- Rails.application.config.sender_logs.rails_g_log(l.log_data, l.count_log,
38
- l.id, l.status)
39
- end
40
-
41
- end
42
-
43
- private
44
-
45
- # Метод для сравнения логов
46
- def self.strip_str(str)
47
- str = str.dup
48
- str.gsub!(/\d+(\.\d+)?ms/, "") # За сколько выполнилось действие
49
- str.gsub!(/\d{4}-\d{2}-\d{2}\s\d{2}:\d{2}:\d{2}\s\+\d{4}/, "") # дата
50
- str.gsub!(/#<.*:0x[\d|\w]+>/, "") # Объект (например #<StaticPagesController:0x007f37791686d8>)
51
- format_log(str)
52
- end
53
-
54
- # Помимо сравнения логов, нужен для форматирования лога и записи в бд
55
- def self.format_log(str)
56
- str = str.split("\n").select{|x| x.present?}.join("\n") # убирает повторяющиеся переводы строки
57
- str.strip! # лишние символы пропусков в начале и конце
58
- str
59
- end
60
-
61
- # Возвращает статус и лог без статуса
62
- def self.get_status(str)
63
- status = str.match(/!!!(\d{3})!!!/)
64
- status = status[1] if status
65
- str = str.gsub(/!!!(\d{3})!!!\s/, "")
66
- status = STATUSES[status[0].to_i - 1] if status.present?
67
- [str, status]
68
- end
69
-
70
- end