这是一个两部分问题,但可能有相同的答案。
第一部分: 在我们的应用程序中,一个特定的控制器被很多 - 这么多,所以我们希望将它记录在与所有其他请求分开的文件中。设置FoosController.logger不是我正在寻找的,因为请求会运行一些具有其logger对象的lib文件和活动记录对象,rails会在将控制权交给相关控制器之前记录一些信息。
第二部分: 我们的根application_controller.rb中包含一个全局的前置过滤器,它在大多数控制器的大多数操作之前运行。这个before_filter在日志中非常冗长,并且是将所有日志信息发送到单独文件的候选者。此过滤器之前还会调用libs和ActiveRecord代码,并使用它们自己对记录器的引用。
一种可能的解决方案是将单个控制器作为自己的独立应用程序运行。我还没有尝试过,因为它与app的内部结合在一起。这种方法对before_filter也无济于事。
对于rails应用程序中更精细的日志记录,是否有任何好的解决方案?
谢谢!
答案 0 :(得分:1)
第一部分 我建议您创建自己的记录器类(可能继承自ruby logger(1),让记录器过滤掉请求URL并根据该日志记录到特定文件。
第二部分 最简单的解决方案是为这些方法使用单独的记录器。而不是logger.debug“你的消息”,你只需要调用method_logger.debug“你的消息”。
创建自己的记录器很简单,只需使用ruby logger类(1)。以下代码创建一个记录器,该记录器记录到rails应用程序的logs目录中的my_method.log文件。
method_logger = Logger.new(Rails.root.join('logs','my_method.log')
然后,您可以使用以下命令写入日志,这看起来很熟悉,因为rails也使用Ruby记录器。
method_logger.debug "your debug message here"
(1)http://www.ruby-doc.org/stdlib-1.9.3/libdoc/logger/rdoc/Logger.html
答案 1 :(得分:1)
以下是您可以用来解决第一部分的自定义记录器的代码。我从another Stack Overflow question改编了它以供我自己使用,甚至包括回答者的内联注释。主要区别在于您可以为开发和生产指定不同的日志路径:
# app/concerns/event_notifications_logger.rb
class EventNotificationsLogger < Rails::Rack::Logger
def initialize(app, opts = {})
@default_logger = Rails.logger
@notifications_logger = Logger.new(notifications_log_path)
@notifications_logger.formatter = LogFormat.new
@notifications_logger.level = @default_logger.level
@app = app
@opts = opts
end
def call(env)
logger = if env['PATH_INFO'] == '/event_notifications/deliver'
@notifications_logger
else
@default_logger
end
# What?! Why are these all separate?
ActiveRecord::Base.logger = logger
ActionController::Base.logger = logger
Rails.logger = logger
# The Rails::Rack::Logger class is responsible for logging the
# 'starting GET blah blah' log line. We need to call super here (as opposed
# to @app.call) to make sure that line gets output. However, the
# ActiveSupport::LogSubscriber class (which Rails::Rack::Logger inherits
# from) caches the logger, so we have to override that too
@logger = logger
super
end
private
def notifications_log_path
Rails.env.production? ? '/var/log/event-notifications.log' : Rails.root.join('log/event-notifications.log')
end
end
然后将其包含在您的应用程序配置中:
require File.expand_path('../boot', __FILE__)
require 'rails/all'
require File.expand_path('../../app/concerns/event_notifications_logger', __FILE__)
module YourApp
class Application < Rails::Application
config.middleware.swap Rails::Rack::Logger, EventNotificationsLogger
# ...
end
end
答案 2 :(得分:0)
Rails 3.2为日志提供过滤器选项,称为&#34;标记日志记录&#34;。