উত্তর:
আপনি যে কোনও মডেলের অভ্যন্তর থেকে নিজেকে লগার অবজেক্ট তৈরি করতে পারেন। কেবল কনস্ট্রাক্টরের কাছে ফাইলের নামটি দিন এবং সাধারণ রেলগুলির মতো অবজেক্টটি ব্যবহার করুন 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
ক্লাসে (অথবা আপনার নিজের কিছু সুপারক্লাসে বানর প্যাচ খুব বেশি পছন্দ করতে চান না) ইনজেক্ট করতে পারেন also
User.logger = Logger.new(STDOUT)
সমস্ত মডেলের জন্য সমস্ত লগিং পরিবর্তন। ঠিক আছে, এটি পরিবর্তিত হয়েছেActiveRecord::Base.logger
my_logger
মধ্যে রেখে বেশিরভাগ একই কাজ করেছেন application_controller.rb
।
হালনাগাদ
আমি নীচের সমাধানের উপর ভিত্তি করে একটি রত্ন তৈরি করেছি, যার নাম মাল্টি_লগার । ইনিশিয়ালাইজারে এটি করুন:
MultiLogger.add_logger('post')
এবং কল
Rails.logger.post.error('hi')
# or call logger.post.error('hi') if it is accessible.
এবং আপনি সম্পন্ন হয়েছে।
আপনি যদি নিজের কোডিং করতে চান তবে নীচে দেখুন:
আরও একটি সম্পূর্ণ সমাধান আপনার lib/
বা config/initializers/
ডিরেক্টরিতে নিম্নলিখিত স্থাপন করা হবে ।
সুবিধাটি হ'ল আপনি স্বয়ংক্রিয়ভাবে লগগুলিতে প্রিফিক্স টাইমস্ট্যাম্প বা তীব্রতার জন্য ফর্ম্যাটর সেটআপ করতে পারেন। এটি রেলের যে কোনও জায়গা থেকে অ্যাক্সেসযোগ্য এবং সিঙ্গলটন প্যাটার্নটি ব্যবহার করে আরও সুন্দর দেখায়।
# 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
তারপরে আপনার নিয়ামক বা সত্যিকারের যে কোনও জায়গায় আপনি আপনার রেল অ্যাপ্লিকেশন থেকে কোনও মডেলের শ্রেণিটি উল্লেখ করতে পারেন, যেমন আপনি যে কোনও জায়গায় করতে পারেন Post.create(:title => "Hello world", :contents => "Lorum ipsum");
বা অনুরূপ কিছু আপনি নিজের কাস্টম ফাইলটিতে লগ ইন করতে পারেন
MyLog.debug "Hello world"
অ্যাপ্লিকেশন / মডেল / বিশেষ_লগ.আরবিতে একটি লগার শ্রেণি সংজ্ঞায়িত করুন:
class SpecialLog
LogFile = Rails.root.join('log', 'special.log')
class << self
cattr_accessor :logger
delegate :debug, :info, :warn, :error, :fatal, :to => :logger
end
end
(বলুন) কনফিগারেশন / আরম্ভকারী / বিশেষ_লগ.আরবিতে লগারটি আরম্ভ করুন:
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 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
আমি কাস্টম লগিংয়ের জন্য লগ 4 আর মণি ব্যবহার করার পরামর্শ দেব । এর পৃষ্ঠা থেকে বিবৃতি উদ্ধৃত:
লগ 4r হ'ল রুবি প্রোগ্রামে ব্যবহারের জন্য রুবিতে লেখা একটি বিস্তৃত এবং নমনীয় লগিং লাইব্রেরি। এতে কোনও স্তরের কাস্টম স্তরের নাম, লগার উত্তরাধিকার, লগ ইভেন্ট প্রতি একাধিক আউটপুট গন্তব্য, এক্সিকিউশন ট্রেসিং, কাস্টম ফর্ম্যাটিং, থ্রেড সাফাইনেস, এক্সএমএল এবং ওয়াইএএমএল কনফিগারেশন এবং আরও অনেক কিছুর একটি শ্রেণিবদ্ধ লগিং সিস্টেম রয়েছে।
লগিং ফ্রেমওয়ার্কটি এর ছদ্মবেশী সরল নাম সহ আপনার কামনাশক্তি রয়েছে!
শব্দ ফিল্টার আউট, সতর্কতা পেতে এবং সূক্ষ্ম-দানাদার এবং উচ্চ-স্তরের উপায়ে আউটপুট চয়ন করার জন্য লগিং-রেলের খুব স্বল্প নির্দেশাবলী অনুসরণ করুন ।
আপনার কাজ শেষ হয়ে গেলে নিজেকে পিছনে ফেলুন। লগ-রোলিং, প্রতিদিন। একা জন্য এটি মূল্যবান।
User.logger = Logger.new(STDOUT)
বা যেখানেই লগ ইন করতে চান তা ব্যবহার করতে পারেন। একইভাবে,ActiveRecord::Base.logger = Logger.new(STDOUT)
সমস্ত মডেলের জন্য সমস্ত লগিং পরিবর্তন করবে।