detail_parser 0.1.4 → 0.1.6

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: dc63cbf18bd6053217b8b21f71a6308391253261
4
- data.tar.gz: f7b04d9abb55d7ecb931be0b3d22b8a2a276d839
3
+ metadata.gz: ecc2873defe2bafcd5ff9b8bcf6d28eae5bec1cd
4
+ data.tar.gz: c03868e6c7ae52de8ead1759fca9fb02e37d77e4
5
5
  SHA512:
6
- metadata.gz: b5d7fa3fb093fbac47cd688b9101850a6aa81e3ac546472978c949f32f5ad785fffbf95aa4866deb1bfd7b6a2ee89a84dd935b066634581415876716d8d1cdb2
7
- data.tar.gz: d2676c108088cc20c43aaed31351be6e547517c0cc75133efb2365e4494bcaf73b19f5064a9a407baaaf9b8ae0af8ada63a028fff6daee5adea2bc77b500dddb
6
+ metadata.gz: 3b659f3f708f90d2d0d194a7920df436db8f0b23a41b9bf9da4db84fefa627b082998ad27ab566f7a5c5294b81d2ea929825340d9397327595907869185d9600
7
+ data.tar.gz: b927ead95370548c07a508ad0b032a2235fef6deb27fbb892eb56f032e84d69f8b1135a8d88c4992ee9bb4a0a2742bf1d6f141c5651af0222950ba83daaa6533
data/README.md CHANGED
@@ -20,9 +20,38 @@ Or install it yourself as:
20
20
 
21
21
  $ gem install detail_parser
22
22
 
23
+ Next to config, To run
24
+
25
+ $ rails g detail_parser:install
26
+
27
+ That will create file in `config/initializers/detail_parser.rb`
28
+
23
29
  ## Usage
24
30
 
25
- TODO: Write usage instructions here
31
+ - 默认是开启detail_parser的模式,可以通过配置文件来关闭
32
+
33
+ ```ruby
34
+ config.detail_parser.enabled = false
35
+ ```
36
+
37
+ - 默认的日志等级是 `:info`,可以通过配置文件修改
38
+
39
+ ```ruby
40
+ DetailParser.log_level = :debug
41
+ ```
42
+
43
+ - 默认是关闭了rails自身的Log输出,如需开启,需要进行如下配置
44
+
45
+ ```ruby
46
+ config.detail_parser.keep_original_log = true
47
+ ```
48
+
49
+ - 默认的请求用户是开启的,但是内容被注释了.这个可以根据自己项目的情况修改.使用的时候去除注释就可以.
50
+
51
+ ```ruby
52
+ payload[:current_user] = "User Id #{current_user.id} | User name #{current_user.name}"
53
+ ```
54
+
26
55
 
27
56
  ## Development
28
57
 
@@ -38,4 +67,3 @@ Bug reports and pull requests are welcome on GitHub at https://github.com/[USERN
38
67
  ## License
39
68
 
40
69
  The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
41
-
@@ -33,7 +33,6 @@ Gem::Specification.new do |spec|
33
33
  spec.add_development_dependency "bundler", "~> 1.14"
34
34
  spec.add_development_dependency "rake", "~> 10.0"
35
35
  spec.add_development_dependency "rspec", "~> 3.0"
36
- spec.add_development_dependency "pry"
37
36
 
38
37
  spec.add_runtime_dependency 'activesupport', '>= 4', '<= 5.1.0.rc2'
39
38
  spec.add_runtime_dependency 'actionpack', '>= 4', '<= 5.1.0.rc2'
@@ -1,29 +1,32 @@
1
1
  require "detail_parser/version"
2
- require "detail_parser/logger"
2
+ require "detail_parser/log_subscriber"
3
3
  require 'detail_parser/configurable'
4
+ require 'detail_parser/railtie' if defined?(Rails)
5
+ require 'detail_parser/formatters/json'
4
6
 
5
- begin
6
- require "pry"
7
- rescue LoadError
8
- end
7
+ require 'active_support/core_ext/module/attribute_accessors'
8
+ require 'active_support/core_ext/string/inflections'
9
+ require 'active_support/ordered_options'
9
10
 
10
11
  module DetailParser
11
12
 
12
- puts "in detail_parser module"
13
+ class << self
14
+ attr_accessor :logger, :filter, :application
15
+ end
16
+
13
17
  # Your code goes here...
14
18
  module_function
19
+
15
20
  def setup(app)
16
- puts "detail_parser setup"
17
21
  self.application = app
22
+ keep_original_log
18
23
 
19
- # attach_to_action_controller
20
- # set_lograge_log_options
21
- # support_deprecated_config
22
- # set_formatter
23
- # set_ignores
24
- # Logger.setup
24
+ attach_to_action_controller
25
+ set_formatter
25
26
  end
26
27
 
28
+ mattr_accessor :log_level
29
+ self.log_level = :info
27
30
 
28
31
  mattr_writer :before_format
29
32
  self.before_format = nil
@@ -35,5 +38,42 @@ module DetailParser
35
38
  end
36
39
 
37
40
  mattr_accessor :formatter
41
+ def set_formatter
42
+ DetailParser.formatter = detail_config.formatter || DetailParser::Formatters::Json.new
43
+ end
44
+
45
+ def keep_original_log
46
+ return if detail_config.keep_original_log
47
+ remove_existing_log_subscriptions
48
+ end
49
+
50
+ def remove_existing_log_subscriptions
51
+ ActiveSupport::LogSubscriber.log_subscribers.each do |subscriber|
52
+ case subscriber
53
+ when ActionController::LogSubscriber
54
+ unsubscribe(:action_controller, subscriber)
55
+ end
56
+ end
57
+ end
58
+ private_class_method :remove_existing_log_subscriptions
59
+
60
+ def unsubscribe(component, subscriber)
61
+ events = subscriber.public_methods(false).reject { |method| method.to_s == 'call' }
62
+ events.each do |event|
63
+ ActiveSupport::Notifications.notifier.listeners_for("#{event}.#{component}").each do |listener|
64
+ if listener.instance_variable_get('@delegate') == subscriber
65
+ ActiveSupport::Notifications.unsubscribe listener
66
+ end
67
+ end
68
+ end
69
+ end
70
+
71
+ def attach_to_action_controller
72
+ DetailParser::LogSubscriber.attach_to :action_controller
73
+ end
74
+
75
+ def detail_config
76
+ application.config.detail_parser
77
+ end
38
78
 
39
79
  end
@@ -0,0 +1,10 @@
1
+ require 'json'
2
+ module DetailParser
3
+ module Formatters
4
+ class Json
5
+ def call(data)
6
+ ::JSON.dump(data)
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,112 @@
1
+ require 'json'
2
+ require 'action_pack'
3
+ require 'active_support/core_ext/class/attribute'
4
+ require 'active_support/log_subscriber'
5
+
6
+ # require 'active_support/tagged_logging'
7
+
8
+ module DetailParser
9
+ class LogSubscriber < ActiveSupport::LogSubscriber
10
+
11
+ def process_action(event)
12
+ payload = event.payload
13
+ request_data = extract_request(event, payload)
14
+ request_log(request_data)
15
+ response_log(extract_response(event, payload)) unless html_format?(payload)
16
+ end
17
+
18
+ def request_log(data)
19
+ logger.send(DetailParser.log_level, data)
20
+ end
21
+
22
+ def response_log(data)
23
+ logger.send(DetailParser.log_level, data)
24
+ end
25
+
26
+ def start_log(data)
27
+ logger.send(DetailParser.log_level, data)
28
+ end
29
+
30
+ def logger
31
+ DetailParser.logger.presence || super
32
+ end
33
+
34
+ private
35
+ def extract_request(event, payload)
36
+ payload = event.payload
37
+ data = initial_data(payload)
38
+ data.merge!(extract_status(payload))
39
+ data.merge!(extract_runtimes(event, payload))
40
+ data.merge!(extract_userinfo(payload))
41
+ end
42
+
43
+ def extract_response(event, payload)
44
+ "Response is #{payload[:response].body}"
45
+ end
46
+
47
+ def format_time
48
+ Time.current.localtime
49
+ end
50
+
51
+ def initial_data(payload)
52
+ {
53
+ method: payload[:method],
54
+ request_id: payload[:request].uuid,
55
+ path: extract_path(payload),
56
+ format: extract_format(payload),
57
+ params: payload[:params]
58
+ }
59
+ end
60
+
61
+ def logged_ip
62
+ Thread.current[:logged_ip]
63
+ end
64
+
65
+ def extract_path(payload)
66
+ path = payload[:path]
67
+ index = path.index('?')
68
+ index ? path[0, index] : path
69
+ end
70
+
71
+ def extract_format(payload)
72
+ payload[:format]
73
+ end
74
+
75
+ def extract_status(payload)
76
+ if (status = payload[:status])
77
+ { status: status.to_i }
78
+ elsif (error = payload[:exception])
79
+ exception, message = error
80
+ { status: get_error_status_code(exception), error: "#{exception}: #{message}" }
81
+ else
82
+ { status: 0 }
83
+ end
84
+ end
85
+
86
+ def extract_runtimes(event, payload)
87
+ data = { duration: event.duration.to_f.round(2) }
88
+ data[:Views] = payload[:view_runtime].to_f.round(2) if payload.key?(:view_runtime)
89
+ data[:DB] = payload[:db_runtime].to_f.round(2) if payload.key?(:db_runtime)
90
+ data
91
+ end
92
+
93
+ def extract_userinfo(payload)
94
+ {request_user: payload[:current_user]} if DetailParser.detail_config.current_user
95
+ end
96
+
97
+ def before_format(data, payload)
98
+ DetailParser.before_format(data, payload)
99
+ end
100
+
101
+ def get_error_status_code(exception)
102
+ status = ActionDispatch::ExceptionWrapper.rescue_responses[exception]
103
+ Rack::Utils.status_code(status)
104
+ end
105
+
106
+
107
+ def html_format?(payload)
108
+ payload[:format].to_s == "html"
109
+ end
110
+
111
+ end
112
+ end
@@ -5,19 +5,16 @@ require 'action_controller/log_subscriber'
5
5
  class DetailParser::Railtie < Rails::Railtie
6
6
  env = Rails.env.to_sym || :development
7
7
 
8
- puts " ====== in Rails railtile"
9
8
 
10
9
  config.detail_parser = ActiveSupport::OrderedOptions.new
11
10
  config.detail_parser.enabled = false
12
11
 
13
- # DetailParser::Logger.logger = Rails.application.config.logger || Rails.logger.presence
14
-
15
12
  initializer 'detail parser logger', after: :load_config_initializers do
16
- DetailParser::Logger.logger = Rails.application.config.logger || Rails.logger.presence
17
- DetailParser::Logger.filter = ActionDispatch::Http::ParameterFilter.new Rails.application.config.filter_parameters
13
+ DetailParser.logger = Rails.application.config.logger || Rails.logger.presence
14
+ DetailParser.filter = ActionDispatch::Http::ParameterFilter.new Rails.application.config.filter_parameters
18
15
  end
19
16
 
20
17
  config.after_initialize do |app|
21
- DetailParser.setup(app)
18
+ DetailParser.setup(app) if app.config.detail_parser.enabled
22
19
  end
23
20
  end
@@ -1,3 +1,3 @@
1
1
  module DetailParser
2
- VERSION = "0.1.4"
2
+ VERSION = "0.1.6"
3
3
  end
@@ -1,3 +1,31 @@
1
1
  Rails.application.configure do
2
2
  config.detail_parser.enabled = true
3
+ config.detail_parser.current_user = true
4
+ end
5
+
6
+
7
+ ActionController::Instrumentation.class_eval do
8
+ def process_action(*args)
9
+ raw_payload = {
10
+ controller: self.class.name,
11
+ action: self.action_name,
12
+ params: request.filtered_parameters,
13
+ format: request.format.try(:ref),
14
+ method: request.method,
15
+ path: (request.fullpath rescue "unknown"),
16
+ request: request,
17
+ response: response,
18
+ session: session
19
+ }
20
+
21
+ ActiveSupport::Notifications.instrument("start_processing.action_controller", raw_payload.dup)
22
+
23
+ ActiveSupport::Notifications.instrument("process_action.action_controller", raw_payload) do |payload|
24
+ result = super
25
+ payload[:status] = response.status
26
+ # payload[:current_user] = "User Id #{current_user.id} | User name #{current_user.name}"
27
+ append_info_to_payload(payload)
28
+ result
29
+ end
30
+ end
3
31
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: detail_parser
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.1.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Issue
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2017-04-26 00:00:00.000000000 Z
11
+ date: 2017-05-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -52,20 +52,6 @@ dependencies:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
54
  version: '3.0'
55
- - !ruby/object:Gem::Dependency
56
- name: pry
57
- requirement: !ruby/object:Gem::Requirement
58
- requirements:
59
- - - ">="
60
- - !ruby/object:Gem::Version
61
- version: '0'
62
- type: :development
63
- prerelease: false
64
- version_requirements: !ruby/object:Gem::Requirement
65
- requirements:
66
- - - ">="
67
- - !ruby/object:Gem::Version
68
- version: '0'
69
55
  - !ruby/object:Gem::Dependency
70
56
  name: activesupport
71
57
  requirement: !ruby/object:Gem::Requirement
@@ -146,7 +132,8 @@ files:
146
132
  - detail_parser.gemspec
147
133
  - lib/detail_parser.rb
148
134
  - lib/detail_parser/configurable.rb
149
- - lib/detail_parser/logger.rb
135
+ - lib/detail_parser/formatters/json.rb
136
+ - lib/detail_parser/log_subscriber.rb
150
137
  - lib/detail_parser/railtie.rb
151
138
  - lib/detail_parser/version.rb
152
139
  - lib/generators/detail_parser/install_generator.rb
@@ -1,77 +0,0 @@
1
- require 'active_support/core_ext/class/attribute'
2
- require 'active_support/log_subscriber'
3
-
4
- # require 'active_support/tagged_logging'
5
-
6
- module DetailParser
7
- class Logger < ActiveSupport::LogSubscriber
8
-
9
- def process_action(event)
10
- payload = event.payload
11
- data = extract_request(event, payload)
12
- data = before_format(data, payload)
13
- formatted_message = DetailParser.formatter.call(data)
14
- # logger.send(Lograge.log_level, formatted_message)
15
- end
16
-
17
- def self.setup(app)
18
- self.application = app
19
- # Lograge::RequestLogSubscriber.attach_to :action_controller
20
- puts "NOTICE: Gem is ok"
21
- end
22
-
23
- private
24
- def extract_request(event, payload)
25
- payload = event.payload
26
- data = initial_data(payload)
27
- data.merge!(extract_status(payload))
28
- data.merge!(extract_runtimes(event, payload))
29
- # data.merge!(extract_location)
30
- # data.merge!(extract_unpermitted_params)
31
- # data.merge!(custom_options(event))
32
- end
33
-
34
- def initial_data(payload)
35
- {
36
- method: payload[:method],
37
- path: extract_path(payload),
38
- format: extract_format(payload),
39
- controller: payload[:controller],
40
- action: payload[:action]
41
- }
42
- end
43
-
44
- def extract_path(payload)
45
- path = payload[:path]
46
- index = path.index('?')
47
- index ? path[0, index] : path
48
- end
49
-
50
- def extract_format(payload)
51
- payload[:format]
52
- end
53
-
54
- def extract_status(payload)
55
- if (status = payload[:status])
56
- { status: status.to_i }
57
- elsif (error = payload[:exception])
58
- exception, message = error
59
- { status: get_error_status_code(exception), error: "#{exception}: #{message}" }
60
- else
61
- { status: 0 }
62
- end
63
- end
64
-
65
- def extract_runtimes(event, payload)
66
- data = { duration: event.duration.to_f.round(2) }
67
- data[:view] = payload[:view_runtime].to_f.round(2) if payload.key?(:view_runtime)
68
- data[:db] = payload[:db_runtime].to_f.round(2) if payload.key?(:db_runtime)
69
- data
70
- end
71
-
72
- def before_format(data, payload)
73
- DetailParser.before_format(data, payload)
74
- end
75
-
76
- end
77
- end