Sinatraにログインしますか? - ルビー、伐採、シナトラ、ラック

ログの記録方法を理解するのに困っていますシナトラとのメッセージ。私はリクエストを記録するのではなく、アプリの特定のポイントでカスタムメッセージを探したいと思っています。たとえば、URLを取得してログに記録したいとき "Fetching #{url}"

ここで私が好きなのは:

  • ログレベルを指定する機能(例: logger.info("Fetching #{url}")
  • 開発環境とテスト環境では、メッセージはコンソールに書き込まれます。
  • プロダクションでは、現在のログレベルに一致するメッセージのみを書き出します。

私はこれを簡単に推測することができます config.ruしかし、私は100%有効にする設定をしていないと思います。手動で作成する必要がある場合は Logger 私自身のオブジェクトです(さらに、どのクラスの Logger 使用する: LoggerRack::Logger、または Rack::CommonLogger)。

(私はStackOverflowについても同様の質問があることを知っていますが、私の質問に直接答えるものはありません。既存の質問に私が指摘できる場合は、これを複製としてマークします)。

回答:

回答№1の41

Sinatra 1.3には、上記のように正確に使用できるロガーオブジェクトが付属します。エッジSinatraを使用するには、出血枝私たちが1.3をリリースするまでそれほど長くはなかったと思います。

Sinatra 1.2で使用するには、次のようにします。

require "sinatra"
use Rack::Logger

helpers do
def logger
request.logger
end
end

回答№2の16

私は個人的にSinatraにログインします:

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 ブロックはA Sinatra Appにまっすぐに入りますが、このアプローチについて私が気に入っているのは、非常にきれいだということです。すべてのロギング設定はメインのアプリケーションクラスから完全に抽象化されています。

あなたが変更できる場所を見つけるのもとても簡単ですそれ。例えば、SOは開発中にコンソールにログを記録するように頼んだ。ここでは、あなたがする必要があることは、 log_file 方法。


答え№4の2

あなたのようなものを使用している場合 ユニコーン ロギングやその他のミドルウェアを使用すると、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

これにより、要求ヘルパーとしてロガーにアクセスするのではなく、アプリケーションスコープでメッセージを傍受することができます


関連する質問
メニュー
最も人気のある