在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
在这里,我使用class属性来记忆记录器.这样就不会为每个创建的User对象创建它,但是您不需要这样做.还要记住,您可以将my_logger
方法直接注入到ActiveRecord::Base
类中(或者如果您不喜欢使用太多补丁,可以将其注入到自己的某些超类中)以在应用程序的模型之间共享代码.
更新
我根据下面的解决方案创建了一个gem,名为multi_logger.只需在初始化程序中执行此操作:
MultiLogger.add_logger('post')
并打电话
Rails.logger.post.error('hi') # or call logger.post.error('hi') if it is accessible.
你完成了
如果您想自己编写代码,请参阅以下内容:
更完整的解决方案是将下面你lib/
或config/initializers/
目录.
好处是您可以设置formatter自动为时间戳或严重性添加前缀.这可以从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")