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:
pythonimport 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.
-
Python Custom Log Formatter06/04/2024
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
لمعالجة سجلات السجل. إليك مثالًا موسعًا على كيفية تنفيذ ذلك:
pythonimport 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
)، وعندما يتم تجاوز الحجم المحدد، يتم إنشاء نسخة احتياطية من السجل القديم وفتح سجل جديد لاستكمال التسجيل. تذكر أن هذا مثال أساسي وقد تحتاج إلى تعديله بناءً على احتياجاتك الخاصة.