2

私は Rails から sinatra に移行していますが、ロギングの使用に問題があります。私は Sinatra アプリを持っています。それは次のようにログを記録します:

  configure do
    Logger.class_eval { alias :write :'<<' }
    logger = Logger.new("log/#{settings.environment}.log")
    use Rack::CommonLogger, logger
  end

すべてのリクエストが適切にログに記録されます。sth のように表示されます

127.0.0.1 - - [25/May/2013 10:34:21] "GET / HTTP/1.1" 200 30 0.0021
127.0.0.1 - - [25/May/2013 10:34:22] "GET /favicon.ico HTTP/1.1" 404 18 0.0041

ログファイル内。しかし、アプリケーション エラーもログ ファイルに記録したいと考えています。実稼働環境でアプリを起動するRACK_ENV=production rackup config.ruとエラーが発生し、500 http ステータスのみがログに記録され、エラー自体はログに記録されません。エラーはコンソール内に表示されます。これは開発には問題ありませんが、本番環境には適していません。エラーは、後でデバッグするためにログ ファイル内に表示されます。

これが私のconfig.ru

require 'rubygems'
require 'bundler'
Bundler.require(:default, ENV['RACK_ENV'].to_sym)
disable :run
Encoding.default_external = Encoding::UTF_8

use Rack::ShowExceptions
use Rack::Session::Pool

require File.expand_path '../app.rb', __FILE__
run App

そして、これは私のapp.rb

class App < Sinatra::Base
  configure do
    set :public_folder, Proc.new { File.join(root, "public") }
    Logger.class_eval { alias :write :'<<' }
    logger = Logger.new("log/#{settings.environment}.log")
    use Rack::CommonLogger, logger
  end

  get '/' do
    raise "ERROR"
    erb :home, layout: :layout
  end
end

enable :logging, :dump_errors, :raise_errorsブロックの内側をいじってみましたconfigure doが、何も起こりません。モジュラーアプリケーションとしてsinatraを使っているからですか?ルート内get "/"で、構成ブロック内に設定された変数にアクセスできます。

それで、sinatraでエラーをファイルに記録するためのベストプラクティスは何ですか?

4

2 に答える 2

3

ここのドキュメントを読んでください: http://www.sinatrarb.com/intro.html#Logging

ロギングはデフォルトで Sinatra::Application に対してのみ有効になっていることに注意してください。そのため、Sinatra::Base から継承する場合は、おそらく自分で有効にする必要があります。

class MyApp < Sinatra::Base
  configure :production, :development do
    enable :logging
  end
end
于 2013-05-25T11:28:55.340 に答える
1

Sinatra にエラー メッセージをファイルに移動させる唯一の方法は次のとおりです。

$stderr.reopen(<the file path>)

より詳細な例:

class App < Sinatra::Base
  configure do
    set :logging, true
    set :root, File.dirname(__FILE__)
  end

  configure :development, :production do
    # console log to file
    log_path = "#{root}/log" 
    Dir.mkdir(log_path) unless File.exist?(log_path)
    log_file = File.new("#{log_path}/#{settings.environment}.log", "a+")
    log_file.sync = true
    $stdout.reopen(log_file)
    $stderr.reopen(log_file)
  end
end
于 2013-12-11T18:59:24.067 に答える