看起来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支持的功能吗?您是如何在任何地方记录的?
答案 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
会派上用场。