aks*_*hat 148 logging ruby-on-rails
在rails中我想在一个不同的日志文件中记录一些信息,而不是标准的development.log或production.log.我想从模型类中进行日志记录.
Thi*_*ais 177
您可以从任何模型内部自己创建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
Run Code Online (Sandbox Code Playgroud)
在这里,我使用class属性来记忆记录器.这样就不会为每个创建的User对象创建它,但是您不需要这样做.还要记住,您可以将my_logger
方法直接注入到ActiveRecord::Base
类中(或者如果您不喜欢使用太多补丁,可以将其注入到自己的某些超类中)以在应用程序的模型之间共享代码.
lul*_*ala 39
更新
我根据下面的解决方案创建了一个gem,名为multi_logger.只需在初始化程序中执行此操作:
MultiLogger.add_logger('post')
Run Code Online (Sandbox Code Playgroud)
并打电话
Rails.logger.post.error('hi')
# or call logger.post.error('hi') if it is accessible.
Run Code Online (Sandbox Code Playgroud)
你完成了
如果您想自己编写代码,请参阅以下内容:
更完整的解决方案是将下面你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
Run Code Online (Sandbox Code Playgroud)
Vau*_*hon 37
对我有用的一个不错的选择就是在你的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
Run Code Online (Sandbox Code Playgroud)
然后在你的控制器中,或者几乎你可以从你的rails应用程序中引用模型类的任何地方,即你可以做的任何地方Post.create(:title => "Hello world", :contents => "Lorum ipsum");
或类似的东西,你可以登录到这样的自定义文件
MyLog.debug "Hello world"
Run Code Online (Sandbox Code Playgroud)
在(例如)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
Run Code Online (Sandbox Code Playgroud)
在(例如)config / initializers / special_log.rb中初始化记录器:
SpecialLog.logger = Logger.new(SpecialLog::LogFile)
SpecialLog.logger.level = 'debug' # could be debug, info, warn, error or fatal
Run Code Online (Sandbox Code Playgroud)
您可以在应用程序中的任何位置登录:
SpecialLog.debug("something went wrong")
# or
SpecialLog.info("life is good")
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
70520 次 |
最近记录: |