আপনি সবেমাত্র একটি অ্যাপ্লিকেশন তৈরি করেছেন এবং লক্ষ্য করেছেন যে কিছু উদ্দেশ্য অনুযায়ী কাজ করছে না। আপনি এইমাত্র যে বৈশিষ্ট্যটি প্রয়োগ করেছেন তা এমনভাবে আচরণ করছে যা আপনি আশা করেননি। তোমার কি করা উচিত? আপনি কিভাবে এই সমস্যা মোকাবেলা করতে যাচ্ছেন?
সফ্টওয়্যার বিকাশে, প্রোগ্রামাররা তাদের সফ্টওয়্যার চলাকালীন ইভেন্টগুলি ট্র্যাক করতে লগিংয়ের উপর নির্ভর করে। এটি তাদের কার্যকরভাবে সমস্যার উৎস খুঁজে বের করতে সাহায্য করে যদি তারা উদ্ভূত হয়।
এই নির্দেশিকায়, আমরা কেন আপনার অ্যাপ্লিকেশন লগগুলি রাখা উচিত এবং কীভাবে আপনি আপনার প্রোগ্রামগুলিতে ইভেন্টগুলির উপর নজর রাখতে পাইথন লগিং মডিউল ব্যবহার করতে পারেন সে সম্পর্কে কথা বলতে যাচ্ছি৷
কেন আপনার লগ রাখা উচিত
লগ রাখা আপনাকে আরও রক্ষণাবেক্ষণযোগ্য কোড লিখতে সাহায্য করে। আপনি যখন লগিংয়ের মতো একটি মডিউল ব্যবহার করেন, তখন আপনি আপনার প্রোগ্রামগুলিতে ঘটে যাওয়া সমস্ত ইভেন্টের সঠিক রেকর্ড রাখতে পারেন। এর মানে আপনি দেখতে পাচ্ছেন কোন লাইনের কোড চলছে এবং কোনটি কার্যকর করতে ব্যর্থ হয়েছে।
পাইথনে, বিকাশকারীরা প্রায়শই print()
এর উপর নির্ভর করে বিবৃতি তাদের কোড লগ লগ. এটি একটি অভ্যাস - নতুন থেকে শুরু করে বিশেষজ্ঞরা - প্রত্যেকেই ব্যবহার করার জন্য এবং উপযুক্ত কারণ সহ দোষী৷ একটি print()
বিবৃতি ব্যবহার করা সহজ; ইহা সাধারণ.
যাইহোক, print()
বিবৃতি আপনার কোডের লগ রাখার সর্বোত্তম উপায় নয়। একটি জিনিসের জন্য, print()
স্টেটমেন্ট কনসোলে যেকোনো আউটপুট প্রিন্ট করতে ব্যবহার করা যেতে পারে। এর মানে হল কোন আউটপুটটি লগ হিসাবে সংরক্ষণ করা হবে এবং কোন আউটপুটটি আপনার প্রধান প্রোগ্রামের অংশ তা পার্থক্য করা বিভ্রান্তিকর হতে পারে। আরো কি, print()
বিবৃতি ডিফল্টরূপে আপনার লগ সংরক্ষণ করে না।
এখানেই পাইথন লগিং মডিউলটি কাজে আসে। লগিং সিস্টেম মডিউল ব্যবহার করে, আপনি আপনার কোডে কি ইভেন্ট চলছে তার আরও সঠিক রেকর্ড রাখতে পারেন। এটি আপনাকে আরও কার্যকরভাবে আপনার কোড ডিবাগ করতে এবং ত্রুটিগুলি ঠিক করতে সহায়তা করবে৷
৷কিভাবে পাইথন লগিং মডিউল ব্যবহার করবেন
এই টিউটোরিয়ালে, আমরা এমন একটি প্রোগ্রামে মৌলিক লগিং বার্তা যোগ করতে যাচ্ছি যা ছাত্রদের গ্রেডের তালিকার মধ্য দিয়ে যায় এবং তারা তাদের পরীক্ষায় ফেল করেছে বা পাস করেছে কিনা তা গণনা করে। নিম্নলিখিত কোড বিবেচনা করুন:
81% অংশগ্রহণকারী বলেছেন যে তারা বুটক্যাম্পে যোগ দেওয়ার পরে তাদের প্রযুক্তিগত কাজের সম্ভাবনা সম্পর্কে আরও আত্মবিশ্বাসী বোধ করেছেন। আজই একটি বুটক্যাম্পের সাথে মিলিত হন৷
৷গড় বুটক্যাম্প গ্র্যাড একটি বুটক্যাম্প শুরু করা থেকে শুরু করে তাদের প্রথম চাকরি খোঁজা পর্যন্ত ক্যারিয়ারের পরিবর্তনে ছয় মাসেরও কম সময় ব্যয় করেছে।
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 কনফিগারেশন ব্যবহার করে লগগুলির ট্র্যাক রাখতে যাচ্ছি। কারণ আমরা এই সময়ে সতর্কতা ট্র্যাক করতে আগ্রহী নই৷ রেফারেন্সের জন্য, এখানে লগিং বিকল্পগুলি আপনি নির্দিষ্ট করতে পারেন:
- ক্রিটিকাল:গুরুতর ত্রুটি প্রদর্শন করতে ব্যবহৃত হয় (logging.critical())
- ত্রুটি:একটি সমস্যা দেখাতে ব্যবহৃত হয় (logging.error())
- সতর্কতা:অপ্রত্যাশিত আচরণ দেখাতে ব্যবহৃত হয় (logging.warning())
- INFO:একটি প্রোগ্রাম কাজ করছে তা দেখানোর জন্য ব্যবহৃত হয় (logging.info())
- ডিবাগ:কোড ডিবাগ করতে ব্যবহৃত হয় (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.
আপনি দেখতে পাচ্ছেন যে আমাদের আউটপুটে আগের মতো একই বিষয়বস্তু রয়েছে। যাইহোক, "এর জন্য গ্রেড গণনা করা হচ্ছে" বার্তা এবং গ্রেডগুলি গণনা করা হয়েছে তা আমাদের জানানোর বার্তাটি ভিন্নভাবে দেখা যাচ্ছে। এই বিবৃতিগুলির আগে "DEBUG:root:" লেখাটি উপস্থিত হয়।
এটি আমাদের প্রোগ্রাম যে কোন সময়ে কি করছে তার ট্র্যাক রাখতে দেয়। লগিং ইভেন্ট মডিউল আমাদের প্রোগ্রামে পূর্বোক্ত টেক্সট যোগ করার কারণে, আমাদের প্রোগ্রাম দ্বারা কোন টেক্সট আউটপুট করা হয়েছে এবং কোন টেক্সট ডিবাগিংয়ের জন্য তা নির্ধারণ করা সহজ।
এই ক্ষেত্রে, "[ছাত্র]" তাদের পরীক্ষায় ব্যর্থ হয়েছে" এই বার্তাটি গুরুত্বপূর্ণ তথ্য যা আমাদের জানায় যে প্রতিটি শিক্ষার্থী তাদের পরীক্ষায় পাশ করেছে নাকি ব্যর্থ হয়েছে। আমাদের প্রোগ্রামটি কীভাবে চলছে তা দেখার জন্য অন্য সব কিছু দরকারী, তবে ব্যবহারকারীর জন্য উপযোগী নয়। তাই, আমরা লগিং কল ব্যবহার করে এই বিবৃতিগুলি ট্র্যাক করি৷
৷কিভাবে একটি ফাইলে লগ রাখা যায়
লগিং মডিউল আপনাকে একটি ফাইলে আপনার লগগুলির ট্র্যাক রাখতে দেয়৷ এটি দরকারী কারণ এর মানে হল যে আপনি একবার আপনার পাইথন শেল বন্ধ করলে আপনি আপনার লগ হারাবেন না। একটি নির্দিষ্ট অনুষ্ঠানে আপনার প্রোগ্রামটি কীভাবে কার্যকর হয়েছে তার একটি স্থায়ী রেকর্ড আপনার কাছে থাকবে।
আপনাকে যা করতে হবে তা হল আপনার লগিং হ্যান্ডলার কনফিগারেশন লাইনে একটি ফাইলের নাম আর্গুমেন্ট অন্তর্ভুক্ত করা এবং আপনার প্রোগ্রাম স্বয়ংক্রিয়ভাবে একটি ফাইলে লগ সংরক্ষণ করবে:
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.
এখন আমরা জানি কখন আমাদের কোডের প্রতিটি লাইন নির্বাহ করা হয়েছিল। একটি দীর্ঘ প্রোগ্রামে, এই ডেটা বিশেষভাবে উপযোগী হবে কারণ এটি আমাদের কোড কোন ক্রমে চলছে এবং আমাদের কোডের গতি বুঝতে সাহায্য করবে৷
উপসংহার
পাইথন লগিং মডিউল ডিবাগ করার জন্য একটি অবিশ্বাস্যভাবে দরকারী টুল। এটি আপনাকে আপনার প্রোগ্রামে চলা সমস্ত ইভেন্টগুলি ট্র্যাক করতে সহায়তা করে এবং সেই ইভেন্টগুলিকে একটি পৃথক ফাইল হিসাবে সংরক্ষণ করার বিকল্প দেয়৷ এটি আপনাকে আরও কার্যকরভাবে আপনার কোড ডিবাগ করতে এবং আপনি যখন একটি প্রোগ্রাম চালান তখন কী ইভেন্টগুলি কার্যকর হয়েছে তা বুঝতে সাহায্য করবে৷