rails_semantic_logger 3.0.1 → 3.1.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 +1 -1
- data/lib/rails_semantic_logger/extensions/action_cable/tagged_logger_proxy.rb +12 -0
- data/lib/rails_semantic_logger/extensions/action_controller/live.rb +7 -0
- data/lib/rails_semantic_logger/extensions/action_controller/log_subscriber.rb +101 -0
- data/lib/rails_semantic_logger/extensions/action_controller/log_subscriber_processing.rb +27 -0
- data/lib/rails_semantic_logger/extensions/action_dispatch/debug_exceptions.rb +11 -0
- data/lib/rails_semantic_logger/extensions/action_view/log_subscriber.rb +12 -0
- data/lib/rails_semantic_logger/extensions/action_view/streaming_template_renderer.rb +11 -0
- data/lib/rails_semantic_logger/extensions/active_job/logging.rb +9 -0
- data/lib/rails_semantic_logger/extensions/active_record/log_subscriber.rb +37 -0
- data/lib/rails_semantic_logger/extensions/rails/rack/logger.rb +19 -0
- data/lib/rails_semantic_logger/extensions/rails/rack/logger_info_as_debug.rb +28 -0
- data/lib/rails_semantic_logger/extensions/rails/server.rb +11 -0
- data/lib/rails_semantic_logger/railtie.rb +69 -35
- data/lib/rails_semantic_logger/version.rb +1 -1
- metadata +31 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 6b67e5d8f28b2e51e0718ba6bb78836efffba19b
|
4
|
+
data.tar.gz: 8f255e0c6a0d030f40e45423db46187aae7fcd9f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b5202dc5e4bfcd755dfd1de312e3023ac4526d933094df2ded3495420fac0882df959f5a6a2be29054c3bb1d91cc1adb5eb81152a75766105e586caf082c597a
|
7
|
+
data.tar.gz: 9cf9187d55b5bb2a862be2c58e36aecec7cf318f91ca1f64287b9690c834e13ec503cbf22e943eabd49d70cc5f93e9dc38765c139b9dd5ef4bb89165f6cc5a7e
|
data/README.md
CHANGED
@@ -0,0 +1,101 @@
|
|
1
|
+
ActionController::LogSubscriber
|
2
|
+
|
3
|
+
module ActionController
|
4
|
+
class LogSubscriber
|
5
|
+
# Log as debug to hide Processing messages in production
|
6
|
+
def start_processing(event)
|
7
|
+
controller_logger(event).debug { "Processing ##{event.payload[:action]}" }
|
8
|
+
end
|
9
|
+
|
10
|
+
def process_action(event)
|
11
|
+
controller_logger(event).info do
|
12
|
+
payload = event.payload
|
13
|
+
params = payload[:params].except(*INTERNAL_PARAMS)
|
14
|
+
format = payload[:format]
|
15
|
+
format = format.to_s.upcase if format.is_a?(Symbol)
|
16
|
+
status = payload[:status]
|
17
|
+
|
18
|
+
if status.nil? && payload[:exception].present?
|
19
|
+
exception_class_name = payload[:exception].first
|
20
|
+
status = ActionDispatch::ExceptionWrapper.status_code_for_exception(exception_class_name)
|
21
|
+
end
|
22
|
+
|
23
|
+
log = {
|
24
|
+
message: "Completed ##{payload[:action]}",
|
25
|
+
status: status,
|
26
|
+
status_message: Rack::Utils::HTTP_STATUS_CODES[status],
|
27
|
+
format: format,
|
28
|
+
path: payload[:path],
|
29
|
+
action: payload[:action],
|
30
|
+
method: payload[:method],
|
31
|
+
duration: event.duration
|
32
|
+
}
|
33
|
+
collect_runtimes(payload, log)
|
34
|
+
log[:params] = params unless params.empty?
|
35
|
+
log
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
def halted_callback(event)
|
40
|
+
controller_logger(event).info { "Filter chain halted as #{event.payload[:filter].inspect} rendered or redirected" }
|
41
|
+
end
|
42
|
+
|
43
|
+
def send_file(event)
|
44
|
+
controller_logger(event).info('Sent file') { {path: event.payload[:path], duration: event.duration} }
|
45
|
+
end
|
46
|
+
|
47
|
+
def redirect_to(event)
|
48
|
+
controller_logger(event).info('Redirected to') { {location: event.payload[:location]} }
|
49
|
+
end
|
50
|
+
|
51
|
+
def send_data(event)
|
52
|
+
controller_logger(event).info('Sent data') { {file_name: event.payload[:filename], duration: event.duration} }
|
53
|
+
end
|
54
|
+
|
55
|
+
def unpermitted_parameters(event)
|
56
|
+
controller_logger(event).debug do
|
57
|
+
unpermitted_keys = event.payload[:keys]
|
58
|
+
"Unpermitted parameter#{'s' if unpermitted_keys.size > 1}: #{unpermitted_keys.join(", ")}"
|
59
|
+
end
|
60
|
+
end
|
61
|
+
|
62
|
+
%w(write_fragment read_fragment exist_fragment?
|
63
|
+
expire_fragment expire_page write_page).each do |method|
|
64
|
+
class_eval <<-METHOD, __FILE__, __LINE__ + 1
|
65
|
+
def #{method}(event)
|
66
|
+
controller_logger(event).info do
|
67
|
+
key_or_path = event.payload[:key] || event.payload[:path]
|
68
|
+
{message: "#{method.to_s.humanize} \#{key_or_path}", duration: event.duration}
|
69
|
+
end
|
70
|
+
end
|
71
|
+
METHOD
|
72
|
+
end
|
73
|
+
|
74
|
+
private
|
75
|
+
|
76
|
+
# Returns the logger for the supplied event.
|
77
|
+
# Returns ActionController::Base.logger if no controller is present
|
78
|
+
def controller_logger(event)
|
79
|
+
if controller = event.payload[:controller]
|
80
|
+
begin
|
81
|
+
controller.constantize.logger
|
82
|
+
rescue NameError
|
83
|
+
ActionController::Base.logger
|
84
|
+
end
|
85
|
+
else
|
86
|
+
ActionController::Base.logger
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
# Returns [Hash] runtimes for all registered runtime collection subscribers
|
91
|
+
# For example, :view_runtime, :mongo_runtime, etc.
|
92
|
+
def collect_runtimes(payload, log)
|
93
|
+
payload.each_pair do |key, value|
|
94
|
+
if match = key.to_s.match(/(.*)_runtime/)
|
95
|
+
log[key] = value.to_f.round(2)
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
end
|
101
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
ActionController::LogSubscriber
|
2
|
+
|
3
|
+
module ActionController
|
4
|
+
class LogSubscriber
|
5
|
+
# Log as info to show Processing messages in production
|
6
|
+
def start_processing(event)
|
7
|
+
controller_logger(event).info { "Processing ##{event.payload[:action]}" }
|
8
|
+
end
|
9
|
+
|
10
|
+
private
|
11
|
+
|
12
|
+
# Returns the logger for the supplied event.
|
13
|
+
# Returns ActionController::Base.logger if no controller is present
|
14
|
+
def controller_logger(event)
|
15
|
+
if controller = event.payload[:controller]
|
16
|
+
begin
|
17
|
+
controller.constantize.logger
|
18
|
+
rescue NameError
|
19
|
+
ActionController::Base.logger
|
20
|
+
end
|
21
|
+
else
|
22
|
+
ActionController::Base.logger
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
# Log actual exceptions, not a string representation
|
2
|
+
ActionDispatch::DebugExceptions
|
3
|
+
class ActionDispatch::DebugExceptions
|
4
|
+
private
|
5
|
+
def log_error(request, wrapper)
|
6
|
+
ActiveSupport::Deprecation.silence do
|
7
|
+
ActionController::Base.logger.fatal(wrapper.exception)
|
8
|
+
end
|
9
|
+
end
|
10
|
+
end
|
11
|
+
|
@@ -0,0 +1,11 @@
|
|
1
|
+
# Log actual exceptions, not a string representation
|
2
|
+
ActionView::StreamingTemplateRenderer
|
3
|
+
|
4
|
+
class ActionView::StreamingTemplateRenderer
|
5
|
+
class Body
|
6
|
+
private
|
7
|
+
def log_error(exception) #:nodoc:
|
8
|
+
ActionView::Base.logger.fatal(exception)
|
9
|
+
end
|
10
|
+
end
|
11
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
ActiveRecord::LogSubscriber
|
2
|
+
module ActiveRecord
|
3
|
+
class LogSubscriber
|
4
|
+
def sql(event)
|
5
|
+
self.class.runtime += event.duration
|
6
|
+
|
7
|
+
return unless logger.debug?
|
8
|
+
|
9
|
+
payload = event.payload
|
10
|
+
name = payload[:name]
|
11
|
+
return if IGNORE_PAYLOAD_NAMES.include?(name)
|
12
|
+
|
13
|
+
log = {
|
14
|
+
message: name,
|
15
|
+
sql: payload[:sql],
|
16
|
+
duration: event.duration
|
17
|
+
}
|
18
|
+
unless (payload[:binds] || []).empty?
|
19
|
+
log[:binds] = binds = {}
|
20
|
+
# Changed with Rails 5
|
21
|
+
if Rails.version.to_i >= 5
|
22
|
+
payload[:binds].each do |attr|
|
23
|
+
attr_name, value = render_bind(attr)
|
24
|
+
binds[attr_name] = value
|
25
|
+
end
|
26
|
+
else
|
27
|
+
payload[:binds].each do |col, v|
|
28
|
+
attr_name, value = render_bind(col, v)
|
29
|
+
binds[attr_name] = value
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
debug(log)
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,19 @@
|
|
1
|
+
Rails::Rack::Logger
|
2
|
+
|
3
|
+
# Replace rack started message with a semantic equivalent
|
4
|
+
module Rails
|
5
|
+
module Rack
|
6
|
+
class Logger
|
7
|
+
def started_request_message(request)
|
8
|
+
{
|
9
|
+
message: 'Started',
|
10
|
+
method: request.request_method,
|
11
|
+
path: request.filtered_path,
|
12
|
+
ip: request.ip
|
13
|
+
}
|
14
|
+
end
|
15
|
+
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
@@ -0,0 +1,28 @@
|
|
1
|
+
Rails::Rack::Logger
|
2
|
+
|
3
|
+
# Drop rack Started message to debug level message
|
4
|
+
module Rails
|
5
|
+
module Rack
|
6
|
+
class Logger
|
7
|
+
private
|
8
|
+
|
9
|
+
module LogInfoAsDebug
|
10
|
+
def info(*args, &block)
|
11
|
+
debug(*args, &block)
|
12
|
+
end
|
13
|
+
def info?
|
14
|
+
debug?
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
def logger
|
19
|
+
@logger ||= begin
|
20
|
+
logger = SemanticLogger['Rails']
|
21
|
+
logger.extend(LogInfoAsDebug)
|
22
|
+
logger
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -1,5 +1,6 @@
|
|
1
|
-
require
|
2
|
-
|
1
|
+
require('rails_semantic_logger/extensions/rails/server') if defined?(Rails::Server)
|
2
|
+
|
3
|
+
# Replace standard Rails logger
|
3
4
|
module RailsSemanticLogger #:nodoc:
|
4
5
|
class Railtie < Rails::Railtie #:nodoc:
|
5
6
|
# Make the SemanticLogger config available in the Rails application config
|
@@ -10,13 +11,41 @@ module RailsSemanticLogger #:nodoc:
|
|
10
11
|
# Rails::Application.configure do
|
11
12
|
# # Add the MongoDB logger appender only once Rails is initialized
|
12
13
|
# config.after_initialize do
|
13
|
-
#
|
14
|
-
# :
|
15
|
-
#
|
14
|
+
# appender = SemanticLogger::Appender::Mongo.new(
|
15
|
+
# db: Mongo::Connection.new['myapp_development']
|
16
|
+
# )
|
17
|
+
# config.semantic_logger.add_appender(appender: appender)
|
16
18
|
# end
|
17
19
|
# end
|
18
20
|
config.semantic_logger = ::SemanticLogger
|
19
21
|
|
22
|
+
config.rails_semantic_logger = ActiveSupport::OrderedOptions.new
|
23
|
+
|
24
|
+
# Convert Action Controller and Active Record text messages to semantic data
|
25
|
+
# Rails -- Started -- { :ip => "127.0.0.1", :method => "GET", :path => "/dashboards/inquiry_recent_activity" }
|
26
|
+
# UserController -- Completed #index -- { :action => "index", :db_runtime => 54.64, :format => "HTML", :method => "GET", :mongo_runtime => 0.0, :path => "/users", :status => 200, :status_message => "OK", :view_runtime => 709.88 }
|
27
|
+
config.rails_semantic_logger.semantic = true
|
28
|
+
|
29
|
+
# Change Rack started message to debug so that it does not appear in production
|
30
|
+
config.rails_semantic_logger.started = false
|
31
|
+
|
32
|
+
# Change Processing message to debug so that it does not appear in production
|
33
|
+
config.rails_semantic_logger.processing = false
|
34
|
+
|
35
|
+
# Change Action View render log messages to debug so that they do not appear in production
|
36
|
+
# ActionView::Base -- Rendered data/search/_user.html.haml (46.7ms)
|
37
|
+
config.rails_semantic_logger.rendered = false
|
38
|
+
|
39
|
+
# Override the Awesome Print options for logging Hash data as text:
|
40
|
+
#
|
41
|
+
# Any valid AwesomePrint option for rendering data.
|
42
|
+
# The defaults can changed be creating a `~/.aprc` file.
|
43
|
+
# See: https://github.com/michaeldv/awesome_print
|
44
|
+
#
|
45
|
+
# Note: The option :multiline is set to false if not supplied.
|
46
|
+
# Note: Has no effect if Awesome Print is not installed.
|
47
|
+
config.rails_semantic_logger.ap_options = {multiline: false}
|
48
|
+
|
20
49
|
# Initialize SemanticLogger. In a Rails environment it will automatically
|
21
50
|
# insert itself above the configured rails logger to add support for its
|
22
51
|
# additional features
|
@@ -33,11 +62,8 @@ module RailsSemanticLogger #:nodoc:
|
|
33
62
|
# Existing loggers are ignored because servers like trinidad supply their
|
34
63
|
# own file loggers which would result in duplicate logging to the same log file
|
35
64
|
Rails.logger = config.logger = begin
|
36
|
-
|
37
|
-
|
38
|
-
unless File.exist? File.dirname path
|
39
|
-
FileUtils.mkdir_p File.dirname path
|
40
|
-
end
|
65
|
+
path = config.paths['log'].first
|
66
|
+
FileUtils.mkdir_p(File.dirname(path)) unless File.exist?(File.dirname(path))
|
41
67
|
|
42
68
|
# Set internal logger to log to file only, in case another appender
|
43
69
|
# experiences errors during writes
|
@@ -47,15 +73,18 @@ module RailsSemanticLogger #:nodoc:
|
|
47
73
|
|
48
74
|
# Add the log file to the list of appenders
|
49
75
|
# Use the colorized formatter if Rails colorized logs are enabled
|
50
|
-
|
51
|
-
SemanticLogger.
|
76
|
+
options = config.rails_semantic_logger.ap_options
|
77
|
+
formatter = config.colorize_logging == false ? :default : SemanticLogger::Formatters::Color.new(options)
|
78
|
+
# Check for previous file or stdout loggers
|
79
|
+
SemanticLogger.appenders.each { |appender| appender.formatter = formatter if appender.is_a?(SemanticLogger::Appender::File) }
|
80
|
+
SemanticLogger.add_appender(file_name: path, formatter: formatter)
|
52
81
|
SemanticLogger[Rails]
|
53
82
|
rescue StandardError => exc
|
54
83
|
# If not able to log to file, log to standard error with warning level only
|
55
84
|
SemanticLogger.default_level = :warn
|
56
85
|
|
57
|
-
SemanticLogger::Logger.logger = SemanticLogger::Appender::File.new(STDERR)
|
58
|
-
SemanticLogger.add_appender(STDERR)
|
86
|
+
SemanticLogger::Logger.logger = SemanticLogger::Appender::File.new(io: STDERR)
|
87
|
+
SemanticLogger.add_appender(io: STDERR)
|
59
88
|
|
60
89
|
logger = SemanticLogger[Rails]
|
61
90
|
logger.warn(
|
@@ -116,30 +145,35 @@ module RailsSemanticLogger #:nodoc:
|
|
116
145
|
|
117
146
|
# Set the logger for concurrent-ruby
|
118
147
|
Concurrent.global_logger = SemanticLogger[Concurrent] if defined?(Concurrent)
|
119
|
-
end
|
120
|
-
|
121
|
-
end
|
122
|
-
end
|
123
148
|
|
124
|
-
#
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
149
|
+
# Rails Patches
|
150
|
+
require('rails_semantic_logger/extensions/action_cable/tagged_logger_proxy') if defined?(ActionCable::Connection::TaggedLoggerProxy)
|
151
|
+
require('rails_semantic_logger/extensions/action_controller/live') if defined?(ActionController::Live)
|
152
|
+
require('rails_semantic_logger/extensions/action_dispatch/debug_exceptions') if defined?(ActionDispatch::DebugExceptions)
|
153
|
+
require('rails_semantic_logger/extensions/action_view/streaming_template_renderer') if defined?(ActionView::StreamingTemplateRenderer::Body)
|
154
|
+
require('rails_semantic_logger/extensions/active_job/logging') if defined?(ActiveJob::Logging)
|
155
|
+
|
156
|
+
if config.rails_semantic_logger.semantic
|
157
|
+
require('rails_semantic_logger/extensions/rails/rack/logger') if defined?(Rails::Rack::Logger)
|
158
|
+
require('rails_semantic_logger/extensions/action_controller/log_subscriber') if defined?(ActionController::LogSubscriber)
|
159
|
+
require('rails_semantic_logger/extensions/active_record/log_subscriber') if defined?(ActiveRecord::LogSubscriber)
|
160
|
+
end
|
161
|
+
unless config.rails_semantic_logger.started
|
162
|
+
require('rails_semantic_logger/extensions/rails/rack/logger_info_as_debug') if defined?(Rails::Rack::Logger)
|
163
|
+
end
|
164
|
+
unless config.rails_semantic_logger.rendered
|
165
|
+
require('rails_semantic_logger/extensions/action_view/log_subscriber') if defined?(ActionView::LogSubscriber)
|
166
|
+
end
|
167
|
+
if config.rails_semantic_logger.processing
|
168
|
+
require('rails_semantic_logger/extensions/action_controller/log_subscriber_processing') if defined?(ActionView::LogSubscriber)
|
169
|
+
end
|
131
170
|
end
|
132
|
-
end
|
133
|
-
end
|
134
171
|
|
135
|
-
#
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
module ActiveJob::Logging
|
140
|
-
private
|
141
|
-
def tag_logger(*tags, &block)
|
142
|
-
logger.tagged(*tags, &block)
|
172
|
+
# Before any initializers run, but after the gems have been loaded
|
173
|
+
config.after_initialize do
|
174
|
+
# Replace the Bugsnag logger
|
175
|
+
Bugsnag.configure { |config| config.logger = SemanticLogger[Bugsnag] } if defined?(Bugsnag)
|
143
176
|
end
|
144
177
|
end
|
145
178
|
end
|
179
|
+
|
metadata
CHANGED
@@ -1,29 +1,43 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rails_semantic_logger
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 3.0
|
4
|
+
version: 3.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Reid Morrison
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-02-
|
11
|
+
date: 2016-02-27 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rails
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '3.2'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '3.2'
|
13
27
|
- !ruby/object:Gem::Dependency
|
14
28
|
name: semantic_logger
|
15
29
|
requirement: !ruby/object:Gem::Requirement
|
16
30
|
requirements:
|
17
31
|
- - "~>"
|
18
32
|
- !ruby/object:Gem::Version
|
19
|
-
version: '3.
|
33
|
+
version: '3.1'
|
20
34
|
type: :runtime
|
21
35
|
prerelease: false
|
22
36
|
version_requirements: !ruby/object:Gem::Requirement
|
23
37
|
requirements:
|
24
38
|
- - "~>"
|
25
39
|
- !ruby/object:Gem::Version
|
26
|
-
version: '3.
|
40
|
+
version: '3.1'
|
27
41
|
description: Replaces the default Rails logger with SemanticLogger
|
28
42
|
email:
|
29
43
|
- reidmo@gmail.com
|
@@ -35,11 +49,23 @@ files:
|
|
35
49
|
- README.md
|
36
50
|
- Rakefile
|
37
51
|
- lib/rails_semantic_logger.rb
|
52
|
+
- lib/rails_semantic_logger/extensions/action_cable/tagged_logger_proxy.rb
|
53
|
+
- lib/rails_semantic_logger/extensions/action_controller/live.rb
|
54
|
+
- lib/rails_semantic_logger/extensions/action_controller/log_subscriber.rb
|
55
|
+
- lib/rails_semantic_logger/extensions/action_controller/log_subscriber_processing.rb
|
56
|
+
- lib/rails_semantic_logger/extensions/action_dispatch/debug_exceptions.rb
|
57
|
+
- lib/rails_semantic_logger/extensions/action_view/log_subscriber.rb
|
58
|
+
- lib/rails_semantic_logger/extensions/action_view/streaming_template_renderer.rb
|
59
|
+
- lib/rails_semantic_logger/extensions/active_job/logging.rb
|
60
|
+
- lib/rails_semantic_logger/extensions/active_record/log_subscriber.rb
|
61
|
+
- lib/rails_semantic_logger/extensions/rails/rack/logger.rb
|
62
|
+
- lib/rails_semantic_logger/extensions/rails/rack/logger_info_as_debug.rb
|
63
|
+
- lib/rails_semantic_logger/extensions/rails/server.rb
|
38
64
|
- lib/rails_semantic_logger/railtie.rb
|
39
65
|
- lib/rails_semantic_logger/version.rb
|
40
66
|
homepage: https://github.com/rocketjob/rails_semantic_logger
|
41
67
|
licenses:
|
42
|
-
- Apache
|
68
|
+
- Apache-2.0
|
43
69
|
metadata: {}
|
44
70
|
post_install_message:
|
45
71
|
rdoc_options: []
|