Logowanie w Sinatrze? - rubin, logowanie, sinatra, stojak

Mam problem z ustaleniem sposobu logowaniawiadomości z Sinatrą. Nie chcę rejestrować próśb, ale raczej niestandardowe wiadomości w niektórych punktach mojej aplikacji, na przykład podczas pobierania adresu URL chcę się logować "Fetching #{url}".

Oto co lubię:

  • Możliwość określania poziomów dziennika (np. logger.info("Fetching #{url}"))
  • W środowiskach programistycznych i testowych wiadomości były zapisywane na konsoli.
  • W produkcji zapisuj tylko komunikaty odpowiadające bieżącemu poziomowi dziennika.

Zgaduję, że to łatwo można zrobić config.ru, ale nie jestem w 100% pewien, które ustawienie chcę włączyć, i jeśli muszę ręcznie utworzyć Logger obiekt siebie (a ponadto, która klasa Logger używać: Logger, Rack::Logger, lub Rack::CommonLogger).

(Wiem, że podobne pytania dotyczą StackOverflow, ale żaden nie odpowiada bezpośrednio na moje pytanie: jeśli możesz wskazać mi istniejące pytanie, zaznaczę to jako duplikat).

Odpowiedzi:

41 za odpowiedź nr 1

Sinatra 1.3 będzie dostarczana z takim obiektem loggera, dokładnie użytym jak wyżej. Możesz użyć krawędzi Sinatra zgodnie z opisem w "The Bleeding Edge"Nie będzie tak długo, dopóki nie wydamy 1.3, jak sądzę.

Aby użyć go z Sinatra 1.2, wykonaj następujące czynności:

require "sinatra"
use Rack::Logger

helpers do
def logger
request.logger
end
end

16 dla odpowiedzi nr 2

Osobiście loguję się w Sinatrze przez:

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 dla odpowiedzi nr 3

Oto inne rozwiązanie:

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

Oczywiście, możesz to zrobić bez ActiveSupport :: Concern umieszczając configure i before blokuje się prosto do aplikacji Sinatra, ale to, co podoba mi się w tym podejściu, to to, że jest bardzo czysty - cała konfiguracja logowania jest całkowicie wyodrębniona z głównej klasy aplikacji.

Łatwo też zauważyć, gdzie możesz się zmienićto. Na przykład SO zapytał o to, aby logować się do konsoli podczas programowania. To dość oczywiste, że wszystko, co musisz zrobić, to trochę logiki if-then w log_file metoda.


2 dla odpowiedzi № 4

Jeśli używasz czegoś takiego jednorożec logowanie lub inne oprogramowanie pośredniczące, które pobiera strumienie IO, możesz z łatwością skonfigurować rejestrator do STDOUT lub 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

pozwala to na przechwytywanie wiadomości w zakresie aplikacji, a nie tylko na dostęp do programu rejestrującego jako pomocnika żądania


Menu