這裏的另一種解決方案:
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