Подтвердить что ты не робот

Можно ли настроить стандартный рубиновый журнал на сброс после каждого сообщения?

Возможно ли для стандартного рубинового регистратора (т.е. ::Logger) для автоматической очистки после каждой записи?

Обновление: Я устанавливаю настраиваемый форматор журнала, согласно Как получить отметки времени в рубине на журналах rails a > :

class Foo
  def initialize(params = {})
    @logger = Logger.new $stdout
    @logger.formatter = LogFormatter.new
    @logger.level = params.include?(:log) ? params[:log] : Logger::INFO
    # ...
  end

  class LogFormatter < Logger::Formatter
    def call(severity, time, progname, message)
      timestamp = time.iso8601
      log_msg = "#{timestamp}#{" [#{severity}]" if %w{ERROR WARN}.include? severity} "
      if message.is_a? Exception
        log_msg += "#{message.message}"
        log_msg += ": #{message.backtrace.join "\n#{timestamp}  "}" unless message.backtrace.blank?
      else
        log_msg += message
      end

      "#{log_msg}\n"
    end
  end
end

Я попытался использовать предложение idlefingers следующим образом:

  def initialize(params = {})
    Rails.logger.auto_flushing = 1
    @logger = Logger.new $stdout
    @logger.formatter = LogFormatter.new
    @logger.level = params.include?(:log) ? params[:log] : Logger::INFO
  end

Но не кубики. Для меня также не работает @logger.auto_flushing = 1. Что я делаю неправильно?

Обновление: Оказывается, что ActiveSupport ::Logger просто обертывает стандартный Ruby ::Logger. Так что в конце концов мой вопрос о Ruby, а не Rails.

4b9b3361

Ответ 1

Оказывается, это просто вопрос включения атрибута sync для базового объекта IO:

  def initialize(params = {})
    $stdout.sync = true unless RAILS_ENV == 'production'
    @logger = Logger.new $stdout
    @logger.formatter = LogFormatter.new
    @logger.level = params.include?(:log) ? params[:log] : Logger::INFO
  end

Ответ 2

Установите ActiveSupport:: BufferedLogger.auto_flushing в вашей среде:

Rails.logger.auto_flushing = 1

Это должно сделать его сброшенным после каждого сообщения.