2012-05-11 40 views
1

我試圖在簡單的經典風格的sinatra應用中設置日誌記錄。 (V1.3.2)我定義所有我的設置在environment.rb文件中是這樣的:登錄「經典」風格Sinatra應用

require 'sinatra' 
require 'couchrest' 
require 'couchrest_model' 
require 'json' 
require "net/http" 
require "uri" 
require 'shotgun' # to auto-restart server on page reload 

enable :run, :logging 

# CouchDB setup 
configure do 
    SiteConfig = OpenStruct.new(
           :url_base => 'http://localhost:4567/', 
           :url_base_db => 'http://localhost:5984/', 
           :db_name => 'adrequest' 
          ) 
end 

# Logging setup 
logger = Logger.new('vehicle.log') 
use Rack::CommonLogger, logger 

我的應用程序文件是這樣的:

require './environment' 

class Vehicle < CouchRest::Model::Base 
    use_database CouchRest.database!((SiteConfig.url_base_db || '') + SiteConfig.db_name) 

    property :url, String 
    timestamps! 

    validates_presence_of :url 
end 

get '/*' do 

    requesturl = params[:splat].first 

    @vehicle = Vehicle.new 
    @vehicle.url = requesturl 
    @vehicle.save 
    puts "logger: #{env['rack.logger']}" 
    puts "env: #{ENV['RACK_ENV']}" 
    logger.info "written to DB" 
end 

not_found do 
    halt 404, 'page not found' 
end 

結果:

logger: #<Rack::NullLogger:0x007fb4f4ccc238> 
env: development 

該應用程序創建一個'vehicle.log'文件,但它是空的。如何讓logger.info寫入我的'vehicle.log'文件?

我已閱讀Sinatra自述文件:http://www.sinatrarb.com/intro#Logging。這似乎暗示着所有我需要的是:

enable :logging 

然後辛納屈會從機架:: CommonLogger配置的休息,但它並沒有說怎麼做,究竟...

在此先感謝您的任何想法!

+0

評論'使用Rack :: CommonLogger'語句工作嗎? – Kashyap

+0

註釋使用Rack :: CommonLogger具有相同的結果(NullLogger) – Sly

+0

這是一個線索...移動記錄器= Logger.new('vehicle.log')到主應用程序文件使記錄器。因此,出於某種原因,在environment.rb文件中實例化記錄器會阻止路由器看到Logger ...我沒有對此進行解釋......我嘗試在Environment中包裝environment.rb代碼,並且包含在主應用程序文件中查看是否存在導致該問題的某種名稱空間衝突,但Logger仍然模糊不清。不知道爲什麼記錄器不能在像這樣的單獨文件中實例化... – Sly

回答

0

「logger」從未在應用程序文件中啓用的原因是因爲它在environment.rb文件中具有本地作用域。通常,文件中定義的Ruby變量在該文件中的本地範圍內。

我對這個解決辦法是使「記錄儀」可變全球:

$logger = Logger.new('vehicle.log') 

雖然全局變量的使用一般都不贊成,這個程序是非常簡單,它可能是好的。不過,如果應用程序變得更大,那麼查看更多基於模塊的應用程序並以不同方式處理配置可能是有意義的。 (也許與模塊,或configu.ru文件?)

我不知道這是「理想」的解決方案,所以如果任何人有任何更好的想法,請評論。

順便提一下,environment.rb文件中定義的SiteConfig變量是一個常量(您可以通過執行puts "SiteConfig: #{defined? SiteConfig}"來看到這一點),這就是爲什麼它的值可以在單獨的應用程序文件中「看到」。

相關問題