Ruby on rails rails4中的自定义记录器?

Ruby on rails rails4中的自定义记录器?,ruby-on-rails,logging,Ruby On Rails,Logging,看起来Rails4的记录器与Rails3的记录器不同,它最终支持自定义格式设置程序,就像ruby stdlib记录器一样 Rails.logger.formatter # => #<ActiveSupport::Logger::SimpleFormatter:0x007ff81757d890 @datetime_format=nil> Rails.logger.formatter = SomeFormatterClass Rails.logger.formatter#=>#

看起来Rails4的记录器与Rails3的记录器不同,它最终支持自定义格式设置程序,就像ruby stdlib记录器一样

Rails.logger.formatter  # => #<ActiveSupport::Logger::SimpleFormatter:0x007ff81757d890 @datetime_format=nil>
Rails.logger.formatter = SomeFormatterClass
Rails.logger.formatter#=>#
Rails.logger.formatter=SomeFormatterClass
但是,当我尝试给它一个格式化程序类,该类对于stdlib Logger格式化程序来说就足够了:

[2014-03-12 16:23:27] ERROR NoMethodError: undefined method `tagged' for #<FormattedRailsLoggerFormatter:0x007fd816545ad8>
/Users/jrochkind/.gem/ruby/1.9.3/gems/activesupport-4.0.3/lib/active_support/tagged_logging.rb:67:in `tagged'
/Users/jrochkind/.gem/ruby/1.9.3/gems/railties-4.0.3/lib/rails/rack/logger.rb:20:in `call'
[2014-03-12 16:23:27]错误名称错误:未定义的“标记”方法#
/Users/jrochkind/.gem/ruby/1.9.3/gems/activesupport-4.0.3/lib/active\u-support/taged\u-logging.rb:67:在“taged”中
/Users/jrochkind/.gem/ruby/1.9.3/gems/railties-4.0.3/lib/rails/rack/logger.rb:20:in'call'

有人知道吗,自定义格式化程序实际上是Rails4支持的功能吗?你是如何做到这一点的

Rails4提供了一个配置变量,
config.log\u formatter
。您可能会在
config/application.rb
和其他应用程序配置中设置它

您应该将其设置为实现stdlib Logger格式化程序接口的对象:基本上,您必须提供一个方法
调用(severity、time、progname、msg)
,该方法返回格式化的日志行

注意:您将其设置为对象,而不是类名,例如:

config.log_formatter = MyFormatter.new
您不应该尝试直接设置Rails.logger.formatter——Rails希望您通过配置来设置它,并在使用配置时做一些棘手的事情,使您的格式化程序和记录器与Rails一起正常工作。您可以看到,在中确实使用了
config.log\u formatter
。(多亏了github及其出色的代码搜索和显示ui,我才发现了
config.log\u formatter


在Rails4中,您应该而不是只需对Rails的任何部分进行猴子补丁即可使用自定义日志格式化程序,只需使用
config.log\u格式化程序即可。(在Rails3中,您确实需要一个或另一个猴子补丁来获得自定义日志格式)

如果它对其他人有帮助,在Rails 4.2.6和Ruby 2.3.0中,这就是我的工作原理:

# config/application.rb
module MyRailsApp
  class Application < Rails::Application
    require 'my_log_formatter'
    ...
    # Custom log formatter that uses JSON
    config.log_formatter = MyLogFormatter.new
  end
end
#config/application.rb
模块MyRailsApp
类应用程序
要做到这一点:

# lib/my_log_formatter.rb
class MyLogFormatter < ActiveSupport::Logger::SimpleFormatter
  def call(severity, timestamp, progname, message)
    if message.present? && message.exclude?('Started GET "/assets')
      {
          app: Rails.application.class.parent_name,
          process_id: Process.pid,
          level: severity,
          time: timestamp,
          progname: progname,
          message: message
      }.to_json + "\r\n"
    else
      ''
    end
  end
end
#lib/my_log_formatter.rb
类MyLogFormatter
一些注意事项:

  • if
    语句阻止不包含消息的日志条目,以及记录资产文件服务的日志消息
  • +“\r\n”
    在行的末尾添加了一个CR+LF,因此它在rails服务器控制台中仍然具有一定的可读性
  • 我添加了
    app
    ,因为我在多个应用程序之间共享一个日志文件。您可以在只使用一个Rails应用程序的系统中删除此日志文件
  • 我发现在繁忙的服务器上查看日志时,
    process\u id
    非常方便

你检查过这个吗?在你指出它之前,我没有发现你提到的StackOverflow,但我也没有发现它回答了我的问题。你对设置
config.log\u formatter
为什么对我不起作用有什么想法吗?请参阅我的问题。