Вход в систему Синатры?
у меня возникли проблемы с выяснением, как регистрировать сообщения с Синатрой. Я не хочу регистрировать запросы, а скорее пользовательские сообщения в определенных точках моего приложения. Например, при получении URL-адреса я хотел бы войти "Fetching #{url}".
вот что я хочу:
- возможность указывать уровни журнала (например:
logger.info("Fetching #{url}")) - в средах разработки и тестирования, сообщения будут выведены на консоль.
- в производстве, только выписать сообщения, соответствующие текущему уровню журнала.
Я предполагаю, что это можно легко сделать в config.ru, но я не уверен на 100%, какой параметр я хочу включить, и если мне нужно вручную создать Logger сам объект (и, кроме того, какой класс Logger использование: Logger,Rack::Logger или Rack::CommonLogger).
(Я знаю, что есть подобные вопросы на StackOverflow, но ни один, кажется, напрямую не отвечает на мой вопрос. Если вы можете указать мне на существующий вопрос, я отмечу этот как дубликат).
4 ответов:
Sinatra 1.3 будет поставляться с таким объектом регистратора, точно используемым, как указано выше. Вы можете использовать edge Sinatra, как описано в разделе"Крае". Думаю, не так уж и долго, пока мы не выпустим 1.3.
чтобы использовать его с Sinatra 1.2, сделайте что-то вроде этого:
require 'sinatra' use Rack::Logger helpers do def logger request.logger end end
Я лично войти в Sinatra через:
require 'sinatra' require 'sequel' require 'logger' class MyApp < Sinatra::Application configure :production do set :haml, { :ugly=>true } set :clean_trace, true Dir.mkdir('logs') unless File.exist?('logs') $logger = Logger.new('logs/common.log','weekly') $logger.level = Logger::WARN # Spit stdout and stderr to a file during production # in case something goes wrong $stdout.reopen("logs/output.log", "w") $stdout.sync = true $stderr.reopen($stdout) end configure :development do $logger = Logger.new(STDOUT) end end # Log all DB commands that take more than 0.2s DB = Sequel.postgres 'mydb', user:'dbuser', password:'dbpass', host:'localhost' DB << "SET CLIENT_ENCODING TO 'UTF8';" DB.loggers << $logger if $logger DB.log_warn_duration = 0.2
вот еще одно решение:
module MySinatraAppLogger extend ActiveSupport::Concern class << self def logger_instance @logger_instance ||= ::Logger.new(log_file).tap do |logger| ::Logger.class_eval { alias :write :'<<' } logger.level = ::Logger::INFO end end def log_file @log_file ||= File.new("#{MySinatraApp.settings.root}/log/#{MySinatraApp.settings.environment}.log", 'a+').tap do |log_file| log_file.sync = true end end end included do configure do enable :logging use Rack::CommonLogger, MySinatraAppLogger.logger_instance end before { env["rack.errors"] = MySinatraAppLogger.log_file } end def logger MySinatraAppLogger.logger_instance end end class MySinatraApp < Sinatra::Base include MySinatraAppLogger get '/' do logger.info params.inspect end endконечно, вы можете сделать это без ActiveSupport:: Concern, поставив
configureиbeforeблоки прямо в MySinatraApp, но что мне нравится в этом подходе, так это то, что он очень чистый-вся конфигурация ведения журнала полностью абстрагирована от основного класса приложения.это также очень легко определить, где вы можете изменить его. Например, SO спросил о том, чтобы сделать его журналом для консоли в разработке. Здесь хорошо видно что все, что вам нужно сделать, это немного, если-то логика в
log_fileметод.
Если вы используете что-то вроде единорог logging или другое промежуточное программное обеспечение, которое отслеживает потоки ввода-вывода, вы можете легко настроить регистратор на STDOUT или STDERR
# unicorn.rb stderr_path "#{app_root}/shared/log/unicorn.stderr.log" stdout_path "#{app_root}/shared/log/unicorn.stdout.log" # sinatra_app.rb set :logger, Logger.new(STDOUT) # STDOUT & STDERR is captured by unicorn logger.info('some info') # also accessible as App.settings.loggerэто позволяет перехватывать сообщения в области приложения, а не просто иметь доступ к logger в качестве помощника запроса
Comments