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

اختر وجهة الإخراج قبل سياسة التدوير

وحدة systemd ترسل مخرجاتها بالفعل إلى السجل تحفظ مدة الاحتفاظ في مكان واحد. يفرض journald حدودًا مثل SystemMaxUse و MaxRetentionSec ، فيرث المراقب الذي يسجل هناك حدًا دون أي عمل إضافي. وإضافة ملف ثانٍ بلا حد إلى جانبه تضاعف الصيانة بلا فائدة.

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

اكتب المقطع بما يطابق الكاتب

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

/var/log/vpn-watchdog.log {
    daily
    rotate 7
    create 0600 root root
    missingok
    notifempty
}

يعرّف دليل logrotate العدد بأنه عدد الإصدارات المدوّرة المحتفظ بها، لا كضمان لسبعة أيام من التاريخ، وتُقيَّم الكلمة daily عند تشغيل المهمة بدلًا من أن تعمل كمجدول خاص بها. وفي معظم التوزيعات يملك مؤقت systemd أو إدخال cron ذلك الاستدعاء بالفعل، لذا تحقق من أيهما موجود قبل إضافة ثانٍ. ومطابقة الملكية أهم من عدد الاحتفاظ. نسخ وضع خاص بالجذر إلى ملف يكتبه حساب خدمة يوقف التسجيل عند التدوير التالي، ويظهر الفشل بعد ساعات كطابع زمني قديم لا كخطأ. تأكد من مستخدم الكاتب قبل نسخ مقطع من مكان آخر.

الكاتب الذي لا يعيد الفتح أبدًا يحتاج إصلاحًا مختلفًا

العملية طويلة التشغيل التي تحتفظ بوصف مفتوح تستمر في الكتابة إلى العقدة المُعاد تسميتها. لا تُحرَّر المساحة ويتوقف الملف المرئي عن النمو، وهو ما يبدو كتدوير معطوب حتى تفحص العقدة. إما أن تعلّم العملية إعادة الفتح، أو تجعل التدوير ينسخ ويقتطع بدلًا من إعادة التسمية.

مسار إعادة الفتح هو الأنظف حيث تدعمه البرمجيات: أرسل الإشارة الموثقة أو شغّل الأمر الموثق، ودع العملية تفتح الملف الجديد بنفسها. والبديل هو copytruncate ، الذي ينسخ المحتويات إلى الاسم المدوّر ثم يقتطع الأصل في مكانه، فيبقى الوصف صالحًا لكن الكتابات التي تقع بين النسخ والاقتطاع تُفقد.

بالنسبة للوحدات التي يبدأها systemd، وجّه StandardOutput إلى السجل أو إلى ملف ودع الوحدة تملك دورة الحياة. حلقة shell تضيف عبر tee -a بلا حد للحجم هي الترتيبة التي تملأ قسمًا أثناء انقطاع، لأن الفحص الفاشل غالبًا يسجل أكثر بكثير من الفحص السليم.

اختبر التدوير دون انتظار المؤقت

وضع التصحيح يبلّغ بما سيحدث ولا يمس شيئًا، ما يجعله التشغيل الأول الآمن بعد تعديل. افرض تدويرًا حقيقيًا حين ترضى، ثم تأكد من أن سطر السجل التالي يهبط في الملف الجديد لا في المُعاد تسميته:

logrotate -d /etc/logrotate.d/vpn-watchdog
logrotate -f /etc/logrotate.d/vpn-watchdog
ls -l /var/log/vpn-watchdog.log*
tail -n 3 /var/log/vpn-watchdog.log
df -h /var/log

اقرأ المخرجات بهذا الترتيب. يجب أن تسمّي جولة التصحيح الملف والإجراءات التي تنويها؛ ويجب أن تنتج الجولة المفروضة الاسم المدوّر الذي توقعته؛ ويجب أن تُظهر أداة tail مدخلًا جديدًا بعد تشغيل الكاتب مرة أخرى. وقيمة df المتزايدة مع ملف مرئي يتقلص تعني مشكلة الوصف الموصوفة أعلاه.

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

احتفظ بإمكانية التراجع وبسجل مكتوب

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

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

أخيرًا، أبقِ قرار السجل منفصلًا عن قرار الاسترداد. يجب أن يتبع الفحص الفاشل سياسة الاسترداد الخاصة بالاتصال، لا قاعدة مخفية داخل logrotate، ولا ينبغي لأي ترتيب تسجيل أن يكون سببًا لإعادة تشغيل نفق يعمل.

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