$lang['tuto'] = "টিউটোরিয়াল"; ?> ত্রুটির সময়

ত্রুটির সময় সাম্প্রতিক পাইথন লগিং বার্তাগুলি কীভাবে পুনরুদ্ধার করবেন

Temp mail SuperHeros
ত্রুটির সময় সাম্প্রতিক পাইথন লগিং বার্তাগুলি কীভাবে পুনরুদ্ধার করবেন
ত্রুটির সময় সাম্প্রতিক পাইথন লগিং বার্তাগুলি কীভাবে পুনরুদ্ধার করবেন

ত্রুটি পরিচালনার জন্য পাইথন লগিং অপ্টিমাইজ করা

পাইথনে লগ ইন করা ইভেন্ট ট্র্যাকিং এবং একটি প্রোগ্রাম কার্যকর করার সময় সমস্যা নির্ণয়ের জন্য অপরিহার্য। যাইহোক, নির্দিষ্ট মডিউলগুলি অতিরিক্ত ট্রেস তথ্য তৈরি করতে পারে, যা লগগুলিকে বিশৃঙ্খল করতে পারে। এই ধরনের ক্ষেত্রে, একটি উপযুক্ত লগিং স্তর সেট করা, যেমন ত্রুটি, অপ্রয়োজনীয় বিবরণ ফিল্টার আউট সাহায্য করতে পারেন.

এমন পরিস্থিতিতে যেখানে একটি মডিউল অত্যধিক লগ তৈরি করে, কিন্তু অন্য একটি মডিউলকে কল করার ক্ষেত্রে ত্রুটি দেখা দেয়, সাম্প্রতিক লগ বার্তাগুলি অ্যাক্সেস করা অত্যন্ত গুরুত্বপূর্ণ হয়ে ওঠে। একটি ত্রুটির মূল কারণ ট্রেসিং করার সময় এটি প্রায়ই হয়। অতিরিক্ত লগগুলি উপেক্ষা করা এবং গুরুত্বপূর্ণগুলি ক্যাপচার করার মধ্যে একটি ভারসাম্য প্রয়োজন৷

লাইব্রেরি পছন্দ spdlog C++-এ একটি রিং বাফারের মাধ্যমে ব্যাকট্র্যাকিংয়ের জন্য অন্তর্নির্মিত সমর্থন রয়েছে, যা ডেভেলপারদের সাম্প্রতিক লগগুলি পর্যালোচনা করতে দেয় যা একটি ত্রুটির দিকে নিয়ে যায়। পাইথনের লগিং লাইব্রেরি, তবে, বাক্সের বাইরে এই বৈশিষ্ট্যটি অফার করে না, কীভাবে একটি অনুরূপ প্রক্রিয়া বাস্তবায়ন করা যায় সে প্রশ্ন উত্থাপন করে।

এই নিবন্ধটি অন্বেষণ করে যে কিভাবে আপনি পাইথনের লগিং সিস্টেমটিকে সাম্প্রতিক লগ বার্তাগুলি ক্যাপচার করার জন্য খাপ খাইয়ে নিতে পারেন যখন একটি ত্রুটি ঘটে, যা থেকে গুরুত্বপূর্ণ তথ্য নিশ্চিত করে পরীক্ষক মডিউলটি ট্রেস ডেটা সহ লগগুলিকে অপ্রতিরোধ্য না করে নির্ণয়ের জন্য উপলব্ধ।

আদেশ ব্যবহারের উদাহরণ
deque(maxlen=capacity) থেকে একটি ডবল শেষ সারি সংগ্রহ মডিউল, এখানে একটি রিং বাফার তৈরি করতে ব্যবহৃত হয় যা একটি নির্দিষ্ট সংখ্যক লগ বার্তা ধারণ করে, যখন নতুন বার্তা আসে তখন পুরানোগুলিকে বাতিল করে। সাম্প্রতিক বার্তাগুলির একটি লগ দক্ষতার সাথে বজায় রাখার জন্য এটি একটি গুরুত্বপূর্ণ কাঠামো।
emit(self, record) কাস্টম লগিং হ্যান্ডলারগুলিতে ওভাররাইড করা একটি পদ্ধতি প্রতিটি লগ বার্তা তৈরি হওয়ার সাথে সাথে প্রক্রিয়া করার জন্য। এটি লগ বার্তা যোগ করার জন্য দায়ী deque আমাদের কাস্টম রিং বাফার সমাধান.
logging.handlers.MemoryHandler এটি একটি লগিং হ্যান্ডলার যা মেমরিতে লগ বার্তাগুলিকে বাফার করে। একটি নির্দিষ্ট লগ স্তরে পৌঁছে গেলে এটি তাদের ফ্লাশ করে (এই ক্ষেত্রে, ত্রুটি) এটি লগ বার্তাগুলির আউটপুট স্থগিত করার জন্য দরকারী যতক্ষণ না একটি আরও গুরুতর ঘটনা ঘটে।
flushLevel=logging.ERROR একটি যুক্তি পাস মেমরি হ্যান্ডলার লগ লেভেল নির্দিষ্ট করতে যা চূড়ান্ত গন্তব্যে (যেমন কনসোল বা ফাইল) বাফার করা বার্তাগুলির ফ্লাশিং ট্রিগার করে। এটি নিশ্চিত করে যে কোনো ত্রুটি ঘটলেই আমরা শুধুমাত্র ডিবাগ লগ দেখতে পাব।
setTarget(stream_handler) মধ্যে মেমরি হ্যান্ডলার পদ্ধতিতে, এই পদ্ধতিটি লক্ষ্য হ্যান্ডলার সেট করে যেখানে বাফার করা লগগুলি ফ্লাশ করা হবে। এই ক্ষেত্রে, লক্ষ্য ক স্ট্রিমহ্যান্ডলার, যা কনসোলে লগ আউটপুট করে।
format(record) লগিং মডিউলের ফর্ম্যাটিং সিস্টেমের অংশ। কাস্টম হ্যান্ডলারে, এই পদ্ধতিটি লগ রেকর্ডকে রিং বাফারে যোগ করার আগে ফর্ম্যাট করে, যাতে সামঞ্জস্যপূর্ণ এবং পঠনযোগ্য আউটপুট পাওয়া যায়।
logger.addHandler(buffer_handler) লগারের সাথে কাস্টম বা মেমরি হ্যান্ডলার সংযুক্ত করে যাতে এটি হ্যান্ডলারের কনফিগারেশন (যেমন, বাফারিং, সার্কুলার স্টোরেজ, ইত্যাদি) অনুযায়ী লগ বার্তাগুলিকে প্রক্রিয়া করে। এই কমান্ডটি নিশ্চিত করে যে আমাদের বাফার লগিংয়ের জন্য ব্যবহার করা হয়েছে।
logger.setLevel(logging.DEBUG) লগিং বার্তাগুলির জন্য সর্বনিম্ন তীব্রতা স্তর সংজ্ঞায়িত করে৷ উদাহরণগুলিতে, এটি সেট করা আছে ডিবাগ, নিশ্চিত করে যে সমস্ত বার্তা, কম গুরুতর সহ, ক্যাপচার করা হয়েছে এবং পরবর্তী পরিদর্শনের জন্য বাফার করা হয়েছে৷

পাইথনে ত্রুটির সাম্প্রতিক লগগুলি দক্ষতার সাথে ক্যাপচার করা

উপস্থাপিত প্রথম স্ক্রিপ্টটি একটি সহ একটি কাস্টম লগিং হ্যান্ডলার ব্যবহার করে deque পাইথন থেকে গঠন সংগ্রহ মডিউল এই ডেক একটি রিং বাফার হিসাবে কাজ করে, একটি নির্দিষ্ট সংখ্যক সাম্প্রতিক লগ বার্তা ধারণ করে। হ্যান্ডলার ওভাররাইড করে নির্গত পদ্ধতি, যা প্রতিবার লগ তৈরি করার সময় বলা হয়। এই পদ্ধতিতে, প্রতিটি লগ বার্তা ফরম্যাট করা হয় এবং তারপর deque এ যুক্ত করা হয়। কারণ deque-এর সর্বাধিক দৈর্ঘ্য রয়েছে, এটি ধারণক্ষমতায় পৌঁছালে এটি স্বয়ংক্রিয়ভাবে পুরানো বার্তাগুলিকে বাতিল করে দেয়। এই সমাধানটি দক্ষতার সাথে সাম্প্রতিক লগগুলিকে ট্র্যাক করে, নিশ্চিত করে যে চেকার মডিউল থেকে অতিরিক্ত ডিবাগ বার্তাগুলি লগ আউটপুটকে অভিভূত করে না কিন্তু রানার মডিউলে একটি ত্রুটি ঘটলে তা এখনও উপলব্ধ থাকে।

রানার মডিউলে একটি ত্রুটি সনাক্ত করা হলে, স্ক্রিপ্ট একটি কাস্টম পদ্ধতি কল করে get_logs ডেকে সংরক্ষিত লগ বার্তাগুলি পুনরুদ্ধার করতে। এটি আপনাকে পরীক্ষকের লগ বার্তাগুলি পরিদর্শন করতে দেয় যা ত্রুটির আগে ছিল। এই পদ্ধতির পিছনে ধারণা হল যে লগ বার্তাগুলি লগ ভারবোসিটি এবং ইউটিলিটির মধ্যে ভারসাম্য বজায় রেখে সমস্যা সমাধানের জন্য গুরুত্বপূর্ণ প্রেক্ষাপট প্রদান করে। এটি পাইথনের মতো একটি বৃত্তাকার লগ বাফার তৈরি করার একটি সহজ এবং কার্যকর উপায় ব্যাকট্রেস বৈশিষ্ট্য C++ এর spdlog লাইব্রেরিতে পাওয়া যায়।

দ্বিতীয় সমাধান বিল্ট-ইন ব্যবহার করে মেমরি হ্যান্ডলার পাইথনের লগিং মডিউল থেকে। মেমরিহ্যান্ডলার মেমরিতে লগ বার্তাগুলিকে বাফার করার মাধ্যমে এবং একটি নির্দিষ্ট লগ স্তরের সম্মুখীন হলেই সেগুলি ফ্লাশ করে কাজ করে, যেমন একটি ত্রুটি. এই ক্ষেত্রে, হ্যান্ডলারকে 10টি পর্যন্ত লগ বার্তা বাফার করার জন্য কনফিগার করা হয়েছে এবং একটি ত্রুটি ঘটলে সেগুলিকে ফ্লাশ করার জন্য। এই পদ্ধতিটি রিং বাফার কৌশলের অনুরূপ কিন্তু পাইথনের বিদ্যমান লগিং অবকাঠামো ব্যবহার করে, যা বাস্তবায়নকে সহজ করে। মেমরিহ্যান্ডলার এমন পরিস্থিতিগুলির জন্য আদর্শ যেখানে আপনি লগ বার্তাগুলির একটি স্ন্যাপশট ক্যাপচার করতে চান যা স্বাভাবিক ক্রিয়াকলাপের সময় লগগুলিকে বিশৃঙ্খল না করে একটি ত্রুটির দিকে নিয়ে যায়৷

উভয় সমাধানই কর্মক্ষমতার জন্য অপ্টিমাইজ করা হয়েছে এবং মেমরি খরচ সীমিত করার জন্য ডিজাইন করা হয়েছে। মেমরিতে সংরক্ষিত লগের সংখ্যা সীমাবদ্ধ করে এবং সমালোচনামূলক ইভেন্টের সময় শুধুমাত্র বাফার ফ্লাশ করে, তারা পরিষ্কার, পরিচালনাযোগ্য লগগুলি বজায় রাখতে সহায়তা করে। এটি ডেভেলপারদের প্রচুর পরিমাণে অপ্রয়োজনীয় তথ্য অনুসন্ধান করার পরিবর্তে প্রকৃত ত্রুটি ডিবাগ করার দিকে মনোনিবেশ করতে দেয়। প্রতিটি স্ক্রিপ্ট সহজেই বিদ্যমান পাইথন লগিং কনফিগারেশনে একত্রিত করা যেতে পারে শুধুমাত্র প্রশ্নে থাকা লগারে কাস্টম বা মেমরি হ্যান্ডলার যোগ করে, এবং উভয়ই বিভিন্ন লগ ফরম্যাট এবং স্তরে মানিয়ে নেওয়ার জন্য যথেষ্ট নমনীয়।

একটি কাস্টম রিং বাফারের মাধ্যমে ত্রুটির উপর সাম্প্রতিক পাইথন লগিং বার্তাগুলি ক্যাপচার করা

পাইথন লগিং মডিউল - কাস্টম রিং বাফার বাস্তবায়ন

# Approach 1: Using a custom handler with a deque (ring buffer) to store recent logs
import logging
from collections import deque
# Custom log handler to store recent log messages
class BufferingHandler(logging.Handler):
    def __init__(self, capacity):
        super().__init__()
        self.log_buffer = deque(maxlen=capacity)  # Circular buffer
    def emit(self, record):
        self.log_buffer.append(self.format(record))  # Store formatted log messages
    def get_logs(self):
        return list(self.log_buffer)  # Retrieve recent log messages
# Configure logging with custom handler
logger = logging.getLogger('checker')
buffer_handler = BufferingHandler(capacity=10)
logger.addHandler(buffer_handler)
logger.setLevel(logging.DEBUG)
# Example log generation
for i in range(20):
    logger.debug(f"Debug message {i}")
# Simulate an error in runner and print the last few log messages
try:
    1 / 0  # Simulate error
except ZeroDivisionError:
    print("Error occurred, recent log messages:")
    for log in buffer_handler.get_logs():
        print(log)

পাইথনে বাফারড লগিংয়ের জন্য মেমরিহ্যান্ডলার ব্যবহার করা

পাইথন লগিং মডিউল - মেমরিহ্যান্ডলার অ্যাপ্রোচ

# Approach 2: Using MemoryHandler to buffer log messages
import logging
# MemoryHandler buffers log records in memory and flushes them when conditions are met
memory_handler = logging.handlers.MemoryHandler(capacity=10, flushLevel=logging.ERROR)
# Configuring logging with a stream handler for output
stream_handler = logging.StreamHandler()
formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s')
stream_handler.setFormatter(formatter)
# Attach the memory handler and stream handler to logger
logger = logging.getLogger('checker')
logger.setLevel(logging.DEBUG)
memory_handler.setTarget(stream_handler)
logger.addHandler(memory_handler)
# Generating some debug messages
for i in range(15):
    logger.debug(f"Debug message {i}")
# Simulate an error that will trigger the buffer to flush
logger.error("An error occurred in runner")
# The memory handler will now flush its buffer and show the last 10 messages

পাইথনে লগ বার্তা ক্যাপচার করার বিকল্প উপায় অন্বেষণ করা হচ্ছে

পাইথনে সাম্প্রতিক লগ বার্তাগুলি ক্যাপচার করার জন্য আরেকটি পদ্ধতির মধ্যে একটি তৃতীয় পক্ষের লাইব্রেরি ব্যবহার করা জড়িত লগুর. পাইথনের বিল্ট-ইন লগিং মডিউলের বিপরীতে, Loguru একটি আরও নমনীয় এবং ব্যবহারকারী-বান্ধব ইন্টারফেস অফার করে। এতে লগ ঘোরানো, লগ লেভেল ফিল্টার করা এবং বিভিন্ন ফরম্যাটে লগ ক্যাপচার করার জন্য অন্তর্নির্মিত সমর্থন অন্তর্ভুক্ত রয়েছে। এই লাইব্রেরিটি বিশেষভাবে উপযোগী হতে পারে যখন এমন অ্যাপ্লিকেশনগুলির সাথে কাজ করে যেগুলি অতিরিক্ত লগ তৈরি করে, কারণ এটি লগ পরিচালনাকে সহজ করে এবং নিশ্চিত করে যে ত্রুটি পরিচালনার সময় গুরুত্বপূর্ণ বার্তাগুলি মিস না হয়৷

Loguru লগ সিঙ্ক সেট আপ করার অনুমতি দেয়, যা মেমরি, ফাইল বা এমনকি বাহ্যিক পরিষেবাগুলিতে লগ সংরক্ষণ করতে কাস্টমাইজ করা যেতে পারে। আপনি একটি কাস্টম সিঙ্ক ব্যবহার করে একটি অস্থায়ী ইন-মেমরি বাফার তৈরি করতে পারেন, যা একটি ত্রুটির সম্মুখীন হলে ফ্লাশ করা যেতে পারে। এটি Loguru কে তাদের জন্য একটি শক্তিশালী বিকল্প করে তোলে যারা স্ট্যান্ডার্ড লগিং লাইব্রেরির মতো হ্যান্ডলারগুলিকে ম্যানুয়ালি কনফিগার না করে তাদের লগিং সিস্টেমের উপর আরও নিয়ন্ত্রণ করতে চান।

Loguru এর আরেকটি সুবিধা হল যে এটি বিদ্যমান লগিং সিস্টেমের সাথে সহজে একীকরণের অনুমতি দেয়, যার অর্থ আপনি আপনার সম্পূর্ণ লগিং সেটআপ ওভারহল না করেই Loguru-এ স্যুইচ করতে পারেন। এটি বিশেষত সহায়ক হতে পারে যখন জটিল অ্যাপ্লিকেশনগুলির সাথে কাজ করে যেখানে কর্মক্ষমতা এবং লগ পরিচালনা অত্যন্ত গুরুত্বপূর্ণ৷ শেষ পর্যন্ত, যদিও পাইথনের লগিং মডিউল বেশিরভাগ ব্যবহারের ক্ষেত্রে যথেষ্ট, Loguru-এর মতো লাইব্রেরি অন্বেষণ করা লগ বার্তাগুলি ক্যাপচার এবং কার্যকরভাবে পরিচালনা করার জন্য অতিরিক্ত নমনীয়তা এবং ব্যবহারের সহজতা প্রদান করে।

পাইথনে লগ বার্তা ক্যাপচার করার বিষয়ে সাধারণ প্রশ্ন

  1. আমি কিভাবে লগ বার্তা ভারবোসিটি সীমাবদ্ধ করতে পারি?
  2. ব্যবহার করুন logger.setLevel(logging.ERROR) ডিবাগ এবং তথ্যের মতো নিম্ন তীব্রতার বার্তাগুলিকে দমন করতে, শুধুমাত্র ত্রুটিগুলি দেখায়৷
  3. মেমরিতে সাম্প্রতিক লগ সংরক্ষণ করার সেরা উপায় কি?
  4. deque(maxlen=capacity) প্রাচীনতম এন্ট্রিগুলি স্বয়ংক্রিয়ভাবে বাতিল করে সাম্প্রতিক লগ বার্তাগুলি সংরক্ষণ করতে ব্যবহার করা যেতে পারে।
  5. একটি ত্রুটি ঘটলে আমি কীভাবে বাফারযুক্ত লগগুলি ফ্লাশ করব?
  6. সঙ্গে MemoryHandler, লগগুলি মেমরিতে সংরক্ষণ করা হয় এবং একটি নির্দিষ্ট লগ স্তর ট্রিগার করা হলে ফ্লাশ করা হয়, যেমন flushLevel=logging.ERROR.
  7. Python এর লগিং এর উপর Loguru ব্যবহার করার সুবিধা কি?
  8. Loguru কম বয়লারপ্লেট কোড সহ লগ সেটআপ সহজ করে এবং সহজ ফিল্টারিং এবং লগ ঘোরানোর মত আরও স্বজ্ঞাত বৈশিষ্ট্য প্রদান করে।
  9. আমি কি বিদ্যমান লগিং কনফিগারেশনের সাথে Loguru সংহত করতে পারি?
  10. হ্যাঁ, Loguru ডিফল্ট লগিং হ্যান্ডলার প্রতিস্থাপন করে পাইথনের অন্তর্নির্মিত লগিং সিস্টেমের সাথে মসৃণভাবে সংহত করতে পারে।

লগ ক্যাপচার টেকনিকের সারসংক্ষেপ

ত্রুটি-প্রবণ পরিস্থিতিতে, পাইথনের লগিং মডিউলটি দক্ষতার সাথে ব্যবহার করা আউটপুট বিশৃঙ্খল না হয়ে সাম্প্রতিক লগ বার্তাগুলি ক্যাপচার করতে সহায়তা করে। কাস্টম হ্যান্ডলার যেমন deque এবং মেমরি হ্যান্ডলার একটি ত্রুটি ঘটলে গুরুত্বপূর্ণ বার্তা সংরক্ষণ করার বহুমুখী উপায় প্রদান করে।

এই সমাধানগুলি উচ্চ ভারবোসিটি সহ মডিউলগুলিতে ত্রুটিগুলি ডিবাগ করার জন্য ব্যবহারিক, ডেভেলপারদের প্রয়োজনীয় লগ ডেটা উপলব্ধ রয়েছে তা নিশ্চিত করে৷ থার্ড-পার্টি টুলসকে একীভূত করে যেমন লগুর, এমনকি আরও নমনীয়তা উপলব্ধ, ন্যূনতম কনফিগারেশনের সাথে উন্নত লগ পরিচালনার প্রস্তাব।

পাইথন লগিং সলিউশনের জন্য উৎস এবং রেফারেন্স
  1. পাইথনের ব্যাখ্যা deque বাস্তবায়ন এবং লগিং এর ব্যবহার: পাইথন ডকুমেন্টেশন - সংগ্রহ
  2. পাইথন এর বিস্তারিত লগিং লাইব্রেরি এবং মেমরি হ্যান্ডলার: পাইথন ডকুমেন্টেশন - লগিং
  3. এর ওভারভিউ লগুর একটি উন্নত পাইথন লগিং বিকল্প হিসাবে: Loguru ডকুমেন্টেশন
  4. তুলনা এবং ব্যবহার spdlog ব্যাকট্রেস সমর্থনের জন্য C++ এ: spdlog GitHub সংগ্রহস্থল