রেল রেকের কার্যগুলিতে বনাম লগার রাখে


108

একটি রেক টাস্কে আমি যদি পটস কমান্ড ব্যবহার করি তবে আমি কনসোলে আউটপুট দেখতে পাচ্ছি। তবে অ্যাপ্লিকেশন উত্পাদনের সময় নিযুক্ত করা অবস্থায় আমি লগ ফাইলটিতে সেই বার্তাটি দেখতে পাব না।

তবে আমি যদি বলি Rails.logger.info তবে বিকাশ মোডে আমি কনসোলে কিছুই দেখতে পাচ্ছি না। আমার লগ ফাইল এবং লেজ যেতে হবে।

আমি আদর্শভাবেই Rails.logger.info এবং রেক টাস্কের মধ্যে বিকাশ মোডে ব্যবহার করতে চাই, লগার থেকে আউটপুটও কনসোলে প্রেরণ করা উচিত।

এটি অর্জন করার কোনও উপায় আছে?

উত্তর:


57

এটিকে রাখুন application.rbবা একটি রেক টাস্কে কোডটি আরম্ভ করুন

if defined?(Rails) && (Rails.env == 'development')
  Rails.logger = Logger.new(STDOUT)
end

এটি রেলস 3 কোড। নোট করুন যে এটিতে লগিংকে ওভাররাইড করবে development.log। যদি আপনি উভয়ই চান STDOUTএবং development.logআপনার একটি র‍্যাপার ফাংশন প্রয়োজন।

আপনি যদি কেবল রেল কনসোলে এই আচরণটি পছন্দ করতে চান তবে আপনার কোডটিতে একই ব্লকের কোডটি রাখুন ~/.irbrc


26
শুধু विकास.আরবি স্থাপন করা কি সহজ হবে না Rails.logger = Logger.new(STDOUT)?
গেম্পটন

রেল 2 এর জন্য, এটি আপনার বিকাশে config.logger = Logger.new(STDOUT)
রাখুন r rb

38

এটি কাজ করতে আপনি একটি নতুন রেক টাস্ক তৈরি করতে পারেন।

desc "switch logger to stdout"
task :to_stdout => [:environment] do
 Rails.logger = Logger.new(STDOUT)
end

এইভাবে আপনি যখন আপনার রাক টাস্কটি সম্পাদন করেন আপনি প্রথমে স্টডআউট লগ বার্তা পেতে যোগ করতে পারেন বা এটি ডিফল্ট লগ ফাইলটিতে বার্তা প্রেরণে অন্তর্ভুক্ত করতে পারেন না

rake to_stdout some_task

11

কড়া কার্যগুলি একটি ব্যবহারকারীর দ্বারা কমান্ড-লাইনে চালিত হয়। তাদের যে মুহুর্তে জানতে হবে ("প্রসেসড 5 সারি") এর সাথে টার্মিনালে আউটপুট হওয়া উচিত puts

কিছু যে বংশধরগণ জন্য রাখা করা প্রয়োজন ( "jsmith@example.com কে ইমেল সতর্কীকরণ পাঠিয়ে") পাঠানো উচিত Rails.logger


17
ক্রোন দিয়ে রেক টাস্ক চালানো অস্বাভাবিক কিছু নয়।
জোহানেস গর্সেট

2
সত্য। ক্রোন কাজ শেষ হয়ে গেলে আপনি যদি লগ বার্তাগুলি ইমেল করতে চান তবে সেগুলি $ স্টডআউট বা der স্টাডারের বাইরে থুতু দিন।
জোনাথন জুলিয়ান

10

আমি বলতে চাই যে ব্যবহার Rails.logger.infoকরার উপায়।

আপনি সার্ভার কনসোলে এটি দেখতে সক্ষম হবেন না কারণ এটি সার্ভারের মাধ্যমে চলবে না। কেবল একটি নতুন কনসোল এবং tail -fলগ ফাইল খুলুন , এটি কৌশলটি করবে।

অনেক ব্যবহারকারী UNIX® কমান্ড 'লেজ' সম্পর্কে সচেতন, যা একটি বড় ফাইলের শেষ কয়েকটি লাইন প্রদর্শন করতে ব্যবহার করা যেতে পারে। এটি লগ ফাইল ইত্যাদির জন্য দরকারী হতে পারে etc.

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

( মাধ্যমে )


স্থানীয় মেশিনে কাজ করার সময় এটি খুব আরামদায়ক নয় কারণ আপনি একই উইন্ডোটিতে আউটপুট দেখতে পাবেন না যেখানে আপনি টাস্কটি বলেছেন। বিশেষত একসাথে একাধিক উইন্ডোজ ফিট করার জন্য যদি আপনার বড় স্ক্রিন না থাকে।
টমাস মার্কাউকাস

10
tailf"এটি লেজু-ফ এর অনুরূপ তবে এটি যখন বাড়ছে না তখন ফাইল অ্যাক্সেস করে না" ব্যবহার করা আরও ভাল ( এটি খুব খাটো
এমবিও

@ টমাস কেন সার্ভার লগ কনসোলকে ন্যূনতম করছে না এবং কেবলমাত্র টেল-এফ দিয়ে একটি কনসোল চলছে? যাইহোক এটা একটি বাস্তব সমস্যা ... আমি 8 ট্রেসিং আমার app এর মধ্যে ঘটছে কনসোল মত চলমান এএম এর শুধু ট্যাবগুলির একটি থেকে অন্যটিতে যখন আপনি সিস্টেম কোন বড় চুক্তি এই প্রোগ্রামটিতে একটি নির্দিষ্ট অংশ কাজ করছি
marcgg

@ এমএমবো চমৎকার :) হায়লা এটি আমার মেশিনে উপলব্ধ বলে মনে হচ্ছে না (ম্যাক ওএস @ চিতাবাঘ)
মারকগ

1
@মারসিজিজি: আমার কাছে একটি "সার্ভার কনসোল" নেই (আমি যাত্রী ব্যবহার করি) তবে প্রশ্নটি রেকের কাজগুলি সম্পর্কে এবং যদি আপনি একটি টার্মিনাল উইন্ডো থেকে কোনও টাস্ক চালান, আপনি সেই উইন্ডোতে লগার থেকে কিছুই দেখতে পাবেন না। আউটপুটটি দেখতে আপনার ডিভাইসটি વિકાસের সাথে থাকতে হবে log আদর্শভাবে আমি একরকমভাবে স্টিলআউটকে অন্য আউটপুট স্ট্রিম হিসাবে রেলস.লগারের সাথে যুক্ত করব, তবে মূলটি সরিয়ে ফেলব না।
টমাস মার্কাউকাস

9

কোড

রেল 4 এবং আরও নবীনদের জন্য আপনি লগার সম্প্রচার ব্যবহার করতে পারেন ।

আপনি যদি বিকাশ মোডে রেক টাস্কগুলির জন্য STDOUT এবং ফাইল লগিং উভয়ই পেতে চান তবে আপনি এই কোডটি এতে যুক্ত করতে পারেন config/environments/development.rb:

  if File.basename($0) == 'rake'
    # http://stackoverflow.com/questions/2246141/puts-vs-logger-in-rails-rake-tasks
    log_file     = Rails.root.join("log", "#{Rails.env}.log")
    Rails.logger = ActiveSupport::Logger.new(log_file)
    Rails.logger.extend(ActiveSupport::Logger.broadcast(ActiveSupport::Logger.new(STDOUT)))
  end

পরীক্ষা

উপরের কোডটি পরীক্ষা করার জন্য এখানে একটি ছোট রেক টাস্ক:

# lib/tasks/stdout_and_log.rake
namespace :stdout_and_log do
  desc "Test if Rails.logger outputs to STDOUT and log file"
  task :test => :environment do
    puts "HELLO FROM PUTS"
    Rails.logger.info "HELLO FROM LOGGER"
  end
end

চলমান rake stdout_and_log:testআউটপুট

HELLO FROM PUTS
HELLO FROM LOGGER

যখন

HELLO FROM LOGGER

যোগ করা হয়েছে log/development.log

চলমান rake stdout_and_log:test RAILS_ENV=productionআউটপুট

HELLO FROM PUTS

যখন

HELLO FROM LOGGER

যোগ করা হয়েছে log/production.log


5 রেলগুলিতে, basename($0) == 'rake'কৌশলটি আর কাজ করে না, কারণ railsআদেশটি নিজেই চালিত হয় rake। আমি একটি কাজের উপর নির্ভর করে যে সেট আপ পরলোক এটির জন্য একটি ভাল প্রতিস্থাপন এটি ভালোবাসতাম broadcast। (এই অংশ, অন্তত, এখনও কাজ করে জরিমানা।)
ব্রেন্ট রয়েল-গর্ডন

@ ব্রেন্টরয়াল-গর্ডন এই শর্তসাপেক্ষ বিকাশের দরকার নেই, আপনি কেবল Rakefileআপনার প্রকল্পের মূলটিতে কোডটি যুক্ত করতে পারেন
মরিসিও পাসকুইয়ার জুয়ান

4

কোন অ্যাপ্লিকেশন সহায়ক তৈরি করবেন যা কোন পরিবেশটি চলছে এবং সনাক্ত করে সঠিক কাজটি করে?

def output_debug(info)
   if RAILS_ENV == "development"
      puts info
   else
      logger.info info
   end
end

তারপরে পুটস বা লগার.info এর পরিবর্তে আউটপুট_ডেবগ কল করুন


5
আমি এটি একটি ভাল ধারণা বলে মনে করি না। রেলস লগারটি কনফিগার করার জন্য বোঝানো হয়েছে, তবে সেই কনফিগারেশনে ব্যবহার করার পরিবর্তে আপনি কেবল তার উপরে আরও স্তরগুলি পাইল করছেন।
সিজমেন মুলদার

হ্যাঁ, এটি একটি ভাল ধারণা যেহেতু একই চেক করা হবে না সব আপনি কিছু লগ ইন করতে চাই।
furiabhaveshsh

3

মডেলগুলিতে লগারকে STDOUT এ পুনর্নির্দেশের জন্য রেলগুলিতে 2. এক্স:

ActiveRecord::Base.logger = Logger.new(STDOUT)

নিয়ামকদের লগার পুনর্নির্দেশ করতে:

ActionController::Base.logger = Logger.new(STDOUT)

আমি এই নিবন্ধটিও পেয়েছি, খুব দরকারী sepcot.com/blog/2009/08/rails-logging-to-stdout
তানিয়া আর

2

'&' এবং ওপেন স্ক্রিপ্ট / কনসোল বা যাই হোক না কেন একটি ব্যাকগ্রাউন্ড কাজ সম্পাদন করুন .. আপনি একই উইন্ডোতে একাধিক কমান্ড চালাতে পারেন।

tail -f log/development.log &
script/console
Loading development environment (Rails 2.3.5)
>> Product.all
2011-03-10 11:56:00 18062 DEBUG  Product Load (6.0ms)  SELECT * FROM "products"
[<Product.1>,<Product.2>]

নোট প্রচুর লগিং আউটপুট থাকলে তাড়াতাড়ি opালু পেতে পারে।

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