10

Sinatra のロガーはリクエスト ハンドラー内でのみ使用できるようです ( https://github.com/sinatra/sinatra#loggingを参照)。針?Sinatra ロガーは他の手段で入手できますか?

4

2 に答える 2

10

ドキュメントにはスコープの例がいくつか示されていますが、ヘルパー ブロックには Application スコープがあるためlogger、ブロックで定義されたメソッド内のヘルパーを見ることができます。helperconfigure 内では使用できませんが、私がよく行うのは、ラックアップ ファイル内で定数またはクラス インスタンス変数として独自のログを設定することであり、configure 内 (およびその他の場所) で使用できます。単一のアプリケーションの例として:

require 'sinatra'
require 'logger'

configure do
  set :logging, nil
  logger = Logger.new STDOUT
  logger.level = Logger::INFO
  logger.datetime_format = '%a %d-%m-%Y %H%M '
  set :logger, logger
end

helpers do
  def check
    settings.logger.info "I'm inside a helper"
    # if you were using Sinatra's logger, you could just call
    # logger.info "I'm inside a helper"
    # and it would work, but only if you've not done the stuff above
    # in the configure block
  end
end

get "/" do
  check # this would work for the way above, or with the Sinatra logger
  "Hello, World!"
end

get "/another" do
  settings.logger.info "Using the settings helper this time" # this only works
  # when you've defined your own logger
  "Hello again"
end

より良い「グローバル」としてのクラス インスタンス変数の例:

class MyLogger
  def self.logger
    if @_logger.nil?
      @_logger = Logger.new STDOUT
      @_logger.level = Logger::INFO
      @_logger.datetime_format = '%a %d-%m-%Y %H%M '
    end
    @_logger
  end
end

そして、必要な場所で使用します:

configure do
  set :logging, nil
  logger = MyLogger.logger
  set :logger, logger
end

またはクラスで:

class AnotherClass

  def some_method
    MyLogger.logger.warn "I'm in some method"
  end

Sinatra には (1.3 以降) logging のヘルパーも付属しています。STDOUT にログを記録するためのレシピと、こちらも便利なファイルがあります。

于 2013-01-22T17:14:47.187 に答える