2013-05-25 1 views
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 

внутри лог-файлов. Но я также хочу регистрировать ошибки приложения в файле журнала. Когда я запускаю свое приложение в режиме env с 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 блока, но это не имеет ничего. Это потому, что я использую синатра в качестве модульного приложения? Внутри маршрута get "/" я могу получить доступ к переменным, установленным внутри блока configure.

Значит, любая идея, какова лучшая практика, регистрировать ошибки в файле с помощью синатра?

ответ

2

Прочитайте документацию здесь: http://www.sinatrarb.com/intro.html#Logging

Обратите внимание, что регистрация включена только для Sinatra :: Application по умолчанию, так что если вы унаследовали от Sinatra :: Base, вы, вероятно, хотите, чтобы включить его самостоятельно:

class MyApp < Sinatra::Base 
    configure :production, :development do 
    enable :logging 
    end 
end 
1

единственный способ, которым я сделал Синатру для перемещения сообщений об ошибках в файл был:

$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 
+1

Помните, что _reopening_ 'STDOUT' заставит Пассажира прекратить работу:/https://github.com/phusion/passenger/wiki/Debugging-application-startup-problems#stdout-redirection – fguillen