كيفية استرداد رسائل تسجيل Python الأخيرة أثناء حدوث الأخطاء

Temp mail SuperHeros
كيفية استرداد رسائل تسجيل Python الأخيرة أثناء حدوث الأخطاء
كيفية استرداد رسائل تسجيل Python الأخيرة أثناء حدوث الأخطاء

تحسين تسجيل بايثون لمعالجة الأخطاء

يعد تسجيل الدخول إلى Python أمرًا ضروريًا لتتبع الأحداث وتشخيص المشكلات أثناء تنفيذ البرنامج. ومع ذلك، يمكن أن تنتج بعض الوحدات النمطية معلومات تتبع زائدة، مما قد يؤدي إلى فوضى في السجلات. في مثل هذه الحالات، قم بتعيين مستوى التسجيل المناسب، مثل خطأ، يمكن أن يساعد في تصفية التفاصيل غير الضرورية.

في السيناريوهات التي تقوم فيها إحدى الوحدات بإنشاء سجلات زائدة، ولكن تحدث أخطاء في وحدة أخرى تستدعيها، يصبح من الضروري الوصول إلى رسائل السجل الحديثة. هذا هو الحال غالبًا عند تتبع السبب الجذري للخطأ. هناك حاجة إلى التوازن بين تجاهل السجلات الزائدة والتقاط السجلات المهمة.

المكتبات مثل com.spdlog في لغة C++، يوجد دعم مدمج للتراجع عبر المخزن المؤقت الحلقي، مما يسمح للمطورين بمراجعة السجلات الحديثة التي تؤدي إلى حدوث خطأ. بايثون تسجيل ومع ذلك، لا تقدم المكتبة هذه الميزة خارج الصندوق، مما يثير التساؤل حول كيفية تنفيذ آلية مماثلة.

تستكشف هذه المقالة كيف يمكنك تكييف نظام التسجيل الخاص بـ Python لالتقاط رسائل السجل الحديثة عند حدوث خطأ، مما يضمن الحصول على معلومات مهمة من فاحص الوحدة متاحة للتشخيص دون إغراق السجلات ببيانات التتبع.

يأمر مثال للاستخدام
deque(maxlen=capacity) قائمة انتظار مزدوجة النهاية من مجموعات الوحدة النمطية المستخدمة هنا لإنشاء مخزن مؤقت للحلقة يحتوي على عدد ثابت من رسائل السجل، مع تجاهل الرسائل الأقدم عند وصول رسائل جديدة. يعد هذا هيكلًا مهمًا للحفاظ على سجل الرسائل الحديثة بكفاءة.
emit(self, record) طريقة يتم تجاوزها في معالجات التسجيل المخصصة لمعالجة كل رسالة سجل عند إنشائها. وهو مسؤول عن إضافة رسالة السجل إلى com.deque في حل المخزن المؤقت الدائري المخصص لدينا.
logging.handlers.MemoryHandler هذا هو معالج التسجيل الذي يقوم بتخزين رسائل السجل مؤقتًا في الذاكرة. يقوم بمسحها عند الوصول إلى مستوى سجل معين (في هذه الحالة، خطأ). من المفيد تأجيل إخراج رسائل السجل حتى وقوع حدث أكثر خطورة.
flushLevel=logging.ERROR حجة مرت إلى معالج الذاكرة لتحديد مستوى السجل الذي يقوم بتشغيل مسح الرسائل المخزنة مؤقتًا إلى الوجهة النهائية (مثل وحدة التحكم أو الملف). فهو يضمن أننا لا نرى سجلات التصحيح إلا في حالة حدوث خطأ.
setTarget(stream_handler) في معالج الذاكرة النهج، تقوم هذه الطريقة بتعيين المعالج الهدف الذي سيتم مسح السجلات المخزنة إليه. في هذه الحالة، الهدف هو أ StreamHandler، الذي يقوم بإخراج السجلات إلى وحدة التحكم.
format(record) جزء من نظام تنسيق وحدة التسجيل. في المعالج المخصص، تقوم هذه الطريقة بتنسيق سجل السجل قبل إضافته إلى المخزن المؤقت للحلقة، مما يسمح بمخرجات متسقة وقابلة للقراءة.
logger.addHandler(buffer_handler) قم بإرفاق المعالج المخصص أو معالج الذاكرة بالمسجل بحيث يقوم بمعالجة رسائل السجل وفقًا لتكوين المعالج (على سبيل المثال، التخزين المؤقت، والتخزين الدائري، وما إلى ذلك). يضمن هذا الأمر استخدام المخزن المؤقت الخاص بنا للتسجيل.
logger.setLevel(logging.DEBUG) يحدد الحد الأدنى لمستوى الخطورة لتسجيل الرسائل. في الأمثلة، تم تعيينه على تصحيح، مما يضمن التقاط جميع الرسائل، بما في ذلك الرسائل الأقل خطورة، وتخزينها مؤقتًا لفحصها لاحقًا.

التقاط السجلات الحديثة للأخطاء بكفاءة في بايثون

يستخدم البرنامج النصي الأول المقدم معالج تسجيل مخصص مع ملف com.deque هيكل من بايثون مجموعات وحدة. يعمل هذا deque كمخزن مؤقت للحلقة، حيث يحتوي على عدد ثابت من رسائل السجل الحديثة. المعالج يتجاوز تنبعث الطريقة، والتي يتم استدعاؤها في كل مرة يتم فيها إنشاء سجل. في هذه الطريقة، يتم تنسيق كل رسالة سجل ثم إلحاقها بـ deque. نظرًا لأن deque له حد أقصى للطول، فإنه يتجاهل الرسائل الأقدم تلقائيًا عندما يصل إلى السعة القصوى. يتتبع هذا الحل بكفاءة أحدث السجلات، مما يضمن أن رسائل التصحيح المفرطة من وحدة المدقق لا تطغى على مخرجات السجل ولكنها تظل متاحة عند حدوث خطأ في وحدة التشغيل.

عند اكتشاف خطأ في وحدة العداء، يستدعي البرنامج النصي طريقة مخصصة get_logs لاسترداد رسائل السجل المخزنة في deque. يسمح لك هذا بفحص رسائل السجل من المدقق التي سبقت الخطأ مباشرة. الفكرة وراء هذا الأسلوب هي أن رسائل السجل توفر سياقًا مهمًا لاستكشاف الأخطاء وإصلاحها مع الحفاظ على التوازن بين إسهاب السجل والفائدة. هذه طريقة بسيطة وفعالة لإنشاء مخزن مؤقت للسجل الدائري في بايثون، على غرار تتبع خلفي الميزة الموجودة في مكتبة spdlog الخاصة بـ C++.

الحل الثاني يستخدم المدمج في معالج الذاكرة من وحدة التسجيل في بايثون. يعمل MemoryHandler عن طريق تخزين رسائل السجل مؤقتًا في الذاكرة ومسحها فقط عند مواجهة مستوى سجل محدد، مثل خطأ. في هذه الحالة، يتم تكوين المعالج لتخزين ما يصل إلى 10 رسائل سجل مؤقتًا ومسحها عند حدوث خطأ. يشبه هذا الأسلوب تقنية المخزن المؤقت الحلقي ولكنه يستخدم البنية الأساسية للتسجيل الموجودة في Python، مما يبسط عملية التنفيذ. يعد MemoryHandler مثاليًا للسيناريوهات التي تريد فيها التقاط لقطة من رسائل السجل التي تؤدي إلى حدوث خطأ دون ازدحام السجلات أثناء العمليات العادية.

تم تحسين كلا الحلين من أجل الأداء ومصممين للحد من استهلاك الذاكرة. من خلال تقييد عدد السجلات المخزنة في الذاكرة ومسح المخزن المؤقت فقط أثناء الأحداث الهامة، فإنها تساعد في الحفاظ على سجلات نظيفة ويمكن التحكم فيها. يتيح ذلك للمطورين التركيز على تصحيح الخطأ الفعلي بدلاً من غربلة كميات هائلة من المعلومات غير الضرورية. يمكن دمج كل برنامج نصي بسهولة في تكوينات تسجيل Python الموجودة ببساطة عن طريق إضافة معالجات مخصصة أو معالجات ذاكرة إلى المسجل المعني، وكلاهما مرن بما يكفي للتكيف مع تنسيقات ومستويات السجل المختلفة.

التقاط رسائل تسجيل Python الحديثة عند حدوث خطأ باستخدام مخزن مؤقت حلقي مخصص

وحدة تسجيل Python - تنفيذ المخزن المؤقت الدائري المخصص

# 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)

استخدام MemoryHandler للتسجيل المخزن مؤقتًا في Python

وحدة تسجيل بايثون - نهج MemoryHandler

# 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

استكشاف طرق بديلة لالتقاط رسائل السجل في بايثون

هناك طريقة أخرى لالتقاط رسائل السجل الحديثة في Python تتضمن استخدام مكتبة خارجية مثل لوجورو. على عكس وحدة التسجيل المضمنة في Python، يوفر Loguru واجهة أكثر مرونة وسهولة في الاستخدام. يتضمن دعمًا مدمجًا لتدوير السجلات وتصفية مستويات السجل والتقاط السجلات بتنسيقات مختلفة. يمكن أن تكون هذه المكتبة مفيدة بشكل خاص عند العمل مع التطبيقات التي تولد سجلات زائدة، لأنها تعمل على تبسيط إدارة السجل مع ضمان عدم تفويت الرسائل المهمة أثناء معالجة الأخطاء.

يسمح Loguru بإعداد أحواض السجلات، والتي يمكن تخصيصها لتخزين السجلات في الذاكرة أو الملفات أو حتى الخدمات الخارجية. يمكنك إنشاء مخزن مؤقت في الذاكرة باستخدام مخزن مخصص، والذي يمكن بعد ذلك مسحه عند مواجهة خطأ. وهذا يجعل Loguru بديلاً قويًا لأولئك الذين يريدون مزيدًا من التحكم في نظام التسجيل الخاص بهم دون تكوين المعالجات يدويًا كما هو الحال في مكتبة التسجيل القياسية.

من المزايا الأخرى لـ Loguru أنه يسمح بالتكامل السهل مع أنظمة التسجيل الحالية، مما يعني أنه يمكنك التبديل إلى Loguru دون إصلاح إعداد التسجيل بالكامل. يمكن أن يكون هذا مفيدًا بشكل خاص عند التعامل مع التطبيقات المعقدة حيث يكون الأداء وإدارة السجل أمرًا بالغ الأهمية. في النهاية، في حين أن وحدة التسجيل في Python كافية لمعظم حالات الاستخدام، فإن استكشاف مكتبات مثل Loguru يوفر مرونة إضافية وسهولة في الاستخدام لالتقاط رسائل السجل وإدارتها بفعالية.

أسئلة شائعة حول التقاط رسائل السجل في بايثون

  1. كيف يمكنني الحد من إسهاب رسالة السجل؟
  2. يستخدم logger.setLevel(logging.ERROR) لمنع الرسائل الأقل خطورة مثل التصحيح والمعلومات، وإظهار الأخطاء فقط.
  3. ما هي أفضل طريقة لتخزين السجلات الأخيرة في الذاكرة؟
  4. أ deque(maxlen=capacity) يمكن استخدامه لتخزين رسائل السجل الحديثة، مع التخلص التلقائي من الإدخالات الأقدم.
  5. كيف أقوم بمسح السجلات المخزنة مؤقتًا عند حدوث خطأ؟
  6. مع MemoryHandler، يتم تخزين السجلات في الذاكرة ويتم مسحها عند تشغيل مستوى سجل معين، مثل flushLevel=logging.ERROR.
  7. ما هي ميزة استخدام Loguru على تسجيل Python؟
  8. Loguru يبسط عملية إعداد السجل باستخدام كود معياري أقل ويوفر ميزات أكثر سهولة مثل تصفية السجلات وتدويرها بشكل أسهل.
  9. هل يمكنني دمج Loguru مع تكوينات التسجيل الحالية؟
  10. نعم، يمكن لـ Loguru التكامل بسلاسة مع نظام التسجيل المدمج في Python عن طريق استبدال معالج التسجيل الافتراضي.

تلخيص تقنيات التقاط السجل

في المواقف المعرضة للأخطاء، يساعد استخدام وحدة التسجيل في Python بكفاءة على التقاط رسائل السجل الحديثة دون تشويش المخرجات. معالجات مخصصة مثل com.deque و معالج الذاكرة توفير طرق متعددة الاستخدامات لتخزين الرسائل المهمة عند حدوث خطأ.

تعتبر هذه الحلول عملية لتصحيح الأخطاء في الوحدات ذات الإسهاب العالي، مما يضمن توفر بيانات السجل الضرورية للمطورين. من خلال دمج أدوات الطرف الثالث مثل لوجورو، يتوفر المزيد من المرونة، مما يوفر إدارة متقدمة للسجل بأقل قدر من التكوين.

المصادر والمراجع لحلول تسجيل بايثون
  1. شرح بايثون com.deque التنفيذ واستخدامه في التسجيل: توثيق بايثون – المجموعات
  2. تفاصيل عن بايثون تسجيل المكتبة ومعالج الذاكرة: توثيق بايثون - التسجيل
  3. نظرة عامة على لوجورو كبديل متقدم لتسجيل Python: وثائق لوجورو
  4. المقارنة واستخدام com.spdlog في C++ لدعم التتبع الخلفي: مستودع spdlog جيثب