1

シンプルなクラシック スタイルのシナトラ アプリでログ記録をセットアップしようとしています。(v1.3.2) 次のように、すべてのセットアップを environment.rb ファイルに定義します。

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

その後、sinatra は Rack::CommonLogger から残りの構成を取得しますが、それを正確に行う方法については述べていません...

アイデアをお寄せいただきありがとうございます。

4

1 に答える 1

0

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

これに対する私の解決策は、「ロガー」変数をグローバルにすることでした:

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

グローバル変数の使用は一般的に嫌われていますが、このアプリは単純なのでおそらく問題ありません。それでも、アプリが大きくなった場合は、よりモジュールベースのアプリを見て、別の方法で構成を処理することがおそらく理にかなっているでしょう。(おそらくモジュール、またはconfigu.ruファイルで?)

これが「理想的な」解決策であるかどうかはわかりません。より良いアイデアがあればコメントしてください。

ちなみに、environment.rb ファイルで定義されている SiteConfig 変数は定数であることがわかります (これは を実行することで確認できますputs "SiteConfig: #{defined? SiteConfig}")。そのため、その値は別のアプリ ファイルで「見る」ことができます。

于 2012-06-02T19:50:16.383 に答える