2013-06-03 5 views
2

Я использую sinatra/assetpack и thin. Как отключить ведение журнала запросов актива, например quiet assets для Rails?Как отключить ведение журнала запросов активов с помощью тонкой и синатрой?

+0

Нет такой функции конкретно в 'Синатра/assetpack'. Вы можете полностью отключить ведение журнала в своем приложении Sinatra, но я думаю, это не то, что вы хотите. – Kashyap

+0

@ Kashyap любая идея, где/как я мог бы перехватывать вызовы протоколирования и пытаться угадать, если это запрос актива? – AJcodez

+0

Sinatra использует Rack :: CommonLogger как интерфейс для ведения журнала. Существует класс внутри Base.rb с именем 'Sinatra :: ComminLogger', который просто вызывает« Rack :: CommonLogger », который регистрирует данные для каждого ответа. – Kashyap

ответ

0

Got активы выключил с этим:

module Sinatra 
    module QuietLogger 

    @extensions = %w(png gif jpg jpeg woff tff svg eot css js coffee scss) 

    class << self 
     attr_accessor :extensions 

     def registered(app) 
     ::Rack::CommonLogger.class_eval <<-PATCH 
      alias call_and_log call 

      def call(env) 
      ext = env['REQUEST_PATH'].split('.').last 
      if #{extensions.inspect}.include? ext 
       @app.call(env) 
      else 
       call_and_log(env) 
      end 
      end 
     PATCH 
     end 
    end 

    end 
end 

А потом просто зарегистрировать его в приложении:

configure :development 
    register QuietLogger 
end 
+0

Ты избил меня до этого :) – Kashyap

+0

твои взгляды менее хаки, спасибо! – AJcodez

+0

На самом деле, ваше решение может быть реорганизовано немного. Проверьте исходные коды проекта [Sinatra-Contrib] (https://github.com/sinatra/sinatra-contrib/tree/master/lib/sinatra). Вы можете отправить PR с рефакторизованным решением, если хотите: – Kashyap

0

регистратор Синатры просто подкласс Rack::CommonLogger. Что еще более важно, часть регистратора является промежуточным программным обеспечением, которое подключается к приложению Sinatra. Если ваши иметь свою собственную реализацию регистратора на основе модуля Rack::CommonLogger (или ваш собственный промежуточном слой), которые могут быть добавлены к Синатру, как так:

use MyOwnLogger 

Мы подкласс Rack::CommonLogger и модифицировать call метод для обеспечения протоколирование занимает места только если тело является данными, а не активом.

module Sinatra # This need not be used. But namespacing is a good thing. 

    class SilentLogger < Rack::CommonLogger 

    def call(env) 
     status, header, body = @app.call(env) 
     began_at = Time.now 
     header = Rack::Utils::HeaderHash.new(header) # converts the headers into a neat Hash 

     # we will check if body is an asset and will log only if it is not an asset 

     unless is_asset?(body) 
     body = BodyProxy.new(body) { log(env, status, header, began_at) } 
     end 

     [status, header, body] 

    end 

    private 

    def is_asset?(body) 
     # If it just plain text, it won't respond to #path method 
     return false unless body.respond_to?(:path) 
     ext = Pathname.new(body.path).extname 
     ext =~ /\.png|\.jp(g|eg)|\.js/ ? true : false 
    end 

    end 
end 

И затем, в приложении:

class App < Sinatra::Base 
    use Sinatra::SilentLogger 

    end 
+0

На самом деле я не думаю, что это работает, потому что промежуточное программное обеспечение продолжает передавать «env» через стек приложений и старый синатровый регистратор все еще используются! – AJcodez

+0

Я также попробовал его скопировать/вставить и с настройкой 'env ['sinatra.commonlogger']' безрезультатно – AJcodez

+1

Да. Выяснил причину этого. 'sinatra-assetpack' отправляет CSS без создания файла, поэтому логика' path' не работает. Виноват. – Kashyap