লগিং হলো আপনার রুবি অ্যাপ্লিকেশন কী করছে সেটি সম্পর্কে ইনফরমেশন সংরক্ষণ করার প্রক্রিয়া।
এটি ডেভেলপমেন্ট এবং প্রোডাকশন এনভায়রনমেন্ট উভয়তেই খুব সহায়ক।
কেন?
কারণ লগিংয়ের পুরো পয়েন্ট হলো কী ঘটло, কী ভুল হয়েছে এবং কী ঠিক হয়েছে সেটি সম্পর্কে ইনফরমেশন সংগ্রহ করা।
সব ধরনের ইনফরমেশন লগ করা যায়:
- স্লো SQL ক্যোয়ারী (যাতে আপনি সেগুলো খুঁজে বের করে ফিক্স করতে পারেন)
- এরর মেসেজ
- ডিটেইলড রিকোয়েস্ট ইনফরমেশন (URL, Controller, Params, Views…)
এই ইনফরমেশন দিয়ে, আপনি আপনার অ্যাপ্লিকেশনে সমস্যাগুলোর উৎস দ্রুত ডায়গনোজ ও খুঁজে বের করতে পারেন।
একটি রেইলস অ্যাপে, লগগুলো /log ফোল্ডারের নিচে সংরক্ষিত হয়।
ডেভেলপমেন্ট মোডে, development.log ফাইলটি ব্যবহার হয় এবং আপনি rails server রান করছেন সেই টার্মিনালে লগ আউটপুট দেখেন।
এখন:
চলুন শিখি Logger ক্লাস ব্যবহার করে রুবিতে লগিং কীভাবে করবেন!
Logger ক্লাস
রুবি Logger ক্লাস আপনাকে ডিফল্ট আউটপুট ফরম্যাট এবং সেভেরিটি-এর বিভিন্ন লেভেল দিয়ে লগ জেনারেট করার পথ দেয়।
এভাবে একটি লগ তৈরি করুন:
logger = Logger.new("my_log.txt")
এটি লগিং মেসেজ my_log.txt এ লিখবে।
আপনি যদি প্রোগ্রাম রান করছেন সেই টার্মিনালে মেসেজ দেখাতে চান, তবে STDOUT-এ লগ করতে পারেন।
এভাবে:
logger = Logger.new(STDOUT)
লগিং মেসেজের ভিন্ন লেভেল হতে পারে, সেগুলো কতটুকু Криটিক্যাল সেটির ওপর নির্ভর করে।
লেভেলগুলো হলো:
- DEBUG
- INFO
- WARN
- ERROR
- FATAL
- UNKNOWN
প্রতিটি লেভেলের একটি করেসপন্ডিং ইনস্ট্যান্স মেথড রয়েছে।
তাই আপনি যদি "info" লগ করতে চান।
এভাবে করুন:
logger.info("I'm reading a RubyGuide about logging!")
আসল লগ এন্ট্রি এইরকম দেখে:
# I, [2019-08-08T19:22:00.152079 #642] INFO -- : I'm reading a RubyGuide about logging!
এই বিভিন্ন লেভেলগুলো আপনার লগ ফাইল ফিল্টার করতে সাহায্য করে, যাতে আপনি যা খুঁজছেন সেটি দ্রুত পান!
এটি আপনাকে সময়ের সাথে সাথে কতটি এরর ও ওয়ার্ন মেসেজ জেনারেট হচ্ছে সেটি দেখাতেও সাহায্য করে।
খুব ভালো!
আপনার লগ ফরম্যাট কীভাবে করবেন
আপনার রুবি লগের জন্য ডিফল্ট আউটপুট ফরম্যাট ব্যবহার করা দুর্দান্ত কারণ এর চারপাশে টুল তৈরি করা যায় এবং অধিক মানুষ বুঝতে পারে কীভাবে কাজ করে।
এখানে আবার একটি লগ লাইন:
# I, [2019-08-08T19:22:00.152079 #642] INFO -- : test
এটিতে কিছু কম্পোনেন্ট রয়েছে:
- "I" সেভেরিটি লেভেলের প্রথম অক্ষর রিপ্রেজেন্ট করে
- ব্র্যাকেটের ভিতরে আপনি টাইমস্ট্যাম্প এবং প্রসেস আইডি (PID) পাবেন যেটি এই লগ মেসেজ জেনারেট করেছে
- INFO হলো সেভেরিটি লেভেলের পূর্ণ নাম
- কোলনের পরে, আমাদের থাকে আসলে যা লগ করা হয়েছিল
কিন্তু এই ফরম্যাট সবার জন্য আদর্শ নাও হতে পারে।
তাই রুবি আপনাকে এটা পরিবর্তন করার অনুমতি দেয়!
এভাবে:
logger.formatter = proc { |severity, datetime, progname, msg| "#{severity}, #{datetime}, #{msg}\n" }
ফলস্বরূপ, আপনি এই আউটপুট পাবেন:
DEBUG, 2019-08-08 19:39:01 +0200, testing
আপনি এটি ব্যবহার করতে পারেন অতিরিক্ত ইনফরমেশন যোগ করতে যা আপনার এবং আপনার টিমের জন্য সহায়ক হতে পারে।
আপনার লগ সাইজ কীভাবে লিমিট করবেন
লগগুলো খুব বড় ফাইল হয়ে যেতে পারে যদি আপনি তাদের সাইজ ট্র্যাক না করেন।
আপনি যদি লগের কারণে ডিস্ক স্পেস খতম হয়ে যান, তবে আপনার সিস্টেমে সব ধরনের অদ্ভুত জিনিস শুরু হয়ে যাবে।
একটি সমাধান রয়েছে!
আপনি আপনার লগের সাইজ লিমিট করতে পারেন।
এভাবে:
MEGABYTE = 1024 ** 2
ONE_HUNDRED_MEGABYTES = MEGABYTE * 100
logger = Logger.new("my_log.txt", 1, ONE_HUNDRED_MEGABYTES)
১ম প্যারামিটার হলো কোথায় লগ মেসেজ সংরক্ষণ করবেন।
২য় প্যারামিটার হলো কতগুলো লোগ ফাইল রাখবেন (লগ রোটেশন), এবং শেষ প্যারামিটার হলো ম্যাক্সিমাম ফাইল সাইজ।
লগ পড়া ও ফিল্টারিং (Log Reading & Filtering)
ঠিক আছে, আপনার লগ পেয়ে গেলেন।
আপনি কীভাবে সেগুলো পড়বেন এবং যা দরকার সেটি খুঁজে বের করবেন?
লগগুলো প্লেইন-টেক্সট ফাইল, তাই আপনি যেকোনো টেক্সট-প্রসেসিং টুল ব্যবহার করতে পারেন যা আপনার পছন্দ।
উদাহরণ:
Grep।
এটি একটি কমান্ড-লাইন টুল যা আপনি টেক্সট ফাইল ফিল্টার করতে ব্যবহার করতে পারেন।
এভাবে:
grep INFO my_log.txt
এটি আপনাকে প্রতিটি লাইন দেবে যা "INFO" হিসেবে লগ করা হয়েছে।
আপনি grep ব্যবহার করে আপনার লগের ভিতরে যেকোনো অন্যান্য টেক্সট সার্চ করতে পারেন, শুধু "INFO" কে আপনি যা খুঁজছেন সেটি দিয়ে রিপ্লেস করুন।
আরেকটি ইউনিক্স টুল যা আপনি ব্যবহার করতে পারেন সেটি হলো less (with -R option)।
এটি আপনাকে শুধু কিবোর্ড ব্যবহার করে লগ স্ক্রোল করতে দেয় এবং এর একটি সার্চ ফাংশন রয়েছে।
আপনি এছাড়া ব্যবহার করতে পারেন…
লগ ম্যানেজমেন্ট এবং সার্চিং-এর জন্য নির্দিষ্ট টুল।
যেমন Discourse-এর logster জেম।
সারসংক্ষেপ
আপনি রুবিতে লগিং সম্পর্কে শিখেছেন, সেটি কী, কীভাবে কাজ করে, এবং কীভাবে ব্যবহার করবেন।
এখন আপনার পালা এটি ট্রাই করার।
পড়ার জন্য ধন্যবাদ!