আপনি ঠিক এখন একটি অ্যাপ্লিকেশন বিল্ড করেছেন এবং লক্ষ্য করেছেন কিছু ইনটেন্ডেডভাবে কাজ করছে না। আপনি যে ফিচারটি ঠিক এখন ইমপ্লিমেন্ট করেছেন সেটি আপনার এক্সপেক্টেশনের বাইরে behave করছে। আপনি কী করবেন? এই সমস্যাটি কীভাবে সমাধান করবেন?
সফটওয়ার ডেভেলপমেন্টে, প্রোগ্রামাররা তাদের সফটওয়ার রান হওয়ার время ইভেন্ট ট্র্যাক করতে লগিং-এ নির্ভর করে। এটি সেজন্য সমস্যা উদ্ভব হলে তারা কার্যকরভাবে সমস্যার উৎস ট্র্যাক ডাউন করতে পারে।
এই গাইডে, আমরা কেন আপনার অ্যাপ্লিকেশন লগ রাখা উচিত এবং কীভাবে আপনি পাইথন লগিং মডিউল ব্যবহার করে আপনার প্রোগ্রামে ইভেন্ট ট্র্যাক রাখতে পারেন সেটি আলোচনা করব।
কেন আপনার লগ রাখা উচিত
লগ রাখা আপনাকে আরও মেইনটেইনেবল কোড লিখতে সাহায্য করে। যখন আপনি logging মডিউল ব্যবহার করেন, আপনি আপনার প্রোগ্রামে ঘটা সকল ইভেন্টের একটি নির্ভুল রেকর্ড রাখতে পারেন। এর মানে আপনি দেখতে পাবেন কী লাইন কোড রান হয়েছে এবং কী ফেল করে গেছে।
পাইথনে, ডেভেলপাররা প্রায়শই print() স্টেটমেন্ট ব্যবহার করে তাদের কোড লগ করে। এটি একটি প্র্যাক্টিস যা সবাই - বেগাইনার থেকে এক্সপার্ট পর্যন্ত - দোষী, এবং কারণও আছে। print() স্টেটমেন্ট ব্যবহার করা সহজ; এটি সিম্পল।
তবে, print() স্টেটমেন্ট আপনার কোডের লগ রাখার জন্য সেরা পদ্ধতি নয়। একটা জিনিস, print() স্টেটমেন্ট যেকোনো আউটপুট কনসোলে প্রিন্ট করতে ব্যবহার করা যায়। এর মানে কোন আউটপुट লগ হিসেবে সংরক্ষণ করা হবে এবং কোন আউটপুট আপনার মেইন প্রোগ্রামের অংশ সেটি বোঝা কনফিউজিং হতে পারে। অধিকন্তু, print() স্টেটমেন্ট ডিফল্টরূপে আপনার লগ সংরক্ষণ করে না।
সেই কারণেই পাইথন লগিং মডিউল কাজে আসে। লগিং সিস্টেম মডিউল ব্যবহার করে, আপনি আপনার কোডে যেসব ইভেন্ট রান হয়েছে তার আরও নির্ভুল রেকর্ড রাখতে পারেন। এটি আপনাকে আপনার কোড আরও কার্যকরভাবে ডিবাগ করতে এবং এরর ফিক্স করতে সাহায্য করবে।
পাইথন লগিং মডিউল কীভাবে ব্যবহার করবেন
এই টিউটোরিয়ালে, আমরা একটি প্রোগ্রামে বেসিক লগিং মেসেজ যোগ করব যা একটি স্টুডেন্ট গ্রেডের লিস্টের মধ্য দিয়ে যায় এবং ক্যালকুলেট করে তারা তাদের এক্সাম পাস করেছে কিনা বা ফেল করেছে। নিচের কোড বিবেচনা করুন:
students = ["Martin", "Lewis", "Terri", "Bart"]
grades = [92, 78, 72, 38]
pass_fail = []
for i in range(0, len(students)):
print("Calculating grade for {}".format(students[i]))
if grades[i] > 55:
pass_fail.append(True)
print("{} has passed their exam.".format(students[i]))
else:
pass_fail.append(False)
print("{} has failed their exam.".format(students[i]))
print("Student grades have been calculated. Moving on to send emails to parents of students who have failed their exams.")
উপরোক্ত কোড ক্যালকুলেট করে একটি চতুর্থ শ্রেণির পাঁচজন স্টুডেন্ট তাদের এক্সাম পাস করেছে কিনা। আমাদের প্রোগ্রামে, আমরা তিনটি লিস্ট ডিক্লেয়ার করি। একটি লিস্ট প্রতিটি স্টুডেন্টের নাম সংরক্ষণ করে; অন্যটি প্রতিটি স্টুডেন্টের অর্জিত গ্রেড সংরক্ষণ করে; ফাইনাল লিস্ট সংরক্ষণ করে কোন স্টুডেন্ট পাস বা ফেল করেছে।
যখন আমরা আমাদের প্রোগ্রাম রান করি, নিচের আউটপুট রিটার্ন হয়:
Calculating grade for Martin. Martin has passed their exam. Calculating grade for Lewis. Lewis has passed their exam. Calculating grades for Terri. Terri has passed their exam. Calculating grades for Bart. Bart has failed their exam.
print() স্টেটমেন্ট দেখাচ্ছে আমাদের কোড কাজ করছে, কিন্তু আমরা logging() মডিউল ব্যবহার করে এই ডেটা দেখাতে পারি। এটি আমাদের ডিবাগিং মেসেজকে আমাদের প্রোগ্রামের আউটপুট থেকে আলাদা করতে দেবে।
শুরু করি, লগিং স্ট্যান্ডার্ড লাইব্রেরি আমাদের প্রোগ্রামের টপে যোগ করি:
import logging
এখন যেহেতু আমরা লগিং লাইব্রেরি ইম্পোর্ট করেছি, আমরা আমাদের কোডে লগ ট্র্যাক রাখতে শুরু করতে পারি। এই উদাহরণে, আমরা DEBUG কনফিগারেশন ব্যবহার করে লগ ট্র্যাক রাখব। কারণ আমরা এই সময় ওয়ার্নিং ট্র্যাক করতে আগ্রহী নই। রেফারেন্সের জন্য, আপনি যেসব লগিং অপশন স্পেসিফাই করতে পারেন:
- CRITICAL: সিরিয়াস এরর ডিসপ্লে করতে ব্যবহৃত (logging.critical())
- ERROR: একটি সমস্যা দেখাতে ব্যবহৃত (logging.error())
- WARNING: অনায়াসিক বিহেভিয়ার দেখাতে ব্যবহৃত (logging.warning())
- INFO: প্রোগ্রাম কাজ করছে তা দেখাতে ব্যবহৃত (logging.info())
- DEBUG: কোড ডিবাগ করতে ব্যবহৃত (logging.debug())
লগিং লাইব্রেরির ডিফল্ট কনফিগারেশন WARNING, তাই আমাদের এটি রিসেট করতে হবে এই কোড ব্যবহার করে:
import logging logging.basicConfig(level=logging.DEBUG)
এখন আমরা আমাদের কোড ডিবাগ করতে রেডি। চলুন আমাদের print() স্টেটমেন্টগুলো যা বলে যে গ্রেড ক্যালকুলেট হচ্ছে বা প্রোগ্রাম ফিনিশ হয়েছে সেগুলো ডিবাগিং স্টেটমেন্ট দিয়ে রিপ্লেস করি:
import logging
logging.basicConfig(level=logging.DEBUG)
students = ["Martin", "Lewis", "Terri", "Bart"]
grades = [92, 78, 72, 38]
pass_fail = []
for i in range(0, len(students)):
logging.debug("Calculating grade for {}".format(students[i]))
if grades[i] > 55:
pass_fail.append(True)
print("{} has passed their exam.".format(students[i]))
else:
pass_fail.append(False)
print("{} has failed their exam.".format(students[i]))
logging.debug("Student grades have been calculated. Moving on to send emails to parents of students who have failed their exams.")
যখন আমরা আমাদের কোড রান করি, নিচের আউটপুট রিটার্ন হয়:
DEBUG:root:Calculating grade for Martin Martin has passed their exam. DEBUG:root:Calculating grade for Lewis Lewis has passed their exam. DEBUG:root:Calculating grade for Terri Terri has passed their exam. DEBUG:root:Calculating grade for Bart Bart has failed their exam. DEBUG:root:Student grades have been calculated. Moving on to send emails to parents of students who have failed their exams.
আপনি দেখতে পাচ্ছেন আমাদের আউটপুটে আগের মতোই কন্টেন্ট আছে। তবে, "Calculating grade for..." মেসেজ এবং গ্রেড ক্যালকুলেট হয়েছে সেটি জানানোর মেসেজ ভিন্ন দেখাচ্ছে। "DEBUG:root:" টেক্স্ট সেই স্টেটমেন্টের আগে আসছে।
এটি আমাদের অনুমতি দেয় যেকোনো সময় আমাদের প্রোগ্রাম কী করছে সেটি ট্র্যাক রাখতে। কারণ লগিং ইভেন্ট মডিউল abans দিকtał টেক্সট আমাদের প্রোগ্রামে যোগ করে, সহজে বোঝা যায় কোন টেক্সট আমাদের প্রোগ্রাম আউটপুট করেছে এবং কোন টেক্সট ডিবাগিং-এর জন্য।
এই কেসে, "[student] has failed their exam" মেসেজটি অত্যন্ত গুরুত্বপূর্ণ ইনফরমেশন যা আমাদের বলে দেয় প্রতিটি স্টুডেন্ট পাস বা ফেল করেছে কিনা। বাকি সব প্রোগ্রাম কীভাবে রান হচ্ছে সেটি দেখতে উপকারী, কিন্তু ইউজারের জন্য উপকারী নয়। অতএব, আমরা এই স্টেটমেন্টগুলো লগিং কল ব্যবহার করে ট্র্যাক করি।
ফাইলে লগ কীভাবে রাখবেন
লগিং মডিউল আপনাকে আপনার লগ একটি ফাইলে ট্র্যাক রাখতে দেয়। এটি উপকারী কারণ এর মানে আপনি আপনার পাইথন শেল বন্ধ করলে আপনার লগ হারাবেন না। আপনার প্রোগ্রাম একটি নির্দিষ্ট अवসরে কীভাবে এক্সিকিউট হয়েছে তার একটি পারমানেন্ট রেকর্ড থাকবে।
আপনাকে শুধু আপনার লগিং হ্যান্ডলার কনফিগারেশন লাইনে একটি filename আর্গুমেন্ট যোগ করতে হবে এবং আপনার প্রোগ্রাম অটোমেটিক্যালি লগগুলো ফাইলে সংরক্ষণ করবে:
import logging logging.basicConfig(level=logging.DEBUG, filename="student_data.log") ...
যখন আমরা আমাদের কোড রান করি, আমাদের লগগুলো আমাদের স্পেসিফাই করা ফাইলনেমে যোগ হবে। যদি আমরা "student_data.log" ফাইলটি খুলি, নিচের আউটপুট রিটার্ন হবে:
DEBUG:root:Calculating grade for Martin DEBUG:root:Calculating grade for Lewis DEBUG:root:Calculating grade for Terri DEBUG:root:Calculating grade for Bart DEBUG:root:Student grades have been calculated. Moving on to send emails to parents of students who have failed their exams.
লক্ষ্য করুন আমাদের ডিবাগ আউটপুটে শুধু সেসব মেসেজ আছে যেগুলো আমরা logging.debug() মেথড ব্যবহার করে লগ হিসেবে স্পেসিফাই করেছি। এটি উপকারী কারণ এটি প্রোগ্রাম আউটপুট - যেটি print() স্টেটমেন্ট দিয়ে ডিনোট করা হয় - ডিবাগ লগ থেকে আলাদা করতে সাহায্য করে।
আপনি একটি প্যারামিটারও যোগ করতে পারেন যেন ট্র্যাক রাখা যায় একটি এন্ট্রি কখন লগে যোগ হয়েছে। আমরা নিচের কোড ব্যবহার করে এটি করতে পারি:
logging.basicConfig(
level=logging.DEBUG,
filename="student_data.log",
format="%(asctime)s:%(levelname)s:%(message)s"
)
এই কোড আমাদের student_data.log ফাইলে নিচের কন্টেন্ট যোগ করে:
2020-06-18 08:27:50,123:DEBUG:Calculating grade for Martin 2020-06-18 08:27:50,123:DEBUG:Calculating grade for Lewis 2020-06-18 08:27:50,123:DEBUG:Calculating grade for Terri 2020-06-18 08:27:50,123:DEBUG:Calculating grade for Bart 2020-06-18 08:27:50,124:DEBUG:Student grades have been calculated. Moving on to send emails to parents of students who have failed their exams.
এখন আমরা জানি আমাদের কোডের প্রতিটি লাইন কখন এক্সিকিউট হয়েছে। একটি লম্বা প্রোগ্রামে, এই ডেটা বিশেষভাবে উপকারী হয় কারণ এটি আমাদের বুঝতে সাহায্য করে আমাদের কোড কোন ক্রমে রান হচ্ছে এবং আমাদের কোডের স্পিড।
উপসংহার
পাইথন লগিং মডিউল ডিবাগিং-এর জন্য một অবিশ্বাস্যভাবে উপকারী টুল। এটি আপনার প্রোগ্রামে রান হওয়া সকল ইভেন্ট ট্র্যাক রাখতে সাহায্য করে এবং সেই ইভেন্টগুলো একটি আলাদা ফাইল হিসেবে সংরক্ষণ করার অপশন দেয়। এটি আপনাকে আরও কার্যকরভাবে আপনার কোড ডিবাগ করতে এবং একটি প্রোগ্রাম রান করালে কী ইভেন্ট এক্সিকিউট হয়েছে সেটি বুঝতে সাহায্য করে।