当前位置:  开发笔记 > 编程语言 > 正文

如何在独立日志文件中记录Rails中的内容?

如何解决《如何在独立日志文件中记录Rails中的内容?》经验,为你挑选了4个好方法。

在rails中我想在一个不同的日志文件中记录一些信息,而不是标准的development.log或production.log.我想从模型类中进行日志记录.



1> Thiago Arrai..:

您可以从任何模型内部自己创建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类中(或者如果您不喜欢使用太多补丁,可以将其注入到自己的某些超类中)以在应用程序的模型之间共享代码.


如果要更改该特定模型的所有默认日志记录,只需使用`User.logger = Logger.new(STDOUT)`或您想要登录的任何位置.同样,`ActiveRecord :: Base.logger = Logger.new(STDOUT)`将更改所有模型的所有日志记录.
@Dave我已经尝试过你的建议而且失败了.`User.logger = Logger.new(STDOUT)`改变了所有模型的所有日志记录.好吧,它改变了'ActiveRecord :: Base.logger`

2> lulalala..:

更新

我根据下面的解决方案创建了一个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



3> Vaughn Draug..:

对我有用的一个不错的选择就是在你的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"


智能简单的解决方案!

4> Les Nighting..:

在(例如)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")

推荐阅读
贴进你的心聆听你的世界
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有