【发布时间】:2017-04-04 18:54:16
【问题描述】:
我在使用 Rails 登录时发现了一件奇怪的事情。
我最初试图理解的一个问题是 ActiveRecord 如何将 SQL 查询记录到控制台。
irb(main):001:0> Message.last
Message Load (7.4ms) SELECT "messages".* FROM "messages" ORDER BY "messages"."id" DESC LIMIT 1
我发现输出是here。
但我不明白ActiveRecord::Base.logger#debug 是如何同时打印到STDOUT 和log/development.log 的?
我创建了新的 Rails 5.0.2 应用程序并运行控制台。
那我做
irb(main):001:0> Rails.logger.debug 'foo bar'
foo bar
=> true
我在控制台和 log/development.log 文件中都得到 foo bar 文本。
Rails.logger 看起来像这样
#<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>>
但如果我创建自定义记录器,我只会在日志文件中获得文本
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
除了格式化程序中的@thread_key 之外,Rails.logger 和自定义记录器之间没有太大区别(我可以看到它来自ActiveSupport::TaggedLogging,我认为它与问题无关) .
有谁知道问题出在哪里?我错过了什么?
Rails 4.2.8 也会发生同样的情况。
我在 MongoDB 上运行了 Rails 4.2.8 应用程序(使用 mongoid gem),Rails.logger.debug('foo bar') 在日志文件中打印 only。
这让我觉得整个事情都与 ActiveRecord 有关。
是这样吗?
谢谢。
【问题讨论】:
标签: ruby-on-rails logging activerecord