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

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

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

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

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

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

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

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

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

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

عند اكتشاف خطأ في وحدة العداء، يستدعي البرنامج النصي طريقة مخصصة لاسترداد رسائل السجل المخزنة في 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. يستخدم لمنع الرسائل الأقل خطورة مثل التصحيح والمعلومات، وإظهار الأخطاء فقط.
  3. ما هي أفضل طريقة لتخزين السجلات الأخيرة في الذاكرة؟
  4. أ يمكن استخدامه لتخزين رسائل السجل الحديثة، مع التخلص التلقائي من الإدخالات الأقدم.
  5. كيف أقوم بمسح السجلات المخزنة مؤقتًا عند حدوث خطأ؟
  6. مع ، يتم تخزين السجلات في الذاكرة ويتم مسحها عند تشغيل مستوى سجل معين، مثل .
  7. ما هي ميزة استخدام Loguru على تسجيل Python؟
  8. يبسط عملية إعداد السجل باستخدام كود معياري أقل ويوفر ميزات أكثر سهولة مثل تصفية السجلات وتدويرها بشكل أسهل.
  9. هل يمكنني دمج Loguru مع تكوينات التسجيل الحالية؟
  10. نعم، يمكن لـ Loguru التكامل بسلاسة مع نظام التسجيل المدمج في Python عن طريق استبدال معالج التسجيل الافتراضي.

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

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

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