सिनात्रा में लॉग इन करना? - रूबी, लॉगिंग, सिनात्रा, रैक

मुझे लॉग इन करने का तरीका पता लगाने में परेशानी हो रही हैसिनात्रा के साथ संदेश। मैं अनुरोधों को लॉग इन नहीं कर रहा हूं, बल्कि मेरे ऐप में कुछ बिंदुओं पर कस्टम संदेश देख रहा हूं। उदाहरण के लिए, एक यूआरएल लाने पर मैं लॉग करना चाहता हूं "Fetching #{url}"

यहां "मैं क्या पसंद करता हूं:

  • लॉग स्तर निर्दिष्ट करने की क्षमता (उदा: logger.info("Fetching #{url}"))
  • विकास और परीक्षण वातावरण में, संदेश कंसोल पर लिखे जाएंगे।
  • उत्पादन में, केवल वर्तमान लॉग स्तर से मेल खाने वाले संदेशों को लिखें।

मैं अनुमान लगा रहा हूं कि यह आसानी से किया जा सकता है config.ru, लेकिन मैं 100% निश्चित नहीं हूं कि कौन सी सेटिंग मैं सक्षम करना चाहता हूं, और यदि मुझे मैन्युअल रूप से बनाना है Logger खुद को ऑब्जेक्ट करें (और इसके अलावा, किस वर्ग का Logger उपयोग करने के लिए: Logger, Rack::Logger, या Rack::CommonLogger)।

(मुझे पता है कि स्टैक ओवरफ्लो पर समान प्रश्न हैं, लेकिन कोई भी मेरे प्रश्न का सीधे जवाब नहीं दे रहा है। अगर आप मुझे किसी मौजूदा प्रश्न पर इंगित कर सकते हैं, तो मैं इसे डुप्लिकेट के रूप में चिह्नित करूंगा)।

उत्तर:

उत्तर № 1 के लिए 41

सिनात्रा 1.3 इस तरह के लॉगर ऑब्जेक्ट के साथ जहाज करेगा, जो ऊपर के रूप में बिल्कुल उपयोग योग्य है। आप किनारे सिनात्रा का उपयोग कर सकते हैं जैसा कि "रक्तस्राव एज"जब तक हम 1.3 जारी नहीं करेंगे, मुझे लगता है कि लंबे समय तक नहीं होगा।

सिनात्रा 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

बेशक, आप इसे सक्रिय द्वारा सक्रिय समर्थन :: चिंता के बिना कर सकते हैं configure तथा before सीधे एक सिनात्रा ऐप में ब्लॉक करता है, लेकिन मुझे इस दृष्टिकोण के बारे में क्या पसंद है कि यह बहुत साफ है - सभी लॉगिंग कॉन्फ़िगरेशन मुख्य ऐप क्लास से पूरी तरह से संक्षिप्त है।

यह भी स्थानांतरित करना बहुत आसान है कि आप कहां बदल सकते हैंयह। उदाहरण के लिए, एसओ ने विकास में कंसोल पर लॉग इन करने के बारे में पूछा। यह यहां बहुत स्पष्ट है कि आपको बस इतना करना है कि थोड़ा सा तो तर्क है log_file तरीका।


जवाब के लिए 2 № 4

यदि आप कुछ ऐसा उपयोग कर रहे हैं एक तंगावाला लॉगिंग या अन्य मिडलवेयर जो आईओ स्ट्रीम को पूंछते हैं, आप आसानी से एसटीडीओयूटी या एसटीडीईआरआर में लॉगर सेट कर सकते हैं

# 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

यह अनुरोधकर्ता सहायक के रूप में केवल लॉगजर तक पहुंचने के बजाय, एप्लिकेशन स्कोप पर संदेशों को अवरुद्ध करने की अनुमति देता है


संबंधित सवाल
सबसे लोकप्रिय