IT이야기

로그인 시나트라?

cyworld 2021. 10. 28. 19:20
반응형

로그인 시나트라?


Sinatra로 메시지를 기록하는 방법을 알아내는 데 문제가 있습니다. 나는 요청을 기록하려는 것이 아니라 내 앱의 특정 지점에서 사용자 정의 메시지를 찾고 있습니다. 예를 들어 URL을 가져올 때 "Fetching #{url}".

내가 원하는 것은 다음과 같습니다.

  • 로그 수준을 지정하는 기능(예: logger.info("Fetching #{url}"))
  • 개발 및 테스트 환경에서 메시지는 콘솔에 기록됩니다.
  • 프로덕션에서는 현재 로그 수준과 일치하는 메시지만 작성합니다.

나는이 쉽게 수행 할 수 있습니다 같은데요 config.ru,하지만 내가 사용하려는 설정이 확실 100 % 아니에요, 나는 수동으로 작성해야하는 경우 Logger개체 자신 (또한 및 클래스 Logger사용에을 : Logger, Rack::Logger또는 Rack::CommonLogger) .

(StackOverflow에 비슷한 질문이 있다는 것을 알고 있지만 내 질문에 직접 대답하는 질문은 없는 것 같습니다. 기존 질문을 알려주시면 이 질문을 중복으로 표시하겠습니다.)


Sinatra 1.3은 위와 같이 정확히 사용할 수 있는 로거 개체와 함께 제공됩니다. " The Bleeding Edge "에 설명된 대로 edge Sinatra를 사용할 수 있습니다 . 1.3이 출시될 때까지 그리 오래 걸리지는 않을 것 같습니다.

Sinatra 1.2와 함께 사용하려면 다음과 같이 하십시오.

require 'sinatra'
use Rack::Logger

helpers do
  def logger
    request.logger
  end
end

저는 개인적으로 다음을 통해 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

유니콘 로깅 또는 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

이를 통해 요청 도우미로 로거에 액세스하는 것보다 애플리케이션 범위에서 메시지를 가로챌 수 있습니다.


다음은 또 다른 솔루션입니다.

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

Of course, you can do it without ActiveSupport::Concern by putting the configure and before blocks straight into MySinatraApp, but what I like about this approach is that it's very clean--all logging configuration is totally abstracted out of the main app class.

It's also very easy to spot where you can change it. For instance, the SO asked about making it log to console in development. It's pretty obvious here that all you need to do is a little if-then logic in the log_file method.

ReferenceURL : https://stackoverflow.com/questions/5995854/logging-in-sinatra

반응형