Вход в Синатру?
Мне сложно понять, как регистрировать сообщения с помощью Sinatra. Я не ищу запросы на журнал, а скорее пользовательские сообщения в определенных точках моего приложения. Например, при выборе URL-адреса я хотел бы зарегистрировать "Fetching #{url}"
.
Вот что мне хотелось бы:
- Возможность указывать уровни журналов (например:
logger.info("Fetching #{url}")
)
- В средах разработки и тестирования сообщения будут записываться в консоль.
- В процессе производства выписывайте только сообщения, соответствующие текущему уровню журнала.
Я предполагаю, что это легко сделать в config.ru
, но я не уверен на 100%, какой параметр я хочу включить, и если мне нужно вручную создать объект Logger
сам (и, кроме того, который класс Logger
для использования: Logger
, Rack::Logger
или Rack::CommonLogger
).
(Я знаю, что есть похожие вопросы в StackOverflow, но никто, кажется, напрямую не отвечает на мой вопрос. Если вы можете указать мне на существующий вопрос, я буду отмечать это как дубликат).
Ответы
Ответ 1
Sinatra 1.3 будет поставляться с таким логгерным объектом, который можно использовать, как указано выше. Вы можете использовать edge Sinatra, как описано в разделе The Bleeding Edge". Не будет так долго, пока мы не выпустим 1.3, я думаю.
Чтобы использовать его с Sinatra 1.2, сделайте следующее:
require 'sinatra'
use Rack::Logger
helpers do
def logger
request.logger
end
end
Ответ 2
Я лично могу войти в систему 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
Ответ 3
Здесь другое решение:
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 спросила о том, чтобы сделать его доступным для консоли в процессе разработки. Здесь довольно очевидно, что все, что вам нужно сделать, это небольшая логика if-then в методе log_file
.
Ответ 4
Если вы используете что-то вроде журнала unicorn или другого промежуточного программного обеспечения, которое обрабатывает потоки ввода-вывода, вы можете легко настроить регистратор на 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
это позволяет перехватывать сообщения в области приложения, а не просто иметь доступ к журналу в качестве помощника запроса