Log Rotation هي آلية تلقائية لإدارة ملفات السجل تمنع امتلاء القرص من خلال الأرشفة والضغط وحذف السجلات القديمة. في التطبيقات المحمولة، تتراكم السجلات على جهاز المستخدم، وبدون التدوير يمكن أن تشغل غيغابايتات من الذاكرة في غضون أسابيع من الاستخدام. وفقًا لـ وثائق Redis، فإن الإعداد الصحيح لـ log rotation يقلل من خطر فشل النظام بسبب امتلاء القرص بنسبة 99% مقارنة بالنمو غير المنضبط للسجلات. استراتيجيات التدوير الرئيسية هي: حسب حجم الملف، حسب الوقت وحسب عدد الملفات — يتم اختيار كل منها اعتمادًا على حالة الاستخدام: logrotate في Linux وCocoaLumberjack على iOS وTimber على Android تدعم جميعها الأساليب الثلاثة.
النقاط الرئيسية
Log Rotation هي عملية التبديل الدوري لملف السجل النشط إلى ملف جديد مع أرشفة أو ضغط أو حذف الملف القديم في نفس الوقت. بدون التدوير، ينمو ملف سجل واحد إلى أجل غير مسمى حتى يملأ قسم القرص بأكمله، مما يؤدي إلى تعطل التطبيق وفقدان البيانات.
السيناريو النموذجي: يكتب التطبيق السجلات في ملف app.log. عندما يصل app.log إلى 100 ميجابايت، يعيد النظام تسميته إلى app.log.1، ويضغطه إلى app.log.1.gz وينشئ ملف app.log جديدًا فارغًا. عند الامتلاء التالي، يصبح app.log.1 هو app.log.2، ويصبح app.log.1.gz هو app.log.2.gz، ويتم حذف app.log.2.gz القديم. تسمى هذه الآلية التدوير مع عدد الاحتفاظ — عدد النسخ المؤرشفة ثابت.
وفقًا لـ Splunk (2023)، فإن التكوين غير الصحيح للتدوير هو سبب 40% من الحوادث المتعلقة بنفاد مساحة القرص على خوادم التطبيقات. بالنسبة للأجهزة المحمولة، التدوير أكثر أهمية لأن المستخدم لا يمكنه ولا ينبغي له إدارة السجلات يدويًا.
Log Rotation يدعم ثلاث استراتيجيات أساسية يمكن دمجها. يعتمد اختيار الاستراتيجية على نوع التطبيق: أنظمة الخوادم تستخدم غالبًا التدوير حسب الوقت، والتطبيقات المحمولة حسب الحجم، والأنظمة المضمنة حسب عدد الملفات.
| الاستراتيجية | المحفز | متى تستخدم |
|---|---|---|
| حسب الحجم | وصل الملف إلى N بايت | الأنظمة عالية التحميل بحجم سجلات غير متوقع |
| حسب الوقت | مر N ساعة/يوم | النسخ الاحتياطية اليومية، متطلبات الامتثال |
| حسب عدد الملفات | تم إنشاء N ملف | الأجهزة المحمولة ذات مساحة القرص المحدودة |
التدوير حسب الحجم يضمن عدم تجاوز أي ملف سجل للحد المحدد. يتم اختيار الحد بناءً على مساحة القرص المتاحة وتكرار التسجيل. بالنسبة للخادم، الحد النموذجي هو 100–500 ميجابايت لكل ملف، للجهاز المحمول — 1–10 ميجابايت. إذا كان التطبيق يسجل بشكل مكثف، يجب خفض الحد، وإلا فسيحدث التدوير كل بضع دقائق.
التدوير حسب الوقت مستقل عن حجم السجلات — يتم تبديل الملف بدقة وفقًا لجدول زمني. مناسب للأنظمة حيث يجب تخزين السجلات لعدد ثابت من الأيام: التدوير اليومي مع عدد الاحتفاظ = 30 يعني 30 يومًا من التخزين. الجانب السلبي — يمكن أن ينمو ملف واحد إلى غيغابايت يوميًا تحت التحميل المكثف.
logrotate هي الأداة القياسية في Linux للتدوير التلقائي للسجلات. يتم تشغيلها عبر cron وتعالج ملفات التكوين من /etc/logrotate.d/. كل خدمة (nginx، postgresql، تطبيق) تنشئ تكوينها الخاص مع تحديد مسارات السجلات واستراتيجية التدوير والإجراءات بعد التدوير.
# /etc/logrotate.d/myapp — تدوير سجلات التطبيق
/var/log/myapp/*.log {
daily
rotate 7
compress
delaycompress
missingok
notifempty
create 0640 www-data www-data
postrotate
kill -HUP $(cat /var/run/myapp.pid)
endscript
}
يقوم هذا التكوين بتدوير السجلات يوميًا، ويحتفظ بـ 7 نسخ مؤرشفة، ويضغط الملفات القديمة بـ gzip (باستثناء الأخير — delaycompress)، ولا يُصدر خطأ إذا كانت السجلات مفقودة (missingok)، ولا يدور الملفات الفارغة (notifempty)، ويعيد إنشاء الملف بصلاحيات 0640. بعد التدوير، يرسل إشارة HUP إلى عملية التطبيق عبر سكريبت postrotate.
size — التدوير عند الوصول إلى حجم معين (size 100M). rotate — عدد النسخ المؤرشفة (rotate 7). compress — ضغط gzip. dateext — إضافة التاريخ إلى اسم الملف بدلاً من الرقم التسلسلي. sharedscripts — تنفيذ postrotate مرة واحدة لجميع الملفات، وليس لكل ملف على حدة. maxage — حذف الأرشيفات الأقدم من N يومًا.
على الأجهزة المحمولة، Log Rotation ضرورية لأن المستخدم لا يدير نظام الملفات ولا يتوقع أن يشغل التطبيق غيغابايتات من السجلات. iOS وAndroid لديهما آليات مدمجة: os_log على iOS يستخدم مخزنًا دائريًا بحجم ثابت (التدوير بالكتابة فوق)، Android Logcat لديه مخزن مؤقت محدود في النواة.
بالنسبة لسجلات الملفات المخصصة على iOS، يتم استخدام CocoaLumberjack مع فئة DDFileLogger التي تدعم التدوير حسب الحجم والوقت. على Android — Logback أو تطبيقات مخصصة عبر RollingFileAppender. كلتا الأداتين تسمحان بتعيين الحد الأقصى لحجم الملف وعدد الأرشيفات.
// CocoaLumberjack — تدوير الملفات على iOS
import CocoaLumberjack
let fileLogger = DDFileLogger()
fileLogger.maximumFileSize = 1024 * 1024 // 1 ميجابايت
fileLogger.logFileManager.maximumNumberOfLogFiles = 5
DDLog.add(fileLogger)
iOS: os_log لا يتطلب التدوير — تتم الكتابة فوق الرسائل في المخزن الدائري. ولكن إذا كان التطبيق يكتب سجلات ملفات مخصصة (لتصحيح الأخطاء أو للإرسال إلى الخادم)، فيجب تكوين التدوير يدويًا. CocoaLumberjack هو الخيار القياسي لفرق iOS — فهو يضغط الأرشيفات تلقائيًا إلى .gz ويحذف الملفات القديمة عند تجاوز الحد.
Android لا يقيد التطبيقات من كتابة السجلات في دليلها الخاص. إذا كتب المطور سجلات تصحيح الأخطاء في ملف بدون تدوير، فخلال شهر من الاستخدام النشط يمكن أن تشغل من 500 ميجابايت إلى 1 غيغابايت. سيكتشف المستخدم المشكلة عندما يعرض النظام تحذيرًا بشأن عدم كفاية المساحة وسيقوم بحذف التطبيق. Logback مع RollingFileAppender يحل هذه المشكلة: حد 5 ميجابايت مع 3 أرشيفات يضمن ألا تتجاوز السجلات 20 ميجابايت أبدًا.
فيما يلي أمثلة على تكوين تدوير السجلات على كلا النظامين. على iOS يُستخدم CocoaLumberjack، على Android — Logback مع تكوين XML.
// Logback على Android — تكوين التدوير في logback.xml
// حجم الملف 5 ميجابايت، 3 نسخ مؤرشفة
@file:Suppress("unused")
// في logback.xml:
// <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
// <file>${DATA_DIR}/logs/app.log</file>
// <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
// <fileNamePattern>app.%i.log.gz</fileNamePattern>
// <minIndex>1</minIndex>
// <maxIndex>3</maxIndex>
// </rollingPolicy>
// <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
// <maxFileSize>5MB</maxFileSize>
// </triggeringPolicy>
// </appender>
CocoaLumberjack على iOS يدعم ليس فقط التدوير حسب الحجم ولكن أيضًا حذف السجلات القديمة حسب التاريخ باستخدام logFileManager.maximumLogFiles. إذا تم تعيين maximumLogFiles = 0، تتم إزالة الحد — ستتراكم السجلات إلى أجل غير مسمى، وهو أمر خطير للإنتاج.
// تدوير مخصص مع التحقق من الحجم الإجمالي
class SizeAwareLogger {
let maxTotalSize: Int64 = 20 * 1024 * 1024
func enforceQuota(at logDirectory: URL) {
let files = (try? FileManager.default
.contentsOfDirectory(
at: logDirectory,
includingPropertiesForKeys: [.fileSize]
)) ?? []
let total = files.reduce(0) {
$0 + (try? $1.resourceValues(forKeys: [.fileSize])
.fileSize).map(Int64.init) ?? 0
}
if total > maxTotalSize {
// حذف أقدم ملف
files.sorted { $0.path < $1.path }.first.map {
try? FileManager.default.removeItem(at: $0)
}
}
}
}
Log Rotation ليس فقط أرشفة تلقائية بل أيضًا مؤشر على صحة النظام. إذا كانت السجلات تُدار بشكل متكرر جدًا (كل بضع دقائق)، فهذه إشارة على تسجيل مفرط أو حلقة تسجيل أخطاء. قم بإعداد تنبيهات على تكرار التدوير: أكثر من 10 تدويرات في الساعة يستدعي الفحص.
أنظمة المراقبة (Prometheus، Grafana، Datadog) يمكنها تتبع مقاييس التدوير عبر مُصدّرات نظام الملفات. Prometheus node_exporter يوفر مقاييس حجم الملفات ووقت تعديلها. على الأجهزة المحمولة، عادة ما تكون مراقبة التدوير مدمجة في SDK: CocoaLumberjack يسجل حدث التدوير عبر DDLog، وLogback يرسل الحالة عبر appender.
التنبيهات: إذا كان عدد الأرشيفات أكثر من المتوقع (تجاوز عدد التدوير الحد) أو تجاوز الحجم الإجمالي للسجلات الحصة — يجب على النظام إخطار المسؤول. للخوادم، الحد القياسي هو 80% من حجم القسم، للأجهزة المحمولة — تنبيه عند تجاوز 50 ميجابايت لكل تطبيق.
الأسئلة الشائعة
للخوادم — 100–500 ميجابايت، للتطبيقات المحمولة — 1–10 ميجابايت. الحد الصغير جدًا (أقل من 1 ميجابايت) يسبب تدويرًا متكررًا وعمليات إدخال/إخراج غير ضرورية. الحد الكبير جدًا (أكثر من 500 ميجابايت) يزيد من وقت فتح الملف والبحث فيه.
للإنتاج — على الأقل 7 أيام (التدوير اليومي) أو 3–5 أرشيفات (التدوير حسب الحجم). لمتطلبات الامتثال — 30–90 يومًا، ولكن استخدم تخزينًا منفصلاً مع ضغط وسياسة احتفاظ، وليس التدوير على نفس القسم.
logrotate هي أداة Linux — غير متوفرة على iOS وAndroid. على الأجهزة المحمولة، يتم تنفيذ التدوير بواسطة مكتبات: CocoaLumberjack لنظام iOS وLogback لنظام Android. لا تتطلب وصول الجذر وتعمل في بيئة sandbox الخاصة بالتطبيق.
تحقق مما إذا كان هناك تسجيل دائري — عندما يولد معالجة الخطأ خطأ جديدًا. أضف حماية: عداد للتسجيلات المتكررة من نفس النوع مع حد (لا يزيد عن 100 رسالة متطابقة في الدقيقة) وقفل مؤقت بعد تجاوزه.
ليس إلزاميًا، لكنه موصى به. gzip يضغط السجلات النصية من 10 إلى 20 مرة دون فقدان البيانات. على الأجهزة المحمولة، يقلل الضغط المساحة المشغولة من 50 ميجابايت إلى 3–5 ميجابايت. العيب الوحيد — لا يمكن قراءة الأرشيف بدون فك الضغط، لكن للتحليل عادة ما يكون الملف الحالي فقط مطلوبًا.
الملخص
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.
اقرأ أيضًا