rails4中的自定义记录器?

时间:2014-03-12 20:34:24

标签: ruby-on-rails logging

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

Rails.logger.formatter  # => #<ActiveSupport::Logger::SimpleFormatter:0x007ff81757d890 @datetime_format=nil>
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'

有谁知道,自定义格式化程序实际上是Rails4支持的功能吗?您是如何在任何地方记录的?

2 个答案:

答案 0 :(得分:5)

回答我自己的问题,我已经弄明白了。

Rails4提供了一个配置变量config.log_formatter。您可能会在config/application.rb中将其与其他应用程序配置一起设置。

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

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

config.log_formatter = MyFormatter.new

你应该尝试直接设置Rails.logger.formatter - Rails希望你通过config设置它,并做一些棘手的事情让你的格式化程序和记录器在你使用Rails时正常工作使用配置。您可以在Rails source code here中看到,以及确实使用了config.log_formatter。 (感谢github以及它非常棒的代码搜索和显示ui,我是如何追踪它并找出config.log_formatter)的存在

在Rails4中,你应该需要对Rails的任何部分进行修补,只是为了使用自定义日志格式化程序,而只需使用config.log_formatter。 (在Rails3中,您确实需要对其中一个或另一个进行修补以获得自定义日志格式)。

答案 1 :(得分:3)

如果它帮助其他人,在Rails 4.2.6和Ruby 2.3.0中,这对我有用:

/*!
 * @brief a struct
 * @??? a first struct member
 * @??? b second struct member
 *
 * Longer description
 */
struct a 
{
    int a,
    int b,
};

要实现这一目标:

# 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

一些注意事项:

  • # 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 语句可防止没有消息的日志条目,并记录记录资产文件服务的日志消息。
  • if在行的末尾添加了一个CR + LF,因此它在rails服务器控制台中仍然具有人类可读性。
  • 我添加了+ "\r\n",因为我在许多应用中共享一个日志文件。您可以在仅使用一个Rails应用程序的系统中删除它。
  • 当您查看繁忙服务器上的日志时,我发现app会派上用场。