যখন আপনি একটি অদ্ভুত, আপাতদৃষ্টিতে অমীমাংসিত ত্রুটির মধ্যে পড়েন, তখন আপনার লগিং উন্নত করা আপনার নেওয়া সেরা পদক্ষেপ হতে পারে। অসাধারন লগিং হল সম্পূর্ণ ক্লাসের বাগ সনাক্ত করার এবং ঠিক করার সবচেয়ে সহজ উপায়। যখন আপনি পর্যাপ্ত তথ্য লগ করেন, তখন আপনি একটি অনুরোধের সময় আপনার ডেটা কীভাবে পরিবর্তিত হয় তা দেখতে পারেন। আপনি অন্য পরিষেবাগুলিতে করা কলগুলি ট্র্যাক করতে পারেন এবং প্রতিক্রিয়া তদন্ত করতে পারেন৷ প্রকৃতপক্ষে, যখন ডিবাগার ব্যর্থ হয়, লগিং আমাকে আমার সবচেয়ে কঠিন বাগটি ঠিক করতে সাহায্য করেছিল৷
কিন্তু খুব বেশি লগ করুন, এবং আপনার লগ ফাইলগুলি দ্রুত অপাঠ্য, অসহায় বার্তাগুলির একটি জমে পরিণত হবে৷ ডেটার সেই স্তূপ থেকে আপনি কীভাবে যত্নশীল তথ্যগুলিকে স্লাইস করতে পারেন? আপনি কি এমনভাবে বার্তা প্রিন্ট করতে পারেন যা পরে ফিল্টার করা সহজ?
আপনার লগ বার্তাগুলি চিহ্নিত করা
রেলের মধ্যে TaggedLogging রয়েছে, যা আপনাকে দ্রুত সম্পর্কিত লগ বার্তা শ্রেণীবদ্ধ করতে সাহায্য করতে পারে। আপনি যখন একজন লগারকে ট্যাগ করেন, আপনি আপনার বার্তার শুরুতে একটি মার্কার পাবেন। তাই এর পরিবর্তে:
Finding people...
Person Load (0.3ms) SELECT "people".* FROM "people"
Found 0 people!
আপনি রেল লগার ট্যাগ করতে পারেন:
logger.tagged("People") do
logger.debug "Finding people..."
@people = Person.all
logger.debug "Found #{@people.length} people!"
end
এবং আপনি এরকম কিছু দেখতে পাবেন:
[People] Finding people...
[People] Person Load (0.3ms) SELECT "people".* FROM "people"
[People] Found 0 people!
এখন, লগ বার্তাগুলি যেগুলি বিভিন্ন জিনিসের যত্ন নেয় সেগুলি দেখতে পারে৷ ভিন্ন।
কিছু ট্যাগ করা লগার উদাহরণ
আপনি যখন আরও ঘন ঘন লগ করবেন, এবং আরও জটিল জিনিস লগ করবেন, আপনি স্বাভাবিকভাবেই সেই অঞ্চলগুলি লক্ষ্য করবেন যেখানে এই ট্যাগগুলি আপনার বার্তাগুলিকে আরও স্পষ্ট করে তুলবে৷ কিন্তু এমন কয়েকটি জায়গা আছে যা আমি ট্যাগ করা লগিং বিশেষভাবে সহায়ক খুঁজে পেয়েছি৷ আমি সাধারণত সেগুলিকে এখনই ট্যাগ করব৷
৷অন্যান্য API-এ আপনার করা অনুরোধগুলি লগ করতে পারেন:
logger.tagged("GitHub API") do
uri = URI("https://api.github.com/repos/rails/rails/tags")
logger.info { "Fetching #{uri}" }
tags = JSON.parse(Net::HTTP.get(uri))
logger.info { "First tag: #{tags.first["name"]}" }
end
[GitHub API] Fetching https://api.github.com/repos/rails/rails/tags
[GitHub API] First tag: v4.2.4.rc1
এইভাবে, আপনি সহজেই দেখতে পারবেন কিভাবে এবং কখন আপনার অ্যাপ সেই API এর সাথে কথা বলছে।
(এটি বিশেষ করে ফ্যারাডে মিডলওয়্যারের সাথে ভাল কাজ করে, অথবা যদি আপনি শুধুমাত্র একটি গেটওয়ের মাধ্যমে একটি সার্ভারের সাথে যোগাযোগ করেন)।
ব্যাকগ্রাউন্ড জবগুলি ট্যাগ করা লগিংয়ের সাথেও ভাল কাজ করে:
require "active_support/tagged_logging"
Resque.logger = ActiveSupport::TaggedLogging.new(Resque.logger)
module LoggedJob
def around_perform_log_job(*args)
logger.tagged(name) do
logger.info { "Performing #{name} with #{args.inspect}" }
yield
end
end
end
class MyJob
extend LoggedJob
def self.perform(*args)
...
end
end
এখন, LoggedJob প্রসারিত যে কোনও চাকরিতে তার সমস্ত লগ মেসেজ কাজের ক্লাসের নামের সাথে ট্যাগ করা থাকবে।
এবং যদি আপনার কোনো লগ-ইন ব্যবহারকারী থাকে, তাহলে আপনি তাদের ব্যবহারকারী আইডি দিয়ে বার্তা ট্যাগ করতে পারেন:
logger.tagged(current_user_id ? "user-#{current_user_id}" : "user-anonymous") do
logger.debug "Finding people..."
@people = Person.all
logger.debug "Found #{@people.length} people!"
end
[user-123] Finding people...
[user-123] Person Load (0.3ms) SELECT "people".* FROM "people"
[user-123] Found 0 people!
অবশেষে, আপনি যদি আপনার config/environments/production.rb
এ একটি লাইন যোগ করেন (বা development.rb
), আপনি রেলগুলিকে স্বয়ংক্রিয়ভাবে আপনার বার্তাগুলি ট্যাগ করতে পারেন:
config.log_tags = [ :subdomain, :uuid ]
log_tags
প্রতিটি রেল লগ এন্ট্রির শুরুতে আপনি যে ট্যাগগুলি দেখতে চান তা তালিকাভুক্ত করে। প্রতিটি প্রতীক ActionDispatch::Request এর একটি পদ্ধতিকে নির্দেশ করে, তাই :uuid
মানে request.uuid
.
আপনি একটি Proc পাস করতে পারেন যা একটি request
নেয় বস্তু:
config.log_tags = [ :subdomain, :uuid, lambda { |request| request.headers["User-Agent"] } ]
কিন্তু আমি এটা প্রায়ই দেখি না।
এই ডিফল্ট ট্যাগগুলি চমৎকার:uuid
একটি অনুরোধে ঘটতে থাকা সমস্ত লগ এন্ট্রি একসাথে টাই করতে পারে এবং আপনি যদি সার্ভারে সেশনগুলি রাখেন, সেশন আইডিও সহায়ক। এই ট্যাগগুলি এবং যথেষ্ট বার্তাগুলির সাহায্যে, আপনি আপনার অ্যাপের মাধ্যমে কিছু সত্যিই জটিল পথ ট্রেস করতে পারেন৷ এবং সাধারণত, একটি খারাপ বাগ কিভাবে ঘটেছে তা বোঝার জন্য এটিই লাগে।
আপনি আপনার অ্যাপে রেল লগার কতটা ব্যবহার করেন? আপনি ট্যাগ লগিং চেষ্টা করেছেন? আপনার যদি না থাকে তবে এটির জন্য একটি জায়গা খুঁজে বের করার চেষ্টা করুন। আপনার ব্যবহারকারীদের দ্বারা নেওয়া পদক্ষেপগুলি ট্যাগ করা একটি ভাল শুরু৷৷ পরের বার যখন আপনাকে একটি পাগল মাল্টি-স্টেপ বাগ ডিবাগ করতে হবে তখন এটি আপনাকে সাহায্য করবে।
আপনি যদি লগিং এবং অন্যান্য ডিবাগিং কৌশল সম্পর্কে আরও জানতে চান, আমি আপনার অ্যাপস তৈরি করার সময় আপনি যে ত্রুটিগুলি চালাবেন তা খুঁজে বের করতে এবং ঠিক করার জন্য অনুশীলন করার একটি সম্পূর্ণ অধ্যায় উৎসর্গ করেছি। প্রথম অধ্যায় বিনামূল্যে এখানে নিন।