In Rails標準のdevelopment.logまたはproduction.logではなく、別のログファイルに情報を記録したい。モデルクラスからこのログを記録したい。
任意のモデル内から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 と呼ばれる、以下のソリューションに基づいてgemを作成しました。イニシャライザでこれを行うだけです:
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
私のために働く適切なオプションは、_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"
_
(たとえば)app/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")
カスタムロガーは次のとおりです。
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 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 Rubyプログラムで使用するために作成された。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 の非常に短い指示に従って、ノイズのフィルタリング、アラートの取得、きめ細かい高レベルの方法での出力の選択を開始します。
完了したら、背中を叩いてください。ログローリング、毎日。それだけの価値があります。