Как записать что-то в Rails в отдельный файл журнала? - PullRequest
145 голосов
/ 03 декабря 2008

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

Ответы [ 9 ]

171 голосов
/ 03 декабря 2008

Вы можете создать объект 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

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

39 голосов
/ 12 сентября 2012

Обновление

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

MultiLogger.add_logger('post')

и звоните

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

и все готово.

Если вы хотите написать код самостоятельно, см. Ниже:


Более полное решение было бы разместить следующее в вашем каталоге lib/ или config/initializers/.

Преимущество состоит в том, что вы можете настроить форматер так, чтобы он автоматически добавлял метки времени или серьезность к журналам. Это доступно из любой точки Rails и выглядит более аккуратно, если использовать шаблон синглтона.

# Custom Post logger
require 'singleton'
class PostLogger < Logger
  include Singleton

  def initialize
    super(Rails.root.join('log/post_error.log'))
    self.formatter = formatter()
    self
  end

  # Optional, but good for prefixing timestamps automatically
  def formatter
    Proc.new{|severity, time, progname, msg|
      formatted_severity = sprintf("%-5s",severity.to_s)
      formatted_time = time.strftime("%Y-%m-%d %H:%M:%S")
      "[#{formatted_severity} #{formatted_time} #{$$}] #{msg.to_s.strip}\n"
    }
  end

  class << self
    delegate :error, :debug, :fatal, :info, :warn, :add, :log, :to => :instance
  end
end

PostLogger.error('hi')
# [ERROR 2012-09-12 10:40:15] hi
37 голосов
/ 29 февраля 2012

Приличный вариант, который мне подходит, это просто добавить довольно простой класс в вашу папку 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"
7 голосов
/ 25 мая 2017

Определите класс логгера в (скажем) приложении / models / special_log.rb:

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.rb:

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")
4 голосов
/ 08 августа 2014

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

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
2 голосов
/ 01 мая 2009
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  
1 голос
/ 30 апреля 2016
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')
1 голос
/ 29 апреля 2013

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

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

0 голосов
/ 04 июля 2013

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

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

По окончании похлопайте себя по спине. Бревно, ежедневно. Стоит только этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...