如何在独立日志文件中loggingRails中的某些内容?

在rails中,我想在一个不同的日志文件中logging一些信息,而不是标准的development.log或production.log。 我想从模型类中做这个日志logging。

您可以从任何模型中自行创build一个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属性来logginglogging器。 这样就不会为创build的每个用户对象创build,但是您不需要这样做。 还要记住,你可以将my_logger方法直接注入到ActiveRecord::Base类(或者如果你不喜欢猴子补丁太多)来共享你的应用程序模型之间的代码,

更新

我根据下面的解决scheme做了一个gem,叫做multi_logger 。 只需在初始化程序中执行此操作:

 MultiLogger.add_logger('post') 

并打电话

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

你完成了。

如果你想自己编码,请看下面:


更完整的解决scheme是将以下内容放在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 

适合我的一个体面的select是只添加一个相当普通的类到你的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"); 或者类似的东西,你可以像这样login到你的自定义文件

 MyLog.debug "Hello world" 

这是我的自定义logging器:

 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 

在(例如)app / models / special_log.rb中定义一个logging器类:

 class SpecialLog LogFile = Rails.root.join('log', 'special.log') class << self cattr_accessor :logger delegate :debug, :info, :warn, :error, :fatal, :to => :logger end end 

初始化logging器(比如说)config / initializers / special_log.rb:

 SpecialLog.logger = Logger.new(SpecialLog::LogFile) SpecialLog.logger.level = 'debug' # could be debug, info, warn, error or fatal 

在你的应用程序的任何地方,你可以login:

 SpecialLog.debug("something went wrong") # or SpecialLog.info("life is good") 

我会build议使用Log4r的gem自定义日志logging。 从其页面引用说明:

Log4r是一个用Ruby编写的用于Ruby程序的全面而灵活的日志logging库。 它具有任意级别的分层日志logging系统,自定义级别名称,logging器inheritance,每个日志事件的多个输出目标,执行跟踪,自定义格式化,线程安全性,XML和YAMLconfiguration等等。

 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框架以其简单的名称具有您渴望的复杂性!

按照logging-rails的简短说明开始过滤掉噪声,获取警报,并以细粒度和高级别的方式select输出。

当你完成后,把自己放在后面。 日志滚动,每天。 值得这一点。