2012-08-12 32 views
2

我正在使用瘦Web服務器來服務Ruby/Sinatra應用程序。這得到了我的注意的事情是,當我運行:瘦服務器多次記錄相同的請求

RACK_ENV=production rackup 

每個請求都被記錄像5倍,並與不同的時間戳。

[email protected]:/app$ RACK_ENV=production rackup 
** Building /assets/application.js... 
** Building /assets/screen.css... 
>> Thin web server (v1.4.1 codename Chromeo) 
>> Maximum connections set to 1024 
>> Listening on 0.0.0.0:9292, CTRL+C to stop 
10.0.2.2 - - [12/Aug/2012 03:54:56] "GET/HTTP/1.1" 200 4 0.0024 
10.0.2.2 - - [12/Aug/2012 03:54:56] "GET/HTTP/1.1" 200 4 0.0034 
10.0.2.2 - - [12/Aug/2012 03:54:56] "GET/HTTP/1.1" 200 4 0.0044 
10.0.2.2 - - [12/Aug/2012 03:54:56] "GET/HTTP/1.1" 200 4 0.0054 
10.0.2.2 - - [12/Aug/2012 03:54:56] "GET/HTTP/1.1" 200 4 0.0065 
10.0.2.2 - - [12/Aug/2012 03:54:56] "GET/HTTP/1.1" 200 4 0.0076 
10.0.2.2 - - [12/Aug/2012 03:54:56] "GET/HTTP/1.1" 200 4 0.0094 
10.0.2.2 - - [12/Aug/2012 03:54:56] "GET/HTTP/1.1" 200 - 0.0102 

這讓我相信,不知怎的,請求被做了好幾次。或者只記錄多次?

當我跑得

rackup 

,並嘗試同樣的要求。這是我得到的。

[email protected]:/app$ rackup 
>> Thin web server (v1.4.1 codename Chromeo) 
>> Maximum connections set to 1024 
>> Listening on 0.0.0.0:9292, CTRL+C to stop 
10.0.2.2 - - [12/Aug/2012 03:56:42] "GET/HTTP/1.1" 200 - 0.1228 

差異基本上是狀態碼後的「 - 」,就像生產服務器中的最後一行日誌一樣。但我真的不知道這意味着什麼。

我想知道是否在生產中請求被處理多次。 我正在使用Sinatra這樣的路線。

class Project::Base < Sinatra::Application 
    ..configs here 
end 

class Project::Routes::Home < Project::Base 
    get '/' 
    "something" 
    end 
end 

config.ru

RACK_ENV = ENV["RACK_ENV"] ||= "development" unless defined? RACK_ENV 
require 'sprockets' 
map '/assets' do 
    environment = Sprockets::Environment.new 
    environment.append_path 'app/assets/javascripts' 
    environment.append_path 'app/assets/stylesheets' 

    run environment 
end 
require File.dirname(__FILE__) + '/config/boot.rb' 
use Rack::Deflater 
run GRBTV::Main 

./config/boot.rb

require 'rubygems' 
gem 'psych' 

# Require default environment config 
require File.join(File.dirname(__FILE__), 'env') 

# Bundler setup check 
require 'bundler' 
begin 
    Bundler.setup 
rescue Bundler::BundlerError => e 
    $stderr.puts e.message 
    $stderr.puts "Run 'bundle install' to install missing gems" 
    exit e.status_code 
end 


# Sinatra 
require 'sinatra/base' 
require 'sinatra/flash' 
require 'json' 

RACK_ENV = ENV['RACK_ENV'] ||= 'development' unless defined? RACK_ENV 
ROOT_DIR = File.dirname(__FILE__).gsub(/config/,'') unless defined? ROOT_DIR 

# Path helper methods 
# root_path("config", "settings.yml") 
def root_path(*args) 
    File.join(ROOT_DIR, *args) 
end 

# relative_from_root_path("~/projects/project_name/config/settings.yml") #=> "config/settings.yml" 
def relative_from_root_path(path) 
    Pathname.new(path).relative_path_from(Pathname.new(ROOT_DIR)).to_s 
end 

# public_path("images") #=> "public/images" 
def public_path(*args) 
    root_path('public', *args) 
end 

# Module containers for autoloaded helpers and routes 
module GRBTV 
    module Helpers 
    end 
    module Routes 
    end 
end 

# Attempts to require all dependencies with bundler, if this fails, bundle and then try again 
require 'bundler' 
Bundler.setup(:default) 
Bundler.require(:default) 

# Dependencies contains all required gems and core configuration 
require root_path('config', 'dependencies.rb') 

def app() GRBTV::Main end 

./config/dependencies.rb

require File.join(File.dirname(__FILE__), './loader') 

initializers = [] 
# Requires initializers 
Loader.load_files('config/initializers/*.rb') do |file| 
    require file 
    begin 
    # Save Initializer module in the initializers array 
    file_class = File.basename(file, '.rb').camelize 
    initializers << "#{file_class}Initializer".constantize 
    rescue NameError 
    end 
end 

require 'yaml' 
YAML::ENGINE.yamler = 'psych' 

# Load app components 
['lib/*.rb', 'app/uploaders/*.rb', 'app/models/*.rb'].each do |glob| 
    Loader.load_files(glob) 
end 


# Basic Sinatra::Application settingss 
class GRBTV::Base < Sinatra::Application 
    def options() settings end 

    set :root, root_path 
    set :views, root_path('app', 'views') 
    set :public_folder, root_path('public') 
    set :environment, RACK_ENV.to_sym if defined? RACK_ENV 
    set :protection, :except => :frame_options 

    use Rack::MethodOverride 
    enable :sessions 
    register Sinatra::NamedRoutes 
    register MongoMapper 
    helpers Sinatra::FieldBuilder 
    helpers Sinatra::Warden::Helpers 

    # Require all helpers 
    Loader.load_files("app/helpers/**/*.rb") do |file| 
    relative_path = relative_from_root_path(file).gsub(/\.rb$/, '').gsub('app/helpers/', '') 
    module_name = "GRBTV::Helpers::#{relative_path.camelize}" 
    Loader.define_namespaces(module_name) 
    require file 
    helpers module_name.constantize 
    end 


    # Sets the default layout for every route 
    before do 
    @default_layout = :'layout' 
    end 

    before '/assets/*' do 
    headers['Cache-Control'] = 'public, max-age=86400' 
    end 
end 

# Load mailers 
Loader.load_files('app/mailers/*.rb') 


class GRBTV::Main < GRBTV::Base 
    # Requiring routes after extending path helpers 
    Loader.load_files("app/routes/**/*.rb") do |file| 
    relative_path= relative_from_root_path(file).gsub(/\.rb$/, '').gsub('app/routes/', '') 
    module_name = "GRBTV::Routes::#{relative_path.camelize}" 
    Loader.define_namespaces(module_name) 
    require file 
    use module_name.constantize 
    end 
end 

# Load all initializers after setup is done 
initializers.each do |initializer| 
    GRBTV::Base.register initializer 
end 
+0

格式爲[Apache常用日誌格式](http://httpd.apache.org/docs/1.3/logs.html#common),並在最後加上總時間。看起來您的生產機架堆棧中有多個Rack :: CommonLogger中間件實例(這將解釋增加的時間值)。你如何配置你的應用程序的生產(在你的應用程序文件和你的'config.ru'文件)? – matt 2012-08-12 19:38:55

+0

另外(這可能與你的日誌記錄問題無關 - 但可能是)[你不應該真的繼承'Sinatra :: Application'](https://github.com/sinatra/sinatra/blob/v1.3.2/ LIB /西納特拉/ base.rb#L1573-1579)。使用['Sinatra :: Base'代替](http://www.sinatrarb.com/intro.html#Sinatra::Base%20-%20Middleware,%20Libraries,%20and%20Modular%20Apps)。 – matt 2012-08-12 19:42:45

+0

matt,我剛剛添加了我的config.ru,/config/boot.rb和/config/dependencies.rb的信息。這些是我的主要啓動文件,以及具有所有配置的文件。我真的不知道如何只有一個Rack :: CommonLogger。而且,正如您在鏈接中指出的那樣,我從SinatraApplication繼承了子類,因爲我確實需要所有的幫助器,並且需要其他控制器上的內容。這有道理嗎?謝謝! – MatisMasters 2012-08-13 10:15:39

回答

0

這是一個屈/細小的bug,應該在Sinatra 1.3.3中解決(昨天發佈)。