这里的另一种解决方案:
module MySinatraAppLogger
extend ActiveSupport::Concern
class << self
def logger_instance
@logger_instance ||= ::Logger.new(log_file).tap do |logger|
::Logger.class_eval { alias :write :'<<' }
logger.level = ::Logger::INFO
end
end
def log_file
@log_file ||= File.new("#{MySinatraApp.settings.root}/log/#{MySinatraApp.settings.environment}.log", 'a+').tap do |log_file|
log_file.sync = true
end
end
end
included do
configure do
enable :logging
use Rack::CommonLogger, MySinatraAppLogger.logger_instance
end
before { env["rack.errors"] = MySinatraAppLogger.log_file }
end
def logger
MySinatraAppLogger.logger_instance
end
end
class MySinatraApp < Sinatra::Base
include MySinatraAppLogger
get '/' do
logger.info params.inspect
end
end
当然,你可以在没有ActiveSupport :: Concern的情况下做到这一点将configure
和before
块直接插入到MySinatraApp中,但我喜欢这种方法是非常干净 - 所有日志记录配置完全从主应用程序类中抽象出来。
这也很容易找到你可以改变它。例如,SO询问了如何在开发中登录到控制台。这里很明显,你需要做的只是在log_file
方法中的一个if-then逻辑。
如果您包含有关如何设置记录器目标(文件/ STDOUT)以及如何实际记录('logger.info“foo”'?)的信息,这个答案会更有帮助。 ) – Phrogz 2011-05-13 19:51:25
在github的Sinatra README中描述了用法:'logger.inf O( “foo” 的)'。目的地由Web服务器设置(它使用机架错误流),你可以通过改变'env ['rack.errors']'来设置它。 – 2011-05-13 21:18:38
因为使用助手,这似乎只适用于请求上下文。它不适用于在应用程序的早期部分发生的事情(预先请求,应用程序设置等) – lfender6445 2016-03-15 15:08:13