Я использую sinatra/assetpack
и thin
. Как отключить ведение журнала запросов актива, например quiet assets для Rails?Как отключить ведение журнала запросов активов с помощью тонкой и синатрой?
ответ
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
Ты избил меня до этого :) – Kashyap
твои взгляды менее хаки, спасибо! – AJcodez
На самом деле, ваше решение может быть реорганизовано немного. Проверьте исходные коды проекта [Sinatra-Contrib] (https://github.com/sinatra/sinatra-contrib/tree/master/lib/sinatra). Вы можете отправить PR с рефакторизованным решением, если хотите: – Kashyap
регистратор Синатры просто подкласс 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
На самом деле я не думаю, что это работает, потому что промежуточное программное обеспечение продолжает передавать «env» через стек приложений и старый синатровый регистратор все еще используются! – AJcodez
Я также попробовал его скопировать/вставить и с настройкой 'env ['sinatra.commonlogger']' безрезультатно – AJcodez
Да. Выяснил причину этого. 'sinatra-assetpack' отправляет CSS без создания файла, поэтому логика' path' не работает. Виноват. – Kashyap
Нет такой функции конкретно в 'Синатра/assetpack'. Вы можете полностью отключить ведение журнала в своем приложении Sinatra, но я думаю, это не то, что вы хотите. – Kashyap
@ Kashyap любая идея, где/как я мог бы перехватывать вызовы протоколирования и пытаться угадать, если это запрос актива? – AJcodez
Sinatra использует Rack :: CommonLogger как интерфейс для ведения журнала. Существует класс внутри Base.rb с именем 'Sinatra :: ComminLogger', который просто вызывает« Rack :: CommonLogger », который регистрирует данные для каждого ответа. – Kashyap