1
+ module MongoLoggerModifications
2
+ def self . included ( base )
3
+ base . class_eval {
4
+ alias_method :old_add , :add
5
+ alias_method :new_add , :add
6
+
7
+ db_configuration = {
8
+ 'host' => 'localhost' ,
9
+ 'port' => 27017 ,
10
+ 'capsize' => 100000 } . merge ( YAML ::load ( ERB . new ( IO . read ( File . join ( Rails . root , 'config/database.yml' ) ) ) . result ) [ Rails . env ] [ 'mongo' ] )
11
+
12
+ @@mongo_collection_name = "#{ Rails . env } _log"
13
+ @@mongo_connection ||= Mongo ::Connection . new ( db_configuration [ 'host' ] , db_configuration [ 'port' ] , :auto_reconnect => true ) . db ( db_configuration [ 'database' ] )
14
+
15
+ # setup the capped collection if it doesn't already exist
16
+ unless @@mongo_connection . collection_names . include? ( @@mongo_collection_name )
17
+ @@mongo_connection . create_collection ( @@mongo_collection_name , { :capped => true , :size => db_configuration [ 'capsize' ] } )
18
+ end
19
+
20
+ cattr_reader :mongo_connection , :mongo_collection_name
21
+ }
22
+ end
23
+
24
+ def mongoize ( options = { } )
25
+ @mongo_record = options . merge ( {
26
+ :messages => Hash . new { |hash , key | hash [ key ] = Array . new } ,
27
+ :request_time => Time . now . utc
28
+ } )
29
+ runtime = Benchmark . ms do
30
+ yield
31
+ end
32
+ @mongo_record [ :runtime ] = runtime . ceil
33
+ self . class . mongo_connection [ self . class . mongo_collection_name ] . insert ( @mongo_record ) rescue nil
34
+ end
35
+
36
+ def add_metadata ( options = { } )
37
+ options . each_pair do |key , value |
38
+ unless [ :messages , :request_time , :ip , :runtime ] . include? ( key . to_sym )
39
+ info ( "adding #{ key } => #{ value } " )
40
+ @mongo_record [ key ] = value
41
+ else
42
+ raise ArgumentError , ":#{ key } is a reserved key for the mongo logger. Please choose a different key"
43
+ end
44
+ end
45
+ end
46
+
47
+ def new_add ( severity , message = nil , progname = nil , &block )
48
+ unless @level > severity
49
+ if ActiveRecord ::Base . colorize_logging
50
+ # remove colorization done by rails and just save the actual message
51
+ @mongo_record [ :messages ] [ level_to_sym ( severity ) ] << message . gsub ( /(\e (\[ ([\d ;]*[mz]?))?)?/ , '' ) . strip rescue nil
52
+ else
53
+ @mongo_record [ :messages ] [ level_to_sym ( severity ) ] << message
54
+ end
55
+ end
56
+
57
+ old_add ( severity , message , progname , &block )
58
+ end
59
+ end
0 commit comments