Iniciando sesión en Sinatra? - ruby, logging, sinatra, rack

Estoy teniendo problemas para averiguar cómo iniciar sesiónmensajes con Sinatra. No estoy buscando registrar solicitudes, sino mensajes personalizados en ciertos puntos de mi aplicación. Por ejemplo, cuando obtengo una URL, me gustaría iniciar sesión. "Fetching #{url}".

Esto es lo que me gustaría:

  • La capacidad de especificar niveles de registro (por ejemplo: logger.info("Fetching #{url}"))
  • En entornos de desarrollo y prueba, los mensajes se escribirían en la consola.
  • En producción, solo escriba los mensajes que coincidan con el nivel de registro actual.

Supongo que esto se puede hacer fácilmente en config.ru, pero no estoy 100% seguro de qué configuración quiero habilitar, y si tengo que crear manualmente un Logger me opongo (y además, qué clase de Logger usar: Logger, Rack::Logger, o Rack::CommonLogger)

(Sé que hay preguntas similares en StackOverflow, pero ninguna parece responder directamente a mi pregunta. Si puede dirigirme a una pregunta existente, la marcaré como un duplicado).

Respuestas

41 para la respuesta № 1

Sinatra 1.3 se enviará con un objeto registrador, exactamente utilizable como el anterior. Puedes usar el borde Sinatra como se describe en "El borde sangrante"No pasará tanto tiempo hasta que lanzamos 1.3, supongo".

Para usarlo con Sinatra 1.2, haz algo como esto:

require "sinatra"
use Rack::Logger

helpers do
def logger
request.logger
end
end

16 para la respuesta № 2

Personalmente, inicio sesión en Sinatra a través de:

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 para la respuesta № 3

Aquí hay otra solución:

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

Por supuesto, puede hacerlo sin ActiveSupport :: Concern poniendo el configure y before bloquea directamente en una aplicación de Sinatra, pero lo que me gusta de este enfoque es que está muy limpio: toda la configuración de registro está totalmente abstraída de la clase de aplicaciones principal.

También es muy fácil detectar dónde puedes cambiareso. Por ejemplo, el SO preguntó acerca de hacer que inicie sesión para consolar en el desarrollo. Aquí es bastante obvio que todo lo que necesitas hacer es un poco de lógica si-entonces en el log_file método.


2 para la respuesta № 4

Si estás usando algo como unicornio logging u otro middleware que intercepta flujos de E / S, puede configurar fácilmente un registrador para STDOUT o 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

esto le permite interceptar mensajes en el alcance de la aplicación, en lugar de simplemente tener acceso al registrador como ayudante de solicitud


Menú