Вход в Синатру? - PullRequest
       22

Вход в Синатру?

53 голосов
/ 13 мая 2011

У меня проблемы с выяснением того, как регистрировать сообщения в Синатре.Я не собираюсь регистрировать запросы, а настраиваю сообщения в определенные моменты своего приложения.Например, при получении URL-адреса я хотел бы записать в журнал "Fetching #{url}".

Вот что я хотел бы:

  • Возможность указать уровни журнала (например: logger.info("Fetching #{url}"))
  • В средах разработки и тестирования сообщения будут записываться на консоль.
  • В производстве только записывать сообщения, соответствующие текущему уровню журнала.

Я предполагаю, что это легко сделать в config.ru, но я не уверен на 100%, какую настройку я хочу включить, и если мне придется самостоятельно создавать объект Logger (и, более того, какой класс Logger использовать: Logger, Rack::Logger или Rack::CommonLogger).

(я знаю, что есть аналогичные вопросы о StackOverflow, но, похоже, ни один из них не дает прямого ответа на мой вопрос. Если вы можете указать мне насуществующий вопрос, я отмечу его как дубликат).

Ответы [ 4 ]

46 голосов
/ 13 мая 2011

Sinatra 1.3 будет поставляться с таким объектом регистрации, который можно будет использовать, как указано выше.Вы можете использовать край Синатры, как описано в « The Bleeding Edge ».Полагаю, скоро мы выпустим 1.3.

Чтобы использовать ее с Sinatra 1.2, сделайте что-то вроде этого:

require 'sinatra'
use Rack::Logger

helpers do
  def logger
    request.logger
  end
end
16 голосов
/ 14 мая 2011

Я лично захожу в Синатру через:

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
7 голосов
/ 15 марта 2016

Если вы используете что-то вроде единорога для ведения журналов или другого промежуточного ПО, которое пересекает потоки ввода-вывода, вы можете легко настроить регистратор на 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

это позволяет вам перехватывать сообщения в области приложения, а не просто иметь доступ к регистратору как помощнику запроса

3 голосов
/ 15 августа 2014

Вот еще одно решение:

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.

...