Logowanie?

Mam problem z wymyśleniem, jak logować wiadomości z Sinatra. Nie chcę rejestrować żądań, ale raczej niestandardowe wiadomości w niektórych punktach mojej aplikacji. Na przykład, podczas pobierania adresu URL chciałbym zalogować "Fetching #{url}".

Oto co chciałbym:

  • możliwość określania poziomów logów (ex: logger.info("Fetching #{url}"))
  • w środowiskach programistycznych i testowych komunikaty były zapisywane na konsoli.
  • w produkcji, tylko pisać wiadomości pasujące do bieżącego dziennika poziom.

Zgaduję, że można to łatwo zrobić w config.ru, ale nie jestem w 100% pewien, które ustawienie chcę włączyć, i czy muszę ręcznie utworzyć obiekt Logger samemu (a ponadto, której klasy Logger użyć: Logger, Rack::Logger, lub Rack::CommonLogger).

(wiem, że są podobne pytania na StackOverflow, ale żadne nie wydaje się odpowiadać bezpośrednio na moje pytanie. Jeśli możesz wskazać mi istniejące pytanie, zaznaczę to jako DUPLIKAT).

Author: the Tin Man, 2011-05-13

4 answers

Sinatra 1.3 będzie wysyłana z takim obiektem logger, dokładnie nadającym się do użytku jak powyżej. Możesz użyć edge Sinatra, jak opisano w " The Bleeding Edge ". Chyba niedługo wydamy 1.3.

Aby użyć go z Sinatra 1.2, zrób coś takiego:

require 'sinatra'
use Rack::Logger

helpers do
  def logger
    request.logger
  end
end
 43
Author: Konstantin Haase,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-15 16:14:22

Ja osobiście loguję się przez:

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
 16
Author: Phrogz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-05-13 20:17:37

Oto inne rozwiązanie:

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

Oczywiście możesz to zrobić bez Activesupport:: Concern, umieszczając bloki configure i before bezpośrednio w MySinatraApp, ale to, co lubię w tym podejściu, to to, że jest bardzo czyste-cała konfiguracja logowania jest całkowicie abstrakcyjna z głównej klasy aplikacji.

Jest również bardzo łatwo zauważyć, gdzie można go zmienić. Na przykład SO zapytał o to, aby logować do konsoli w rozwoju. To dość oczywiste, że wszystko, co musisz zrobić jest trochę logiki if-then w metodzie log_file.

 3
Author: Isaac Betesh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-08-15 16:10:57

Jeśli używasz czegoś takiego jak Unicorn logging lub inne oprogramowanie pośredniczące, które ogona strumieni IO, możesz łatwo skonfigurować logger na STDOUT lub 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

Pozwala to przechwytywać wiadomości w zakresie aplikacji, a nie tylko mieć dostęp do loggera jako pomocnika żądania

 3
Author: lfender6445,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-15 15:56:27