Как зарегистрировать что-то в Rails в независимом файле журнала?



в rails я хочу записать некоторую информацию в другой файл журнала, а не в стандартную разработку.журнал или продукция.бревно. Я хочу сделать это ведение журнала из класса модели.

495   9  

9 ответов:

вы можете создать объект Logger самостоятельно из любой модели. Просто передайте имя файла конструктору и используйте объект как обычные Rails logger:

class User < ActiveRecord::Base
  def my_logger
    @@my_logger ||= Logger.new("#{Rails.root}/log/my.log")
  end

  def before_save
    my_logger.info("Creating user with name #{self.name}")
  end
end

здесь я использовал атрибут класса для запоминания регистратора. Таким образом, он не будет создан для каждого объекта пользователя, который будет создан, но вы не обязаны это делать. Помните также, что вы можете ввести my_logger метод непосредственно в ActiveRecord::Base класс (или в какой-то свой суперкласс, если вы этого не сделаете как обезьяна патч слишком много), чтобы разделить код между моделями вашего приложения.

обновление

Я сделал драгоценный камень на основе решения ниже, называется multi_logger. Просто сделайте это в инициализаторе:

MultiLogger.add_logger('post')

и звонок

Rails.logger.post.error('hi')
# or call logger.post.error('hi') if it is accessible.

и вы сделали.

если вы хотите закодировать его самостоятельно, см. ниже:


более полное решение было бы разместить следующее в вашем lib/ или

достойный вариант, который работает для меня, чтобы просто добавить довольно простой класс app/models папку, например app/models/my_log.rb

class MyLog
  def self.debug(message=nil)
    @my_log ||= Logger.new("#{Rails.root}/log/my.log")
    @my_log.debug(message) unless message.nil?
  end
end

затем в вашем контроллере или действительно почти везде, где вы можете ссылаться на класс модели из вашего приложения rails, т. е. в любом месте, где вы могли бы сделать Post.create(:title => "Hello world", :contents => "Lorum ipsum"); или что-то подобное вы можете войти в свой пользовательский файл, как это

MyLog.debug "Hello world"

вот мой пользовательский регистратор:

class DebugLog
  def self.debug(message=nil)
    return unless Rails.env.development? and message.present?
    @logger ||= Logger.new(File.join(Rails.root, 'log', 'debug.log'))
    @logger.debug(message) 
  end
end

определите класс регистратора в (скажем) app/models/special_log.РБ:

class SpecialLog
  LogFile = Rails.root.join('log', 'special.log')
  class << self
    cattr_accessor :logger
    delegate :debug, :info, :warn, :error, :fatal, :to => :logger
  end
end

инициализировать регистратор в (скажем) config/initializers/special_log.РБ:

SpecialLog.logger = Logger.new(SpecialLog::LogFile)
SpecialLog.logger.level = 'debug' # could be debug, info, warn, error or fatal

В любом месте вашего приложения, вы можете войти с:

SpecialLog.debug("something went wrong")
# or
SpecialLog.info("life is good")
class Article < ActiveRecord::Base  

      LOGFILE = File.join(RAILS_ROOT, '/log/', "article_#{RAILS_ENV}.log")  

      def validate  
        log "was validated!"  
      end   

      def log(*args)  
       args.size == 1 ? (message = args; severity = :info) : (severity, message = args)  
       Article.logger severity, "Article##{self.id}: #{message}"  
     end  

     def self.logger(severity = nil, message = nil)  
       @article_logger ||= Article.open_log  
       if !severity.nil? && !message.nil? && @article_logger.respond_to?(severity)  
         @article_logger.send severity, "[#{Time.now.to_s(:db)}] [#{severity.to_s.capitalize}] #{message}\n"  
       end  
       message or @article_logger  
     end  

     def self.open_log  
       ActiveSupport::BufferedLogger.new(LOGFILE)  
     end  

   end  

Я бы предложил использовать Log4r gem для пользовательского ведения журнала. Цитируя описание со своей страницы:

Log4r-это всеобъемлющая и гибкая библиотека журналов, написанная на Ruby для использования в рубиновых программах. Оно отличает иерархической внося в журнал системой любого числа уровни, пользовательские имена уровней, наследование регистратора, несколько выходных назначений за событие журнала, трассировка выполнения, пользовательское форматирование, безопасность потока, XML и конфигурации YAML, а больше.

class Post < ActiveRecord::Base
    def initialize(attributes)
        super(attributes)
        @logger = Logger.new("#{Rails.root}/log/post.log")
    end

    def logger
        @logger
    end

    def some_method
        logger.info('Test 1')
    end
end

ps = Post.new
ps.some_method
ps.logger.info('Test 2')
Post.new.logger.info('Test 3')

структура ведения журнала, с его обманчиво простым именем, имеет сложность, которую вы жаждете!

следуйте очень коротким инструкциям logging-rails чтобы начать отфильтровывать шум, получать оповещения и выбирать вывод мелкозернистым и высокоуровневым способом.

похлопать себя по спине, когда вы сделали. Бревно-прокатка, ежедневно. Это того стоит.

Comments

    Ничего не найдено.