我是从Rails来到sinatra,我在使用日志时遇到了一些问题。我有一个Sinatra应用程序,就像这样记录:
configure do
Logger.class_eval { alias :write :'<<' }
logger = Logger.new("log/#{settings.environment}.log")
use Rack::CommonLogger, logger
end
所有请求都已正确记录,我看起来像
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将错误记录到文件中?
答案 0 :(得分:3)
阅读此处的文档:http://www.sinatrarb.com/intro.html#Logging
请注意,默认情况下只对Sinatra :: Application启用日志记录,因此如果您从Sinatra :: Base继承,您可能希望自己启用它:
class MyApp < Sinatra::Base
configure :production, :development do
enable :logging
end
end
答案 1 :(得分: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