বেশিরভাগ লোকেরা লগের প্রয়োজনীয়তা তখনই উপলব্ধি করে যখন তাদের সবচেয়ে বেশি প্রয়োজন হয়। কিন্তু যখন আপনার অ্যাপ্লিকেশানটি ভেঙে যায়, ব্যবহারকারীর অভিযোগগুলি বন্যা শুরু হয়, এবং কীভাবে এটি ঠিক করবেন তা আপনার কাছে কোন ধারণা নেই, কিছু লগ বার্তা যোগ করতে অনেক দেরি হয়ে গেছে যা সাহায্য করতে পারে৷
ভাল লগগুলি নিজেদের জন্য দশগুণ অর্থ প্রদান করে। তারা এই জটিল বাগগুলি নির্ণয় করাকে একটি হাওয়া করে তোলে এবং আপনি যদি সঠিকভাবে লগগুলি করেন তবে আপনার ব্যবহারকারীদের নজরে আসার আগেই তারা আপনাকে সমস্যা সম্পর্কে সতর্ক করতে পারে৷ কিন্তু 'সঠিক লগিং করার' মানে কি?
লগিং শুরু করা সহজ কিন্তু আয়ত্ত করা কঠিন। এই পোস্টে, আপনি কীভাবে আপনার Rails অ্যাপ্লিকেশনের লগগুলিকে তাদের পূর্ণ সম্ভাবনার সাথে ব্যবহার করতে পারেন তা আমরা দেখব৷
রেলে লগ ইন করা
প্রথমে বেসিক নিয়ে কথা বলা যাক। আপনি যখন একটি নতুন রেল অ্যাপ্লিকেশন শুরু করেন, লগিং ইতিমধ্যেই আপনার জন্য সেট আপ করা হয়৷ রেলগুলি ActiveSupport::Logger এর একটি নতুন উদাহরণ শুরু করবে যেটি আপনি আপনার অ্যাপ্লিকেশনের মধ্যে যেকোনো জায়গায় ব্যবহার করতে পারেন।
রেল লগার স্ট্যান্ডার্ড আউটপুটে বা log/<environment>.log লিখে এবং স্বয়ংক্রিয়ভাবে আগত অনুরোধকারী বা এক্সিকিউট করা প্রশ্নগুলিকে আপনার দ্বারা স্পষ্টভাবে লেখা যেকোনো লগ বার্তা ছাড়াও লগ করবে৷
রেলের জন্য ডকুমেন্টেশনে চমৎকারভাবে বর্ণিত হিসাবে আপনি রেল লগ কনফিগার করতে পারেন এমন অনেক উপায় রয়েছে৷
আমাদের লগগুলিকে সবচেয়ে বেশি ব্যবহার করতে, আমরা বিশেষ করে লগ লেভেল ইনসেট করার পাশাপাশি লগ ফর্ম্যাটিং করতে আগ্রহী৷
কিন্তু এটি মোকাবেলা করার আগে, আসুন আমরা কেন লগ লিখতে হবে তা নিয়ে কথা বলি।
ভাল লগিং, খারাপ লগিং
লগের উদ্দেশ্য হল আপনাকে সিস্টেম ইভেন্টগুলি সম্পর্কে অবহিত করা যাতে আপনি তাদের প্রতিক্রিয়া জানাতে পারেন। উদাহরণস্বরূপ, যখন একটি ত্রুটি ঘটে, একটি লগ বার্তা আপনাকে এটি সম্পর্কে এমনভাবে বলতে হবে যাতে আপনি বুঝতে পারেন৷
আপনি একটি লগমেসেজ কতটা ভালোভাবে বোঝেন তা নির্ভর করে এটি কতটা বর্ণনামূলক এবং প্রাসঙ্গিক। একটি বর্ণনামূলক লগ বার্তা কি ঘটেছে সে সম্পর্কে প্রাসঙ্গিক তথ্য প্রদান করে। একটি প্রাসঙ্গিক লগ বার্তা একটি সিস্টেমের অবস্থা সম্পর্কে তথ্য অন্তর্ভুক্ত করে যখন সিস্টেম এটি লিখেছিল৷
কেন আমাদের উভয়ের প্রয়োজন তা দেখতে একটি সহজ উদাহরণ বিবেচনা করা যাক। এখানে এমন কিছু কোড রয়েছে যা একটি বাহ্যিক API কল করে এবং কোনো ব্যবহারকারী অনুরোধ করলে তার প্রতিক্রিয়া প্রদান করে।
এখন এমন একটি পরিস্থিতি কল্পনা করা যাক যেখানে একজন গ্রাহক একটি সমস্যা রিপোর্ট করে এবং আপনি সাহায্যের জন্য লগগুলি দেখুন৷ এটি আপনি দেখতে পাচ্ছেন:
এই লগ বার্তাগুলি কিছু তথ্য প্রদান করে, কিন্তু প্রায় যথেষ্ট নয়। গ্রাহকের রিপোর্ট করা ত্রুটির জন্য কী দায়ী তা খুঁজে বের করার জন্য আমরা আর কাছাকাছি নেই। এই লগ বার্তাগুলির বর্ণনামূলকতা এবং প্রসঙ্গ নেই। তারা শব্দ. আমরা কিভাবে তাদের উন্নতি করতে পারি?
রেলে লগ লেভেল
ডিফল্ট রেল লগার লগ লেভেল DEBUG প্রদান করে , INFO , WARN , এবং ERROR . এগুলি ব্যবহার করে, আপনি লগবার্তাগুলিকে প্রাসঙ্গিকতার বিভিন্ন বিভাগে গোষ্ঠীবদ্ধ করতে পারেন৷ এটি শুধুমাত্র লগ বার্তাগুলিকে ফিল্টার করতে সাহায্য করে না, তবে কিছু প্রসঙ্গও প্রদান করে৷
কখন কোন লগ লেভেল ব্যবহার করবেন তা নির্ধারণ করা চ্যালেঞ্জিং হতে পারে। এখানে থাম্বের কিছু নিয়ম আছে:
DEBUG:সিস্টেমের মধ্যে ঘটছে কর্ম সম্পর্কে বিস্তারিত তথ্যের জন্য এই লগ স্তর ব্যবহার করুন. আপনি ডিবাগ স্টেটমেন্ট ব্যবহার করতে পারেন যখন পদ্ধতিগুলি প্রবেশ করানো হয় বা প্রস্থান করা হয়, অথবা আপনি মনে করেন যে এটি ডিবাগিংয়ের সময় মান যোগ করতে পারে।INFO:যখনই আপনার সিস্টেমের অবস্থা পরিবর্তন হয়, বা কিছু প্রাসঙ্গিক ঘটনা ঘটে, তখনINFO-এ পৌঁছান স্তর রেল অ্যাপ্লিকেশনের প্রেক্ষাপটে সাধারণ তথ্য বার্তাগুলির উদাহরণ হল অনুরোধগুলি প্রাপ্ত করা, বহিরাগত APIগুলিতে পাঠানো অনুরোধ, বা কাজ শুরু এবং শেষ করা৷WARN:অপ্রত্যাশিত কিছু ঘটেছে তা বোঝাতে এই লগটি ব্যবহার করুন৷ এটি এখনও একটি সমস্যা নয় (কারণ আপনার অ্যাপ্লিকেশন এটি পরিচালনা করতে পারে), কিন্তু যদি এটি ঘটতে থাকে তবে এটি আপনার দৃষ্টি আকর্ষণ করতে পারে৷ERROR:একটি ত্রুটি ঘটলে এই লগ স্তর ব্যবহার করুন. ত্রুটিগুলি অবৈধ অ্যাপ্লিকেশান স্টেট যা আপনাকে যত তাড়াতাড়ি সম্ভব সমাধান করতে হবে৷
সংশ্লিষ্ট এনভায়রনমেন্ট ফাইল পরিবর্তন করে আপনি আপনার অ্যাপ্লিকেশন যে ধরনের লগ মেসেজ লেখেন তা পরিবর্তন করতে পারেন। সাধারনত, রেলগুলি DEBUG বাতিল করে দেবে। উৎপাদনে বার্তা, কিন্তু আপনি এটি পরিবর্তন করতে পারেন।
আসুন আমাদের কোড নমুনায় উপরের লগ-স্তরের পরামর্শগুলি প্রয়োগ করি৷
৷
ডিবাগ করার সময়, আমরা এখন WARN দেখে সমস্যার মূল কারণগুলি সনাক্ত করতে পারি এবং ERROR বার্তা দুঃখের বিষয়, আমাদের লগমেসেজগুলি আর বর্ণনামূলক হয়নি৷
বর্ণনামূলক লগ বার্তা
বর্ণনামূলক লগ বার্তা ব্যাখ্যার জন্য কোন জায়গা ছেড়ে দেয় না। তারা পাঠককে কী ঘটেছে সে সম্পর্কে তাত্ক্ষণিক জ্ঞান দেওয়ার জন্য প্রয়োজনীয় বিবরণ সরবরাহ করে।
আপনি যখন 'An error occurred' এর মতো বার্তাগুলি পড়েন , আপনি ভুল কি বিস্মিত বাকি আছে. আপনার লগ বার্তা লেখার সময় আপনি এই ধরনের বিভ্রান্তি এড়াতে চান। বর্ণনামূলক লগ বার্তা লেখার সময় সবচেয়ে গুরুত্বপূর্ণ বিষয় হল লগ রিডারের জুতাগুলিতে নিজেকে শীর্ষে রাখা। আপনার লগ পড়ার সময় তারা কি তাদের প্রয়োজনীয় সমস্ত তথ্য পাবে?
বার্তাটি পরিবর্তন করা যাক 'An error occurred' ত্রুটি নিজেই, এর বার্তা সহ।
এটা একটা উন্নতি। আমাদের উদাহরণে অন্যান্য লগ বার্তাগুলি পরীক্ষা করা যাক। 'Method entered' 'Response success' কোন পদ্ধতি বলা হয়েছিল তা আমাদের জানায় না প্রকৃত প্রতিক্রিয়া ছেড়ে দেয়, এবং 'Response failure' ব্যর্থতার প্রকৃতি সম্পর্কে কোন তথ্য প্রদান করে না। আসুন এটি পরিবর্তন করি।
দ্রষ্টব্য :আপনি হয়তো লক্ষ্য করেছেন যে আমরা আমাদের লগের সাথে স্ট্রিং ইন্টারপোলেশন করার সময় ব্লক সিনট্যাক্স ব্যবহার করি। যখন অ্যাপ্লিকেশনের লগ স্তর লগ বার্তার স্তরের চেয়ে বেশি হয় তখন এটি ব্যবহার করা অপ্রয়োজনীয় গণনা এড়ায়। যেমন,log.debug("Some #{concatenation}") সর্বদা স্ট্রিং সংযুক্তি সম্পাদন করবে, কিন্তু log.debug { "Some #{concatenation}" } লগ লেভেল ডিবাগ করার জন্য সেট করা হলেই তা করবে৷৷
আমাদের লগ এখন অনেক ভাল পড়া. প্রতিটি লগ বার্তা কী বোঝায় সে সম্পর্কে সামান্য সন্দেহ আছে৷
লগ বার্তাগুলির জন্য আরও প্রসঙ্গ
আমাদের নতুন লগ বার্তাগুলি কি ঘটেছে তার একটি পরিষ্কার ছবি প্রদান করে৷ কারণ এটি একটি সাধারণ উদাহরণ, কেন কিছু কিছু ঘটেছে সে সম্পর্কেও আমাদের ভালো বোঝাপড়া আছে। বাস্তবে, এটি সাধারণত এত সহজ নয়।
সিস্টেমটি যে প্রেক্ষাপটে প্রতিটি বার্তা লিখেছে সে সম্পর্কে অতিরিক্ত তথ্য প্রদান করা উল্লেখযোগ্যভাবে ডিবাগিংয়ে সাহায্য করতে পারে৷
উদাহরণস্বরূপ, অনুরোধ বা প্রতিক্রিয়া লগ করার সময়, কে অনুরোধটি সম্পাদন করেছে তা জানা সহায়ক হতে পারে। ত্রুটির জন্য একটি স্ট্যাক ট্রেস সংযুক্ত করা দরকারী হতে পারে যাতে আমরা কেন ত্রুটি ঘটেছে সে সম্পর্কে অতিরিক্ত তথ্য সংগ্রহ করতে পারি৷
দ্রষ্টব্য :আপনি সম্ভবত লক্ষ্য করেছেন যে প্রাসঙ্গিক তথ্য সহ লগ বার্তা তৈরি করা কষ্টকর হতে পারে যখন আপনি রেইলসের ডিফল্ট লগার ব্যবহার করেন। ভাগ্যক্রমে, কাস্টম লগার যেমন ওগাই বা এমআরলোগালোগা এটিকে অনেক সহজ করে তোলে।
স্ট্রাকচার্ড লগিং
একবার আপনি আপনার লগগুলি মানুষের জন্য পঠনযোগ্য করে নিলে, আপনি জিনিসগুলিকে পরবর্তী স্তরে নিয়ে যেতে প্রস্তুত৷ আপনাকে এখন মেশিনের মাধ্যমে আপনার লগগুলিকে পাঠযোগ্য করে তুলতে হবে যাতে আপনি সেগুলিকে নিরীক্ষণ এবং ডেটা বিশ্লেষণের জন্য ব্যবহার করতে পারেন৷
আমার গো-টু ফরম্যাট হল JSON, কিন্তু আপনি কোন টুল ব্যবহার করেন তার উপর নির্ভর করে, আপনি Logstash-এর মতো অন্যান্য লগ ফরম্যাট পছন্দ করতে পারেন। আপনি একটি কাস্টম লগ ফরম্যাটার তৈরি করে আপনার লগ বার্তাগুলির বিন্যাস পরিবর্তন করতে পারেন৷
নিজে কাস্টম ফরম্যাটার লেখার পরিবর্তে, আপনি কাস্টম লগ ফর্ম্যাটার প্রদান করে এমন অনেক রত্নগুলির মধ্যে একটি ব্যবহার করতে পারেন৷ Irecommend Lograge, যেটি শুধুমাত্র বাক্সের বাইরের ফরম্যাটিংই অফার করে না বরং Rails এর কিছুটা ভার্বোস রিকোয়েস্ট ফরম্যাটিংও পরিষ্কার করে যাতে এটি পড়া অনেক সহজ হয়।
AppSignal দিয়ে রেল লগিং
এখন যেহেতু আপনার লগগুলি সুন্দর এবং পঠনযোগ্য, সেগুলিকে আরও অ্যাক্সেসযোগ্য করে তুলতে ভাল হবে৷ সর্বোপরি, আপনি কিছু মেশিনে এসএসএইচ করতে চান না বা সেখানে লগগুলি গ্রেপ করতে চান না, তাই না?
সৌভাগ্যবশত, AppSignal সম্প্রতি বিটাতে একটি লগিং বৈশিষ্ট্য চালু করেছে! এটি আপনাকে সরাসরি AppSignal ওয়েব ইন্টারফেসে রেল লগগুলি পরিদর্শন ও বিশ্লেষণ করতে দেয়৷
আপনি বাম দিকের মেনুতে 'লগিং' ট্যাবের মাধ্যমে আমাদের লগিং বিটা অ্যাক্সেস করতে পারেন:

আপনি যদি আমাদের রুবি লগিং ডক্সের ধাপগুলি অনুসরণ করেন, তাহলে আপনি AppSignal::Logger ব্যবহার করতে Rails Logger কনফিগার করতে পারেন নিচের কোডটি config/environment.rb-এ রেখে ক্লাস করুন initialization এর আগে ফাইল :
আপনি JSON ফর্ম্যাটে বা Lograge-এর সাথে স্ট্রাকচার্ড লগ ইনজেস্ট করতে পারেন।
একবার আপনি সবকিছু সেট আপ করে ফেললে, আপনার রেল লগগুলি AppSignal-এ প্রদর্শিত হবে দেখতে হবে!

লগিং এবং ত্রুটি রিপোর্টিং
আপনি AppSignal ব্লগে এটি পড়ছেন, তাই আপনি ভাবতে পারেন:আমি যদি ইতিমধ্যেই একটি চমৎকার ত্রুটি রিপোর্টিং প্ল্যাটফর্ম ব্যবহার করছি তাহলে কেন আমি লগিং করার বিষয়ে চিন্তা করব?
এটা একটা ভালো প্রশ্ন। ত্রুটি ট্র্যাকিং সরঞ্জাম অ্যাপ্লিকেশন ত্রুটি সম্পর্কে বিস্তারিত তথ্য প্রদান করে. তারা যেকোনো অ্যাপ্লিকেশন ত্রুটির ফুলস্ট্যাক ট্রেস ক্যাপচার করে এবং বাক্সের বাইরে প্রচুর প্রাসঙ্গিক তথ্য সরবরাহ করে।
যাইহোক, যদিও বেশিরভাগ টুলগুলি আপনাকে ত্রুটিগুলি ব্যতীত অন্যান্য ইভেন্টগুলি ক্যাপচার করার অনুমতি দেয়, এই সরঞ্জামগুলিকে নির্বিচারে পরিমাণে বার্তা প্রেরণ করা সাধারণত অসম্ভব। আপনি বিস্তারিত, ঐতিহাসিক তথ্য প্রতিস্থাপন করতে সক্ষম হবেন না যা সুলিখিত লগ প্রদান করে।
বাস্তবে, ভাল লিখিত লগ বৃদ্ধি এবং সমর্থন ত্রুটি ট্র্যাকিং সরঞ্জাম. আপনার সম্ভবত উভয়ই ব্যবহার করা উচিত।
রেপ আপ
এই পোস্টে, আমরা দেখেছি কিভাবে আপনি আপনার লগ থেকে সবচেয়ে বেশি সুবিধা পেতে পারেন। আমরা দেখেছি যে রেলে লগিং শুরু করা সহজ, কিন্তু দরকারী লগ লেখা চ্যালেঞ্জিং হতে পারে৷
যে লগগুলিতে বর্ণনামূলকতা বা প্রসঙ্গ নেই সেগুলি সামান্য মূল্য প্রদান করার সময় কেবলমাত্র আপনার ডিস্কটি পূরণ করবে। যাইহোক, যে লগগুলি সঠিক লগ স্তরগুলি ব্যবহার করে এবং পাঠকদের তাদের প্রয়োজনীয় তথ্য সরবরাহ করে তা একটি দুর্দান্ত সম্পদ৷
একবার আপনি দুর্দান্ত লগ মেসেজ লিখতে পারদর্শী হয়ে গেলে, আপনি জিনিসগুলিকে আরও এগিয়ে নিতে পারেন এবং সেগুলিকে এমনভাবে ফর্ম্যাট করতে পারেন যা ফরলগ বিশ্লেষণ এবং সহজ ফিল্টারিংয়ের অনুমতি দেয়৷
আপনার লগগুলি সহজেই অ্যাক্সেস করতে আপনি কীভাবে অ্যাপসিগন্যালের নতুন লগিং বৈশিষ্ট্যটি ব্যবহার করতে পারেন তাও আমরা অন্বেষণ করেছি। অবশেষে, আমরা কীভাবে লগগুলিকে প্রতিস্থাপনের পরিবর্তে ত্রুটি ট্র্যাকিং সরঞ্জামগুলিকে বাড়িয়ে তুলতে হবে তা স্পর্শ করেছি৷
শুভ লগিং!
পি.এস. আপনি যদি রুবি ম্যাজিক পোস্টগুলি প্রেস থেকে বের হওয়ার সাথে সাথে পড়তে চান তবে আমাদের রুবি ম্যাজিক নিউজলেটারে সাবস্ক্রাইব করুন এবং একটি পোস্ট মিস করবেন না!
Hans-Jörg Schnedlitz
আমাদের অতিথি লেখক হ্যান্স ভিয়েনা, অস্ট্রিয়ার একজন রেল ইঞ্জিনিয়ার। তিনি তার বেশিরভাগ সময় কোডিং বা কোডিং সম্পর্কে পড়ার জন্য ব্যয় করেন এবং কখনও কখনও তার ব্লগে এটি সম্পর্কে লেখেন! তিনি যখন স্ক্রিনের সামনে বসে থাকবেন না, তখন সম্ভবত আপনি তাকে বাইরে পাহাড়ে আরোহণ করে খুঁজে পাবেন।
Hans-Jörg Schnedlitz
এর সমস্ত নিবন্ধ