একটি স্বতন্ত্র লগ ফাইলে রেলগুলিতে কীভাবে কিছু লগ ইন করবেন?


157

রেলগুলিতে আমি স্ট্যান্ডার্ড ডেভেলপমেন্ট.লগ বা প্রোডাকশন.লগ না করে একটি ভিন্ন লগ ফাইলে কিছু তথ্য লগ করতে চাই। আমি এই মডেল ক্লাস থেকে এই লগিং করতে চাই।

উত্তর:


187

আপনি যে কোনও মডেলের অভ্যন্তর থেকে নিজেকে লগার অবজেক্ট তৈরি করতে পারেন। কেবল কনস্ট্রাক্টরের কাছে ফাইলের নামটি দিন এবং সাধারণ রেলগুলির মতো অবজেক্টটি ব্যবহার করুন 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


5
আপনি যদি সেই নির্দিষ্ট মডেলের জন্য সমস্ত ডিফল্ট লগিং পরিবর্তন করতে চান তবে আপনি কেবল User.logger = Logger.new(STDOUT)বা যেখানেই লগ ইন করতে চান তা ব্যবহার করতে পারেন। একইভাবে, ActiveRecord::Base.logger = Logger.new(STDOUT)সমস্ত মডেলের জন্য সমস্ত লগিং পরিবর্তন করবে।
ডেভ

যে কোনও লগের ফোল্ডার তৈরি করতে জানেন?
মাউরো ডায়াস

2
@ ডেভ আমি আপনার পরামর্শ চেষ্টা করেছি এবং এটি ব্যর্থ হয়েছে। User.logger = Logger.new(STDOUT)সমস্ত মডেলের জন্য সমস্ত লগিং পরিবর্তন। ঠিক আছে, এটি পরিবর্তিত হয়েছেActiveRecord::Base.logger
fetsh

@ ইলজফ হ্যাঁ, 3 বছর আগে থেকে এই আচরণগুলি পিলগুলিতে পরিবর্তিত হওয়া বেশ সম্ভব। এই কল করার জন্য ধন্যবাদ।
ডেভ

ধন্যবাদ। আমার কন্ট্রোলারদের my_loggerমধ্যে রেখে বেশিরভাগ একই কাজ করেছেন application_controller.rb
kstratis

40

হালনাগাদ

আমি নীচের সমাধানের উপর ভিত্তি করে একটি রত্ন তৈরি করেছি, যার নাম মাল্টি_লগার । ইনিশিয়ালাইজারে এটি করুন:

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

1
কিসের #{$$}জন্য?
ড্যানিয়েল কোস্তা


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

তারপরে আপনার নিয়ামক বা সত্যিকারের যে কোনও জায়গায় আপনি আপনার রেল অ্যাপ্লিকেশন থেকে কোনও মডেলের শ্রেণিটি উল্লেখ করতে পারেন, যেমন আপনি যে কোনও জায়গায় করতে পারেন Post.create(:title => "Hello world", :contents => "Lorum ipsum");বা অনুরূপ কিছু আপনি নিজের কাস্টম ফাইলটিতে লগ ইন করতে পারেন

MyLog.debug "Hello world"

2
স্মার্ট এবং সহজ সমাধান!
আনোয়ার

9

অ্যাপ্লিকেশন / মডেল / বিশেষ_লগ.আরবিতে একটি লগার শ্রেণি সংজ্ঞায়িত করুন:

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")

4

আমার কাস্টম লগারটি এখানে:

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

2
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  

1

আমি কাস্টম লগিংয়ের জন্য লগ 4 আর মণি ব্যবহার করার পরামর্শ দেব । এর পৃষ্ঠা থেকে বিবৃতি উদ্ধৃত:

লগ 4r হ'ল রুবি প্রোগ্রামে ব্যবহারের জন্য রুবিতে লেখা একটি বিস্তৃত এবং নমনীয় লগিং লাইব্রেরি। এতে কোনও স্তরের কাস্টম স্তরের নাম, লগার উত্তরাধিকার, লগ ইভেন্ট প্রতি একাধিক আউটপুট গন্তব্য, এক্সিকিউশন ট্রেসিং, কাস্টম ফর্ম্যাটিং, থ্রেড সাফাইনেস, এক্সএমএল এবং ওয়াইএএমএল কনফিগারেশন এবং আরও অনেক কিছুর একটি শ্রেণিবদ্ধ লগিং সিস্টেম রয়েছে।


1
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')

0

লগিং ফ্রেমওয়ার্কটি এর ছদ্মবেশী সরল নাম সহ আপনার কামনাশক্তি রয়েছে!

শব্দ ফিল্টার আউট, সতর্কতা পেতে এবং সূক্ষ্ম-দানাদার এবং উচ্চ-স্তরের উপায়ে আউটপুট চয়ন করার জন্য লগিং-রেলের খুব স্বল্প নির্দেশাবলী অনুসরণ করুন ।

আপনার কাজ শেষ হয়ে গেলে নিজেকে পিছনে ফেলুন। লগ-রোলিং, প্রতিদিন। একা জন্য এটি মূল্যবান।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.