loginSinatra?
我无法弄清楚如何使用Sinatralogging信息。 我不想logging请求,而是在我的应用程序的某些点上的自定义消息。 例如,在获取URL时,我想logging"Fetching #{url}"
。
这是我想要的:
- 指定日志级别的能力(例如:
logger.info("Fetching #{url}")
) - 在开发和testing环境中,消息将写入控制台。
- 在生产中,只写出符合当前日志级别的消息。
我猜这可以很容易地在config.ru
完成,但我不是100%确定我想启用哪种设置,如果我必须自己手动创build一个Logger
对象(此外还有,要使用哪种types的Logger
: Logger
, Rack::Logger
或Rack::CommonLogger
)。
(我知道在StackOverflow上有类似的问题,但是没有人能够直接回答我的问题。如果你能指出我现在的问题,我会把它标记为重复的)。
Sinatra 1.3将带有这样一个logging器对象,与上面一样可以使用。 您可以按照“ 出血边缘 ”中所述使用边缘Sinatra。 直到我们释放1.3,不会这么长时间,我想。
要在Sinatra 1.2中使用它,可以这样做:
require 'sinatra' use Rack::Logger helpers do def logger request.logger end end
我亲自loginSinatra通过:
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
这是另一个解决scheme:
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
块直接放到MySinatraApp中,但是我喜欢这种方法,它非常干净 – 所有的日志configuration都完全从主应用程序类中抽象出来。
find可以改变的地方也很容易。 例如,SO问到了如何在开发中login到控制台。 在这里很明显,你所要做的只是在log_file
方法中使用if-then逻辑。
如果您正在使用独angular兽日志logging或其他中间件尾巴IOstream,你可以很容易地build立一个logging器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
这使您可以在应用程序范围内拦截消息,而不仅仅是作为请求帮助程序访问logging器