البرمجة

تسجيل السجل الدوري في Python

To achieve a rolling log to a variable in Python, you can create a custom logger class that extends the logging.Handler class and overrides the emit method to handle log records. Here’s a basic example of how you could implement this:

python
import logging import io from logging.handlers import RotatingFileHandler class RollingMemoryHandler(logging.Handler): def __init__(self, max_size, backup_count=0): super().__init__() self.max_size = max_size self.backup_count = backup_count self.log_stream = io.BytesIO() self.log_handler = RotatingFileHandler( filename='unused.log', mode='a', maxBytes=max_size, backupCount=backup_count, encoding=None, delay=0 ) def emit(self, record): msg = self.format(record) self.log_stream.write(msg.encode()) # Check if log size exceeds max_size if len(self.log_stream.getvalue()) > self.max_size: self.log_stream.truncate(0) self.log_stream.seek(0) def get_logs(self): return self.log_stream.getvalue().decode() def close(self): self.log_handler.close() super().close() # Usage example logger = logging.getLogger('my_logger') handler = RollingMemoryHandler(max_size=1024) formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s') handler.setFormatter(formatter) logger.addHandler(handler) logger.setLevel(logging.INFO) # Log some messages logger.info('This is an info message') logger.warning('This is a warning message') logger.error('This is an error message') # Get the logs as a string logs = handler.get_logs() print(logs)

In this example, RollingMemoryHandler is a custom logging handler that keeps log records in memory (io.BytesIO) and limits the log size to max_size bytes. When the log size exceeds max_size, it truncates the log to keep only the most recent entries. You can adjust the max_size and backup_count parameters to suit your requirements.

Keep in mind that this is a basic example, and you may need to modify it based on your specific needs and requirements.

المزيد من المعلومات

لتحقيق تسجيل السجل الدوري إلى متغير في Python، يمكنك استخدام الكلاس المعالج RotatingMemoryHandler الذي يمتد من الكلاس logging.Handler ويُعدل الطريقة emit لمعالجة سجلات السجل. إليك مثالًا موسعًا على كيفية تنفيذ ذلك:

python
import logging import io import os import time from logging.handlers import RotatingFileHandler class RotatingMemoryHandler(logging.Handler): def __init__(self, max_size, backup_count=0): super().__init__() self.max_size = max_size self.backup_count = backup_count self.log_stream = io.BytesIO() self.log_handler = RotatingFileHandler( filename='unused.log', mode='a', maxBytes=max_size, backupCount=backup_count, encoding=None, delay=0 ) def emit(self, record): msg = self.format(record) self.log_stream.write(msg.encode()) # Check if log size exceeds max_size if len(self.log_stream.getvalue()) > self.max_size: self.rotate_logs() def rotate_logs(self): # Close the existing log stream self.log_stream.close() # Create a backup of the log file backup_file = f'unused.log.{int(time.time())}' os.rename('unused.log', backup_file) # Open a new log stream self.log_stream = io.BytesIO() def get_logs(self): return self.log_stream.getvalue().decode() def close(self): self.log_handler.close() super().close() # Usage example logger = logging.getLogger('my_logger') handler = RotatingMemoryHandler(max_size=1024) formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s') handler.setFormatter(formatter) logger.addHandler(handler) logger.setLevel(logging.INFO) # Log some messages for i in range(10): logger.info(f'This is info message {i}') # Get the logs as a string logs = handler.get_logs() print(logs)

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

مقالات ذات صلة

زر الذهاب إلى الأعلى

هذا المحتوى محمي من النسخ لمشاركته يرجى استعمال أزرار المشاركة السريعة أو تسخ الرابط !!