Se connecter à Sinatra?

J’ai du mal à comprendre comment enregistrer les messages avec Sinatra. Je ne cherche pas à consigner les demandes, mais plutôt des messages personnalisés à certains points de mon application. Par exemple, lorsque je récupère une URL, je voudrais enregistrer "Fetching #{url}" .

Voici ce que j’aimerais:

  • La possibilité de spécifier les niveaux de journalisation (ex: logger.info("Fetching #{url}") )
  • Dans les environnements de développement et de test, les messages seraient écrits sur la console.
  • En production, ne notez que les messages correspondant au niveau de journalisation actuel.

Je suppose que cela peut facilement être fait dans config.ru , mais je ne suis pas sûr à 100% du paramètre que je veux activer, et si je dois créer manuellement un object Logger moi-même (et en outre, quelle classe de Logger utiliser) : Logger , Rack::Logger ou Rack::CommonLogger .

(Je sais qu’il y a des questions similaires sur StackOverflow, mais aucune ne semble répondre directement à ma question. Si vous pouvez me diriger vers une question existante, je vais marquer celle-ci en double).

Sinatra 1.3 sera livré avec un tel object enregistreur, utilisable exactement comme ci-dessus. Vous pouvez utiliser l’arête Sinatra comme décrit dans ” The Bleeding Edge “. Je ne pense pas que ce sera aussi long avant la sortie de la version 1.3.

Pour l’utiliser avec Sinatra 1.2, faites ceci:

 require 'sinatra' use Rack::Logger helpers do def logger request.logger end end 

Je me connecte personnellement à Sinatra via:

 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 

Voici une autre solution:

 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 

Bien sûr, vous pouvez le faire sans ActiveSupport :: Concern en plaçant les blocs configure et before directement dans MySinatraApp, mais ce que j'aime de cette approche, c'est qu'elle est très propre - toute configuration de journalisation est totalement abstraite.

Il est également très facile de repérer où vous pouvez le changer. Par exemple, le responsable de la sécurité a demandé à ce qu’il soit connecté à la console lors du développement. Il est assez évident que tout ce que vous avez à faire est une petite logique de la méthode log_file .

Si vous utilisez quelque chose comme la journalisation de licorne ou un autre middleware qui déstabilise les stream IO, vous pouvez facilement configurer un enregistreur sur STDOUT ou 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 

cela vous permet d’intercepter les messages au niveau de l’application, plutôt que d’avoir simplement access à l’enregistreur en tant qu’assistant de requête