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:
logger.info("Fetching #{url}")
) 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