2017-04-04 1 views
0

Ich spielte mit Rails einloggen und ich habe eine seltsame Sache bemerkt.
Eine Frage, die ich zuerst versuchte zu verstehen, war, wie ActiveRecord SQL-Abfragen zur Konsole loggen.Rails.logger mystisches Verhalten

irb(main):001:0> Message.last 
    Message Load (7.4ms) SELECT "messages".* FROM "messages" ORDER BY "messages"."id" DESC LIMIT 1 

Ich fand, dass die Ausgabe here gemacht wird. Aber ich kann nicht verstehen, wie ActiveRecord::Base.logger#debug beide auf STDOUT und log/development.log drucken?

Ich neue Rails 5.0.2-Anwendung erstellen und Konsole ausführen.

Dann mache ich

irb(main):001:0> Rails.logger.debug 'foo bar' 
foo bar 
=> true 

ich foo bar Text sowohl in der Konsole und log/development.log Datei.

Rails.logger sieht aus wie dieses

#<ActiveSupport::Logger:0x007f9545860150 @progname=nil, @level=0, @default_formatter=#<Logger::Formatter:0x007f9545860088 @datetime_format=nil>, @formatter=#<ActiveSupport::Logger::SimpleFormatter:0x007f95430b7d10 @datetime_format=nil, @thread_key="activesupport_tagged_logging_tags:70139525840520">, @logdev=#<Logger::LogDevice:0x007f9545861820 @shift_size=nil, @shift_age=nil, @filename=nil, @dev=#<File:/Users/aleksey/projects/test-logger/log/development.log>, @mon_owner=nil, @mon_count=0, @mon_mutex=#<Thread::Mutex:0x007f9545863080>>, @local_levels=#<Concurrent::Map:0x007f9545893de8 entries=0 default_proc=nil>> 

Aber wenn ich benutzerdefinierte Logger erstelle ich Text bekommen nur in Protokolldatei

irb(main):005:0* logger = ActiveSupport::Logger.new('log/development.log') 
=> #<ActiveSupport::Logger:0x007f9543411588 @progname=nil, @level=0, @default_formatter=#<Logger::Formatter:0x007f9543411510 @datetime_format=nil>, @formatter=#<ActiveSupport::Logger::SimpleFormatter:0x007f9543411330 @datetime_format=nil>, @logdev=#<Logger::LogDevice:0x007f95434114c0 @shift_size=1048576, @shift_age=0, @filename="log/development.log", @dev=#<File:log/development.log>, @mon_owner=nil, @mon_count=0, @mon_mutex=#<Thread::Mutex:0x007f9543411448>>, @local_levels=#<Concurrent::Map:0x007f9543411290 entries=0 default_proc=nil>> 
irb(main):006:0> logger.debug 'foo bar' 
=> true 

ich nicht zu viel Unterschied zwischen Rails.logger und benutzerdefinierte Logger sehen außer @thread_key im Formatierer (wie ich sehen kann, kommt es von ActiveSupport::TaggedLogging, ich denke nicht, dass es etwas mit dem Problem zu tun hat).

Weiß jemand wo ist das Problem? Was ich vermisse?

Das Gleiche passiert auch mit Rails 4.2.8.
Ich habe Rails 4.2.8 Anwendung läuft auf MongoDB (mit Mongoid Edelstein) und dort Rails.logger.debug('foo bar') Drucke nur in der Protokolldatei.
Es lässt mich denken, dass das Ganze irgendwie ActiveRecord verwandt ist.
Ist es so?

Vielen Dank.

Antwort

0

Scheint wie es sich auf ActiveRecord bezieht.
Ich fand this Railtie-Code, der Log-Broadcast zu STDOUT hinzufügt.