Влизане в Синатра? - рубин, дърводобив, синатра, шкаф

Имам проблем да разбера как да се регистрирамсъобщения със Синатра. Не търсим заявки за регистрация, а по-скоро персонализирани съобщения в определени моменти в приложението си. Например при извличането на URL адрес бих искал да се логна "Fetching #{url}",

Ето какво искам:

  • Способността да се определят нивата на регистрационните файлове (напр. logger.info("Fetching #{url}"))
  • В средите за разработка и изпитване съобщенията ще бъдат записани в конзолата.
  • По време на производството само напишете съобщения, съответстващи на текущото ниво на лога.

Предполагам, че това лесно може да се направи config.ru, но аз не съм 100% сигурен коя настройка искам да разреша, и ако трябва ръчно да създам a Logger аз се противопоставям (и освен това, кой клас на Logger да използвам: Logger, Rack::Logger, или Rack::CommonLogger).

(Знам, че има сходни въпроси за StackOverflow, но никой от тях не отговаря директно на въпроса ми. Ако можете да ме насочите към съществуващ въпрос, ще го отбележа като дубликат).

Отговори:

41 за отговор № 1

Sinatra 1.3 ще се доставя с такъв обект на дърводобива, точно използваем, както по-горе. Можете да използвате ръба Синатра, както е описано в "Кървенето на ръба"Не е толкова дълго, докато не пуснем 1.3, предполагам.

За да го използвате със Sinatra 1.2, направете нещо подобно:

require "sinatra"
use Rack::Logger

helpers do
def logger
request.logger
end
end

16 за отговор № 2

Лично влизам в Синатра чрез:

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 за отговор № 3

Ето друго решение:

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

Разбира се, можете да го направите без ActiveSupport :: Concern чрез поставяне на configure и before блокира направо в приложението "Синатра", но това, което ми харесва в този подход, е, че е много чисто - цялата конфигурация за регистриране е изцяло извлечена от главния клас приложения.

Също така е много лесно да забележите къде можете да променитето. Например, НО поиска да се регистрира в конзола за развитие. Тук е доста очевидно, че всичко, което трябва да направите, е малко, ако тогава логиката в log_file метод.


2 за отговор № 4

Ако използвате нещо подобно еднорог логване или друг мидълуер, който изолира потоци от IO, можете лесно да настроите дърводелец на STDOUT или 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

това ви позволява да прихващате съобщенията в обхвата на приложението, вместо просто да имате достъп до регистратора като помощник за заявки


Свързани въпроси
Най - известен