Logowanie?
Mam problem z wymyśleniem, jak logować wiadomości z Sinatra. Nie chcę rejestrować żądań, ale raczej niestandardowe wiadomości w niektórych punktach mojej aplikacji. Na przykład, podczas pobierania adresu URL chciałbym zalogować "Fetching #{url}"
.
Oto co chciałbym:
- możliwość określania poziomów logów (ex:
logger.info("Fetching #{url}")
) - w środowiskach programistycznych i testowych komunikaty były zapisywane na konsoli.
- w produkcji, tylko pisać wiadomości pasujące do bieżącego dziennika poziom.
Zgaduję, że można to łatwo zrobić w config.ru
, ale nie jestem w 100% pewien, które ustawienie chcę włączyć, i czy muszę ręcznie utworzyć obiekt Logger
samemu (a ponadto, której klasy Logger
użyć: Logger
, Rack::Logger
, lub Rack::CommonLogger
).
(wiem, że są podobne pytania na StackOverflow, ale żadne nie wydaje się odpowiadać bezpośrednio na moje pytanie. Jeśli możesz wskazać mi istniejące pytanie, zaznaczę to jako DUPLIKAT).
4 answers
Sinatra 1.3 będzie wysyłana z takim obiektem logger, dokładnie nadającym się do użytku jak powyżej. Możesz użyć edge Sinatra, jak opisano w " The Bleeding Edge ". Chyba niedługo wydamy 1.3.
Aby użyć go z Sinatra 1.2, zrób coś takiego:
require 'sinatra'
use Rack::Logger
helpers do
def logger
request.logger
end
end
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-15 16:14:22
Ja osobiście loguję się 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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-13 20:17:37
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 bloki configure
i before
bezpośrednio w MySinatraApp, ale to, co lubię w tym podejściu, to to, że jest bardzo czyste-cała konfiguracja logowania jest całkowicie abstrakcyjna z głównej klasy aplikacji.
Jest również bardzo łatwo zauważyć, gdzie można go zmienić. Na przykład SO zapytał o to, aby logować do konsoli w rozwoju. To dość oczywiste, że wszystko, co musisz zrobić jest trochę logiki if-then w metodzie log_file
.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-15 16:10:57
Jeśli używasz czegoś takiego jak Unicorn logging lub inne oprogramowanie pośredniczące, które ogona strumieni IO, możesz łatwo skonfigurować logger na 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 przechwytywać wiadomości w zakresie aplikacji, a nie tylko mieć dostęp do loggera jako pomocnika żądania
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-15 15:56:27