2012-05-11 1 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 READMEを読んでいます:http://www.sinatrarb.com/intro#Logging。 ::

enable :logging 

、次にシナトラはラックからの他の構成を取るCommonLoggerが、それは正確に...

ことを行う方法を言っていない:私が必要とするすべてがあることを示唆しているようです

ありがとうございました!

+0

'use Rack :: CommonLogger'文はコメントアウトしますか? – Kashyap

+0

Rog :: CommonLoggerは同じ結果(NullLogger)を持っています – Sly

+0

ここに手がかりがあります... logger = new( 'vehicle.log')をメインアプリケーションファイルに移動すると、ロガーが有効になります。ですから、何らかの理由で、environment.rbファイル内のロガーをインスタンス化すると、ルートがLoggerを見ることが妨げられています...これについての説明はありません...モジュール内のenvironment.rbコードをラップしようとしました。問題を引き起こしている何らかの種類の名前空間の競合があったかどうかを確認するために、メインのアプリケーションファイルで、しかし、ロガーはまだ不明瞭です。ロガーが次のような別のファイルでインスタンス化できない理由はわかりません... – Sly

答えて

0

"logger"がアプリケーションファイルで有効にならない理由は、environment.rbファイルにローカルスコープがあるためです。一般に、ファイルに定義されたRuby変数は、そのファイル内でローカルにスコープされます。

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

グローバル変数の使用は、一般的に眉をひそめるされていますが、このアプリは、それはおそらく大丈夫だということは十分に簡単です。このため

私のソリューションは、「ロガー」変数グローバル作ることでした。それにもかかわらず、もしアプリケーションがより大きくなるならば、より多くのモジュールベースのアプリケーションを見て、別の方法で設定を処理することはおそらく意味をなさないでしょう。 (おそらく、モジュールやconfigu.ruファイルですか?)

これは "理想的な"解決策なのかどうかは分かりません。

ちなみに、environment.rbファイルで定義されているSiteConfig変数は、別のアプリケーションファイルで値が「見る」ことができる理由で定数(これはputs "SiteConfig: #{defined? SiteConfig}"を実行すると分かります)です。

関連する問題