[Ruby-On-Rails] 独立したログファイルでRailsに何かを記録するには?


Answers

更新

私は以下の解決策に基づいて、 multi_loggerというmulti_logger宝石を作りました。 イニシャライザでこれを行うだけです:

MultiLogger.add_logger('post')

呼び出し

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

あなたは終わりました。

自分でコードを作成する場合は、以下を参照してください。

より完全な解決策はlib/ or 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
Question

レールでは、いくつかの情報を標準のdevelopment.logやproduction.logではなく、別のログファイルに記録します。 私はモデルクラスからこのロギングを行いたいと思っています。




ここに私のカスタムロガーがあります:

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



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')



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  



Links