139


50

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

9 Answer


167


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`クラス(またはあまりモンキーパッチを適用したくない場合は独自のスーパークラス)に注入することもできます。


37


私にとってうまくいく良いオプションは、 app / models / my_log.rb`のように、かなり普通のクラスをあなたの app / models`フォルダに追加することです。

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"


36


更新

私はhttps://github.com/lulalala/multi_logger[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


4


これが私のカスタムロガーです。

クラスDebugLog def self.debug(message = nil)Rails.env.developmentを除いて返りますか? そしてmessage.present? @logger || = Logger.new(File.join(Rails.root、 'log'、 'debug.log'))@ logger.debug(メッセージ)end end


4


app / models / special_log.rbにロガークラスを定義します。

クラスSpecialLog LogFile = Rails.root.join( 'log'、 'special.log')クラス<< self cattr_accessor:ロガーデリゲート:デバッグ、:情報、:エラー、:エラー、:致命的、:to =>:ロガー終了終わり

config / initializers / special_log.rbでロガーを初期化します。

SpecialLog.logger = Logger.new(SpecialLog :: LogFile)SpecialLog.logger.level = 'debug'#はdebug、info、warn、error、またはfatalになります。

アプリ内のどこにいても、次のものでログインできます。

SpecialLog.debug( "何か問題が発生しました")#またはSpecialLog.info( "人生はいいです")