mongodb_logger 0.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.
- data/.gitignore +20 -0
- data/.rvmrc +1 -0
- data/.travis.yml +17 -0
- data/Gemfile +4 -0
- data/README.md +177 -0
- data/Rakefile +110 -0
- data/SUPPORTED_RAILS_VERSIONS +13 -0
- data/TESTING.md +24 -0
- data/bin/mongodb_logger_web +24 -0
- data/config.ru +16 -0
- data/examples/server_config.yml +4 -0
- data/features/rails.feature +10 -0
- data/features/step_definitions/rails_application_steps.rb +48 -0
- data/features/support/env.rb +15 -0
- data/features/support/rails.rb +91 -0
- data/features/support/terminal.rb +94 -0
- data/lib/mongodb_logger.rb +31 -0
- data/lib/mongodb_logger/initializer_mixin.rb +26 -0
- data/lib/mongodb_logger/logger.rb +184 -0
- data/lib/mongodb_logger/railtie.rb +12 -0
- data/lib/mongodb_logger/replica_set_helper.rb +19 -0
- data/lib/mongodb_logger/server.rb +136 -0
- data/lib/mongodb_logger/server/model/filter.rb +37 -0
- data/lib/mongodb_logger/server/partials.rb +24 -0
- data/lib/mongodb_logger/server/public/images/ajax-loader.gif +0 -0
- data/lib/mongodb_logger/server/public/images/failure.png +0 -0
- data/lib/mongodb_logger/server/public/images/logo.png +0 -0
- data/lib/mongodb_logger/server/public/images/play-icon.png +0 -0
- data/lib/mongodb_logger/server/public/images/stop-icon.png +0 -0
- data/lib/mongodb_logger/server/public/images/success.png +0 -0
- data/lib/mongodb_logger/server/public/javascripts/jquery-1.7.min.js +4 -0
- data/lib/mongodb_logger/server/public/stylesheets/all.css +9 -0
- data/lib/mongodb_logger/server/public/stylesheets/grids.css +18 -0
- data/lib/mongodb_logger/server/public/stylesheets/group-buttons.css +83 -0
- data/lib/mongodb_logger/server/public/stylesheets/group-forms.css +60 -0
- data/lib/mongodb_logger/server/public/stylesheets/group-headers.css +8 -0
- data/lib/mongodb_logger/server/public/stylesheets/group-tables.css +42 -0
- data/lib/mongodb_logger/server/public/stylesheets/layout.css +168 -0
- data/lib/mongodb_logger/server/public/stylesheets/library.css +134 -0
- data/lib/mongodb_logger/server/public/stylesheets/reset.css +43 -0
- data/lib/mongodb_logger/server/public/stylesheets/spaces.css +42 -0
- data/lib/mongodb_logger/server/views/application.coffee +54 -0
- data/lib/mongodb_logger/server/views/error.erb +2 -0
- data/lib/mongodb_logger/server/views/layout.erb +32 -0
- data/lib/mongodb_logger/server/views/overview.erb +94 -0
- data/lib/mongodb_logger/server/views/shared/_log.erb +8 -0
- data/lib/mongodb_logger/server/views/shared/_log_info.erb +25 -0
- data/lib/mongodb_logger/server/views/shared/_tabs.erb +4 -0
- data/lib/mongodb_logger/server/views/show_log.erb +85 -0
- data/lib/mongodb_logger/server_config.rb +45 -0
- data/lib/mongodb_logger/version.rb +3 -0
- data/mongodb_logger.gemspec +37 -0
- data/test/active_record.rb +13 -0
- data/test/config/samples/database.yml +9 -0
- data/test/config/samples/database_no_file_logging.yml +10 -0
- data/test/config/samples/database_replica_set.yml +8 -0
- data/test/config/samples/database_with_auth.yml +9 -0
- data/test/config/samples/mongodb_logger.yml +2 -0
- data/test/config/samples/mongoid.yml +30 -0
- data/test/rails.rb +22 -0
- data/test/rails/app/controllers/order_controller.rb +20 -0
- data/test/rails/test/functional/order_controller_test.rb +56 -0
- data/test/rails/test/test_helper.rb +10 -0
- data/test/shoulda_macros/log_macros.rb +13 -0
- data/test/test.sh +4 -0
- data/test/test_helper.rb +88 -0
- data/test/unit/mongodb_logger_replica_test.rb +45 -0
- data/test/unit/mongodb_logger_test.rb +252 -0
- metadata +300 -0
@@ -0,0 +1,15 @@
|
|
1
|
+
require 'active_support'
|
2
|
+
require 'rspec'
|
3
|
+
|
4
|
+
PROJECT_ROOT = File.expand_path(File.join(File.dirname(__FILE__), '..', '..')).freeze
|
5
|
+
TEMP_DIR = File.join(PROJECT_ROOT, 'tmp').freeze
|
6
|
+
LOCAL_RAILS_ROOT = File.join(TEMP_DIR, 'rails_root').freeze
|
7
|
+
BUILT_GEM_ROOT = File.join(TEMP_DIR, 'built_gems').freeze
|
8
|
+
LOCAL_GEM_ROOT = File.join(TEMP_DIR, 'local_gems').freeze
|
9
|
+
|
10
|
+
Before do
|
11
|
+
FileUtils.mkdir_p(TEMP_DIR)
|
12
|
+
FileUtils.rm_rf(BUILT_GEM_ROOT)
|
13
|
+
FileUtils.rm_rf(LOCAL_RAILS_ROOT)
|
14
|
+
FileUtils.mkdir_p(BUILT_GEM_ROOT)
|
15
|
+
end
|
@@ -0,0 +1,91 @@
|
|
1
|
+
module RailsHelpers
|
2
|
+
def rails_root_exists?
|
3
|
+
File.exists?(environment_path)
|
4
|
+
end
|
5
|
+
|
6
|
+
def environment_path
|
7
|
+
File.join(rails_root, 'config', 'environment.rb')
|
8
|
+
end
|
9
|
+
|
10
|
+
def application_controller_filename
|
11
|
+
controller_filename = File.join(rails_root, 'app', 'controllers', "application_controller.rb")
|
12
|
+
end
|
13
|
+
|
14
|
+
def rails_root
|
15
|
+
LOCAL_RAILS_ROOT
|
16
|
+
end
|
17
|
+
|
18
|
+
def rails30?
|
19
|
+
rails_version =~ /^3.0/
|
20
|
+
end
|
21
|
+
|
22
|
+
def rails31?
|
23
|
+
rails_version =~ /^3.1/
|
24
|
+
end
|
25
|
+
|
26
|
+
def rails_version
|
27
|
+
@rails_version ||= begin
|
28
|
+
rails_version = open(gemfile_path).read.match(/gem.*rails["'].*["'](.+)["']/)[1]
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
def gemfile_path
|
33
|
+
File.join(rails_root, 'Gemfile')
|
34
|
+
end
|
35
|
+
|
36
|
+
def rakefile_path
|
37
|
+
File.join(rails_root, 'Rakefile')
|
38
|
+
end
|
39
|
+
|
40
|
+
def routes_path
|
41
|
+
File.join(rails_root, 'config', 'routes.rb')
|
42
|
+
end
|
43
|
+
|
44
|
+
def logs_path
|
45
|
+
File.join(rails_root, 'log')
|
46
|
+
end
|
47
|
+
|
48
|
+
def bundle_gem(gem_name, version = nil)
|
49
|
+
File.open(gemfile_path, 'a') do |file|
|
50
|
+
gem = "gem '#{gem_name}'"
|
51
|
+
gem += ", '#{version}'" if version
|
52
|
+
file.puts(gem)
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
def require_thread
|
57
|
+
content = File.read(rakefile_path)
|
58
|
+
content = "require 'thread'\n#{content}"
|
59
|
+
File.open(rakefile_path, 'wb') { |file| file.write(content) }
|
60
|
+
end
|
61
|
+
|
62
|
+
def add_routes
|
63
|
+
content = File.read(routes_path)
|
64
|
+
flag = Regexp.escape("Application.routes.draw do\n")
|
65
|
+
content.gsub!(/#{flag}/m, '\0 resources :order')
|
66
|
+
File.open(routes_path, 'wb') { |file| file.write(content) }
|
67
|
+
end
|
68
|
+
|
69
|
+
def copy_tests
|
70
|
+
FileUtils.cp(
|
71
|
+
File.join(PROJECT_ROOT, 'test', 'rails', 'app', 'controllers', 'order_controller.rb'),
|
72
|
+
File.join(rails_root, 'app', 'controllers', 'order_controller.rb')
|
73
|
+
)
|
74
|
+
FileUtils.cp(
|
75
|
+
File.join(PROJECT_ROOT, 'test', 'config', 'samples', 'database.yml'),
|
76
|
+
File.join(rails_root, 'config', 'database.yml')
|
77
|
+
)
|
78
|
+
FileUtils.cp(
|
79
|
+
File.join(PROJECT_ROOT, 'test', 'rails', 'test', 'test_helper.rb'),
|
80
|
+
File.join(rails_root, 'test', 'test_helper.rb')
|
81
|
+
)
|
82
|
+
FileUtils.cp(
|
83
|
+
File.join(PROJECT_ROOT, 'test', 'rails', 'test', 'functional', 'order_controller_test.rb'),
|
84
|
+
File.join(rails_root, 'test', 'functional', 'order_controller_test.rb')
|
85
|
+
)
|
86
|
+
FileUtils.chmod 0777, logs_path
|
87
|
+
end
|
88
|
+
|
89
|
+
end
|
90
|
+
|
91
|
+
World(RailsHelpers)
|
@@ -0,0 +1,94 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
|
3
|
+
Before do
|
4
|
+
@terminal = Terminal.new
|
5
|
+
end
|
6
|
+
|
7
|
+
After do |story|
|
8
|
+
if story.failed?
|
9
|
+
# puts @terminal.output
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
class Terminal
|
14
|
+
attr_reader :output, :status
|
15
|
+
attr_accessor :environment_variables
|
16
|
+
|
17
|
+
def initialize
|
18
|
+
@cwd = FileUtils.pwd
|
19
|
+
@output = ""
|
20
|
+
@status = 0
|
21
|
+
@logger = Logger.new(File.join(TEMP_DIR, 'terminal.log'))
|
22
|
+
|
23
|
+
@environment_variables = {
|
24
|
+
"GEM_HOME" => LOCAL_GEM_ROOT,
|
25
|
+
"GEM_PATH" => "#{LOCAL_GEM_ROOT}:#{BUILT_GEM_ROOT}",
|
26
|
+
"PATH" => "#{gem_bin_path}:#{ENV['PATH']}"
|
27
|
+
}
|
28
|
+
end
|
29
|
+
|
30
|
+
def cd(directory)
|
31
|
+
@cwd = directory
|
32
|
+
end
|
33
|
+
|
34
|
+
def run(command)
|
35
|
+
output << "#{command}\n"
|
36
|
+
current_dir = FileUtils.pwd
|
37
|
+
|
38
|
+
# The ; forces ruby to shell out so the env settings work right
|
39
|
+
cmdline = "sh -c 'cd #{@cwd} && #{environment_settings} #{command} 2>&1 ; '"
|
40
|
+
logger.debug(cmdline)
|
41
|
+
result = `#{cmdline}`
|
42
|
+
logger.debug(result)
|
43
|
+
output << result
|
44
|
+
|
45
|
+
`sh -c 'cd #{current_dir}'`
|
46
|
+
@status = $?
|
47
|
+
end
|
48
|
+
|
49
|
+
def echo(string)
|
50
|
+
logger.debug(string)
|
51
|
+
end
|
52
|
+
|
53
|
+
|
54
|
+
def build_and_install_gem(gemspec)
|
55
|
+
pkg_dir = File.join(TEMP_DIR, 'pkg')
|
56
|
+
FileUtils.mkdir_p(pkg_dir)
|
57
|
+
output = `gem build #{gemspec} 2>&1`
|
58
|
+
gem_file = Dir.glob("*.gem").first
|
59
|
+
unless gem_file
|
60
|
+
raise "Gem didn't build:\n#{output}"
|
61
|
+
end
|
62
|
+
target = File.join(pkg_dir, gem_file)
|
63
|
+
FileUtils.mv(gem_file, target)
|
64
|
+
install_gem_to(LOCAL_GEM_ROOT, target)
|
65
|
+
end
|
66
|
+
|
67
|
+
def install_gem(gem)
|
68
|
+
install_gem_to(LOCAL_GEM_ROOT, gem)
|
69
|
+
end
|
70
|
+
|
71
|
+
def uninstall_gem(gem)
|
72
|
+
`gem uninstall -i #{LOCAL_GEM_ROOT} #{gem}`
|
73
|
+
end
|
74
|
+
|
75
|
+
def prepend_path(path)
|
76
|
+
@environment_variables['PATH'] = path + ":" + @environment_variables['PATH']
|
77
|
+
end
|
78
|
+
|
79
|
+
private
|
80
|
+
|
81
|
+
def install_gem_to(root, gem)
|
82
|
+
`gem install -i #{root} --no-ri --no-rdoc #{gem}`
|
83
|
+
end
|
84
|
+
|
85
|
+
def environment_settings
|
86
|
+
@environment_variables.map { |key, value| "#{key}=#{value}" }.join(' ')
|
87
|
+
end
|
88
|
+
|
89
|
+
def gem_bin_path
|
90
|
+
File.join(LOCAL_GEM_ROOT, "bin")
|
91
|
+
end
|
92
|
+
|
93
|
+
attr_reader :logger
|
94
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
$:.unshift File.dirname(__FILE__)
|
2
|
+
|
3
|
+
require 'mongo'
|
4
|
+
require 'mongodb_logger/logger'
|
5
|
+
require 'mongodb_logger/railtie' if defined?(Rails::Railtie)
|
6
|
+
require 'mongodb_logger/version'
|
7
|
+
|
8
|
+
module MongodbLogger
|
9
|
+
module Base
|
10
|
+
def self.included(base)
|
11
|
+
base.class_eval { around_filter :enable_mongodb_logger }
|
12
|
+
end
|
13
|
+
|
14
|
+
def enable_mongodb_logger
|
15
|
+
return yield unless Rails.logger.respond_to?(:mongoize)
|
16
|
+
f_params = case
|
17
|
+
when request.respond_to?(:filtered_parameters) then request.filtered_parameters
|
18
|
+
else params
|
19
|
+
end
|
20
|
+
Rails.logger.mongoize({
|
21
|
+
:method => request.method,
|
22
|
+
:action => action_name,
|
23
|
+
:controller => controller_name,
|
24
|
+
:path => request.path,
|
25
|
+
:url => request.url,
|
26
|
+
:params => f_params,
|
27
|
+
:ip => request.remote_ip
|
28
|
+
}) { yield }
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module MongodbLogger
|
2
|
+
module InitializerMixin
|
3
|
+
|
4
|
+
def rails30?
|
5
|
+
3 == Rails::VERSION::MAJOR && 0 == Rails::VERSION::MINOR
|
6
|
+
end
|
7
|
+
|
8
|
+
def create_logger(config)
|
9
|
+
path = rails30? ? config.paths.log.to_a.first : config.paths['log'].first
|
10
|
+
level = ActiveSupport::BufferedLogger.const_get(config.log_level.to_s.upcase)
|
11
|
+
logger = MongodbLogger::Logger.new(:path => path, :level => level)
|
12
|
+
logger.auto_flushing = false if Rails.env.production?
|
13
|
+
logger
|
14
|
+
rescue StandardError => e
|
15
|
+
logger = ActiveSupport::BufferedLogger.new(STDERR)
|
16
|
+
logger.level = ActiveSupport::BufferedLogger::WARN
|
17
|
+
logger.warn(
|
18
|
+
"MongodbLogger Initializer Error: Unable to access log file. Please ensure that #{path} exists and is chmod 0666. " +
|
19
|
+
"The log level has been raised to WARN and the output directed to STDERR until the problem is fixed." + "\n" +
|
20
|
+
e.message + "\n" + e.backtrace.join("\n")
|
21
|
+
)
|
22
|
+
logger
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,184 @@
|
|
1
|
+
require 'erb'
|
2
|
+
require 'mongo'
|
3
|
+
require 'active_support'
|
4
|
+
require 'active_support/core_ext'
|
5
|
+
require 'mongodb_logger/replica_set_helper'
|
6
|
+
|
7
|
+
module MongodbLogger
|
8
|
+
class Logger < ActiveSupport::BufferedLogger
|
9
|
+
include ReplicaSetHelper
|
10
|
+
|
11
|
+
DEFAULT_COLLECTION_SIZE = 250.megabytes
|
12
|
+
# Looks for configuration files in this order
|
13
|
+
CONFIGURATION_FILES = ["mongodb_logger.yml", "mongoid.yml", "database.yml"]
|
14
|
+
LOG_LEVEL_SYM = [:debug, :info, :warn, :error, :fatal, :unknown]
|
15
|
+
|
16
|
+
attr_reader :db_configuration, :mongo_connection, :mongo_collection_name, :mongo_collection
|
17
|
+
|
18
|
+
def initialize(options={})
|
19
|
+
path = options[:path] || File.join(Rails.root, "log/#{Rails.env}.log")
|
20
|
+
level = options[:level] || DEBUG
|
21
|
+
internal_initialize
|
22
|
+
if disable_file_logging?
|
23
|
+
@level = level
|
24
|
+
@buffer = {}
|
25
|
+
@auto_flushing = 1
|
26
|
+
@guard = Mutex.new
|
27
|
+
else
|
28
|
+
super(path, level)
|
29
|
+
end
|
30
|
+
rescue => e
|
31
|
+
# should use a config block for this
|
32
|
+
Rails.env.production? ? (raise e) : (puts "Using BufferedLogger due to exception: " + e.message)
|
33
|
+
end
|
34
|
+
|
35
|
+
def add_metadata(options={})
|
36
|
+
options.each do |key, value|
|
37
|
+
unless [:messages, :request_time, :ip, :runtime, :application_name, :is_exception, :params, :method].include?(key.to_sym)
|
38
|
+
@mongo_record[key] = value
|
39
|
+
else
|
40
|
+
raise ArgumentError, ":#{key} is a reserved key for the mongodb logger. Please choose a different key"
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
def add(severity, message = nil, progname = nil, &block)
|
46
|
+
if @level <= severity && message.present? && @mongo_record.present?
|
47
|
+
# do not modify the original message used by the buffered logger
|
48
|
+
msg = logging_colorized? ? message.to_s.gsub(/(\e(\[([\d;]*[mz]?))?)?/, '').strip : message
|
49
|
+
@mongo_record[:messages][LOG_LEVEL_SYM[severity]] << msg
|
50
|
+
end
|
51
|
+
# may modify the original message
|
52
|
+
disable_file_logging? ? message : super
|
53
|
+
end
|
54
|
+
|
55
|
+
# Drop the capped_collection and recreate it
|
56
|
+
def reset_collection
|
57
|
+
@mongo_collection.drop
|
58
|
+
create_collection
|
59
|
+
end
|
60
|
+
|
61
|
+
def mongoize(options={})
|
62
|
+
@mongo_record = options.merge({
|
63
|
+
:messages => Hash.new { |hash, key| hash[key] = Array.new },
|
64
|
+
:request_time => Time.now.getutc,
|
65
|
+
:application_name => @application_name
|
66
|
+
})
|
67
|
+
|
68
|
+
runtime = Benchmark.measure{ yield }.real if block_given?
|
69
|
+
rescue Exception => e
|
70
|
+
add(3, e.message + "\n" + e.backtrace.join("\n"))
|
71
|
+
@mongo_record[:is_exception] = true
|
72
|
+
# Reraise the exception for anyone else who cares
|
73
|
+
raise e
|
74
|
+
ensure
|
75
|
+
# In case of exception, make sure runtime is set
|
76
|
+
@mongo_record[:runtime] = ((runtime ||= 0) * 1000).ceil
|
77
|
+
begin
|
78
|
+
@insert_block.call
|
79
|
+
rescue
|
80
|
+
# do extra work to inpect (and flatten)
|
81
|
+
force_serialize @mongo_record
|
82
|
+
@insert_block.call rescue nil
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
def authenticated?
|
87
|
+
@authenticated
|
88
|
+
end
|
89
|
+
|
90
|
+
private
|
91
|
+
# facilitate testing
|
92
|
+
def internal_initialize
|
93
|
+
configure
|
94
|
+
connect
|
95
|
+
check_for_collection
|
96
|
+
end
|
97
|
+
|
98
|
+
def disable_file_logging?
|
99
|
+
@db_configuration.fetch('disable_file_logging', false)
|
100
|
+
end
|
101
|
+
|
102
|
+
def configure
|
103
|
+
default_capsize = DEFAULT_COLLECTION_SIZE
|
104
|
+
@authenticated = false
|
105
|
+
@db_configuration = {
|
106
|
+
'host' => 'localhost',
|
107
|
+
'port' => 27017,
|
108
|
+
'capsize' => default_capsize}.merge(resolve_config)
|
109
|
+
@mongo_collection_name = @db_configuration[:collection] || "#{Rails.env}_log"
|
110
|
+
@application_name = resolve_application_name
|
111
|
+
@safe_insert = @db_configuration['safe_insert'] || false
|
112
|
+
|
113
|
+
@insert_block = @db_configuration.has_key?('replica_set') && @db_configuration['replica_set'] ?
|
114
|
+
lambda { rescue_connection_failure{ insert_log_record(@safe_insert) } } :
|
115
|
+
lambda { insert_log_record }
|
116
|
+
end
|
117
|
+
|
118
|
+
def resolve_application_name
|
119
|
+
if @db_configuration.has_key?('application_name')
|
120
|
+
@db_configuration['application_name']
|
121
|
+
else
|
122
|
+
Rails.application.class.to_s.split("::").first
|
123
|
+
end
|
124
|
+
end
|
125
|
+
|
126
|
+
def resolve_config
|
127
|
+
config = {}
|
128
|
+
CONFIGURATION_FILES.each do |filename|
|
129
|
+
config_file = Rails.root.join("config", filename)
|
130
|
+
if config_file.file?
|
131
|
+
config = YAML.load(ERB.new(config_file.read).result)[Rails.env]
|
132
|
+
config = config['mongodb_logger'] if config && config.has_key?('mongodb_logger')
|
133
|
+
break unless config.blank?
|
134
|
+
end
|
135
|
+
end
|
136
|
+
config
|
137
|
+
end
|
138
|
+
|
139
|
+
def connect
|
140
|
+
@mongo_connection ||= Mongo::Connection.new(@db_configuration['host'],
|
141
|
+
@db_configuration['port'],
|
142
|
+
:auto_reconnect => true).db(@db_configuration['database'])
|
143
|
+
|
144
|
+
if @db_configuration['username'] && @db_configuration['password']
|
145
|
+
# the driver stores credentials in case reconnection is required
|
146
|
+
@authenticated = @mongo_connection.authenticate(@db_configuration['username'],
|
147
|
+
@db_configuration['password'])
|
148
|
+
end
|
149
|
+
end
|
150
|
+
|
151
|
+
def create_collection
|
152
|
+
@mongo_connection.create_collection(@mongo_collection_name,
|
153
|
+
{:capped => true, :size => @db_configuration['capsize']})
|
154
|
+
end
|
155
|
+
|
156
|
+
def check_for_collection
|
157
|
+
# setup the capped collection if it doesn't already exist
|
158
|
+
create_collection unless @mongo_connection.collection_names.include?(@mongo_collection_name)
|
159
|
+
@mongo_collection = @mongo_connection[@mongo_collection_name]
|
160
|
+
end
|
161
|
+
|
162
|
+
def insert_log_record(safe = false)
|
163
|
+
@mongo_collection.insert(@mongo_record, :safe => safe)
|
164
|
+
end
|
165
|
+
|
166
|
+
def logging_colorized?
|
167
|
+
# Cache it since these ActiveRecord attributes are assigned after logger initialization occurs in Rails boot
|
168
|
+
@colorized ||= Object.const_defined?(:ActiveRecord) && ActiveRecord::LogSubscriber.colorize_logging
|
169
|
+
end
|
170
|
+
|
171
|
+
# force the data in the db by inspecting each top level array and hash element
|
172
|
+
# this will flatten other hashes and arrays
|
173
|
+
def force_serialize(rec)
|
174
|
+
if msgs = rec[:messages]
|
175
|
+
LOG_LEVEL_SYM.each do |i|
|
176
|
+
msgs[i].collect! { |j| j.inspect } if msgs[i]
|
177
|
+
end
|
178
|
+
end
|
179
|
+
if pms = rec[:params]
|
180
|
+
pms.each { |i, j| pms[i] = j.inspect }
|
181
|
+
end
|
182
|
+
end
|
183
|
+
end
|
184
|
+
end
|