كيفية إدارة ملفات السجلات باستخدام Logrotate على أوبونتو 22.04

مقدمة

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

يتم تثبيت Logrotate افتراضيًا على Ubuntu 22.04، ويتم إعداده للتعامل مع احتياجات دوران السجل الافتراضية لجميع الحزم المثبتة، بما في ذلك rsyslog، معالج السجل النظامي الافتراضي.

في هذا المقال، سنستكشف تكوين Logrotate الافتراضي، ثم نقوم بتكوين دوران السجل لتطبيق مخصص وهمي.

المتطلبات الأولية

يفترض هذا البرنامج التعليمي أن لديك خادم Ubuntu 22.04، مع مستخدم غير جذر يمكنه استخدام sudo، كما هو موضح في إعداد الخادم الأولي مع Ubuntu 22.04.

يتوفر Logrotate على العديد من توزيعات Linux الأخرى أيضًا، ولكن قد يكون التكوين الافتراضي مختلفًا تمامًا. ستظل الأقسام الأخرى من هذا البرنامج التعليمي قابلة للتطبيق طالما كانت نسخة Logrotate مماثلة لنسخة Ubuntu 22.04. اتبع الخطوة 1 لتحديد إصدار Logrotate الخاص بك.

قم بتسجيل الدخول إلى خادمك بوصفك مستخدمًا يمكنه استخدام sudo للبدء.

الخطوة 1 — تأكيد نسخة Logrotate الخاصة بك

تم تثبيت Logrotate بشكل افتراضي على Ubuntu. ومع ذلك، إذا كنت بحاجة إلى تثبيته، قم بتشغيل الأوامر التالية لتحديث قائمة الحزم واسترداد الحزمة:

  1. sudo apt update
  2. sudo apt install logrotate

إذا كنت تستخدم خادمًا غير مبني على Ubuntu، تأكد أولاً من تثبيت Logrotate عن طريق طلب معلومات الإصدار الخاصة به:

  1. logrotate --version
Output
logrotate 3.19.0 Default mail command: /usr/bin/mail Default compress command: /bin/gzip Default uncompress command: /bin/gunzip Default compress extension: .gz Default state file path: /var/lib/logrotate/status ACL support: yes SELinux support: yes

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

  1. man logrotate

يمكنك أيضًا الاطلاع على النسخة عبر الإنترنت من وثائق Logrotate. فيما يلي سنلقي نظرة على هيكل التكوين الافتراضي لـ Logrotate على Ubuntu.

الخطوة 2 — استكشاف تكوين Logrotate

يمكن العثور عادةً على معلومات تكوين Logrotate في مكانين على Ubuntu:

  • /etc/logrotate.conf: يحتوي هذا الملف على بعض الإعدادات الافتراضية ويضبط دورة تناوب لبعض السجلات التي لا تملكها أي حزم نظام. كما يستخدم بيان include لجلب تكوين من أي ملف في دليل /etc/logrotate.d.
  • /etc/logrotate.d/: هنا حيث ستضع أي حزم تقوم بتثبيتها وتحتاج إلى مساعدة في تناوب السجلات تكوينات Logrotate. في تثبيت قياسي يجب أن تكون لديك بالفعل ملفات هنا لأدوات النظام الأساسية مثل apt، dpkg، rsyslog وما إلى ذلك.

بشكل افتراضي، ستكون logrotate.conf تكوينات تناوب أسبوعية للسجلات، مع ملفات سجل تملكها مستخدم root ومجموعة syslog، مع الاحتفاظ بأربعة ملفات سجل في كل مرة (rotate 4)، وإنشاء ملفات سجل جديدة فارغة بعد تناوب الملف الحالي (create).

دعنا نلقي نظرة على ملف تكوين Logrotate لحزمة ما في /etc/logrotate.d. استخدم cat لعرض الملف لأداة حزمة apt:

  1. cat /etc/logrotate.d/apt
Output
/var/log/apt/term.log { rotate 12 monthly compress missingok notifempty } /var/log/apt/history.log { rotate 12 monthly compress missingok notifempty }

يحتوي هذا الملف على كتل تكوين لملفي سجل مختلفين في دليل /var/log/apt/: term.log و history.log. كلاهما يحمل نفس الخيارات. أي خيارات غير مضبوطة في هذه الكتل سترث القيم الافتراضية أو تلك المضبوطة في /etc/logrotate.conf. أي إعداد في ملف Logrotate سيكون له الأولوية على قيم Logrotate الافتراضية، التي يتم تكوينها في /etc/logrotate.conf. الخيارات المضبوطة لسجلات apt هي:

  • rotate 12: قم بالاحتفاظ باثنتي عشرة ملف سجل قديم. يتم تجاوز القيمة الافتراضية لـ rotate 4.
  • monthly: قم بالتدوير مرة واحدة في الشهر. يتم تجاوز القيمة الافتراضية لـ weekly.
  • compress: ضغط الملفات المدوّرة. يتم استخدام gzip افتراضيًا وينتج ملفات تنتهي بامتداد .gz. يمكن تغيير أمر الضغط باستخدام الخيار compresscmd.
  • missingok: لا تكتب رسالة خطأ إذا كان ملف السجل مفقودًا.
  • notifempty: لا تقم بتدوير ملف السجل إذا كان فارغًا.

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

هناك العديد من خيارات التكوين الأخرى المتاحة. يمكنك قراءة كل منها عن طريق كتابة man logrotate في سطر الأوامر لعرض صفحة دليل Logrotate.

فيما يلي، سنقوم بإعداد ملف تكوين لمعالجة سجلات خدمة خيالية تُسمى your-app.

الخطوة 3 — إعداد تكوين مثالي

لإدارة ملفات السجل باستخدام logrotate للتطبيقات خارج الخدمات النظامية المعبأة مسبقًا والمُكونة مُسبقًا، لدينا خياران:

  1. إنشاء ملف تكوين Logrotate جديد ووضعه في /etc/logrotate.d/. سيتم تشغيله يوميًا بصلاحيات المستخدم root بجانب جميع مهام Logrotate القياسية الأخرى.
  2. إنشاء ملف تكوين جديد وتشغيله خارج إعداد Logrotate الافتراضي في Ubuntu. هذا ضروري فقط إذا كنت بحاجة لتشغيل Logrotate كمستخدم غير root، أو إذا كنت ترغب في تدوير السجلات بشكل أكثر تواترًا من اليومي (سيكون تكوين hourly في /etc/logrotate.d/ غير فعّال، لأن إعداد Logrotate للنظام يعمل مرة واحدة في اليوم فقط).

لنلقي نظرة على هاتين الخيارين مع بعض الإعدادات النموذجية.

إضافة التكوين إلى /etc/logrotate.d/

نريد تكوين تدوير السجلات لخادم ويب خيالي يضع ملفات access.log و error.log في /var/log/your-app/. يعمل كمستخدم ومجموعة www-data.

لإضافة تكوين لملفات السجلات your-app إلى /etc/logrotate.d/، افتح ملفًا جديدًا في دليل /etc/logrotate.d باستخدام nano أو المحرر المفضل لديك:

  1. sudo nano /etc/logrotate.d/your-app

أضف الأسطر التالية إلى ملف التكوين الجديد الخاص بك:

/etc/logrotate.d/your-app
/var/log/your-app/*.log {
	daily
	missingok
	rotate 14
	compress
	notifempty
	create 0640 www-data www-data
	sharedscripts
	postrotate
		systemctl reload your-app
	endscript
}

بعض التوجيهات التكوينية الجديدة في هذا الملف هي:

  • create 0640 www-data www-data: ينشئ هذا ملف سجل فارغ جديد بعد التدوير، بالأذونات المحددة (0640)، وصاحب الامتياز (www-data)، والمجموعة أيضًا (www-data).
  • sharedscripts: هذا العلم يعني أن أي نصوص مضافة إلى التكوين تعمل مرة واحدة فقط لكل تشغيل، بدلاً من كل مرة يتم فيها تدوير ملف سجل. نظرًا لأن المسار /var/log/your-app/*.log يتضمن بادئة *، فإن هذا التكوين سيطابق أي عدد من ملفات السجل في دليل your-app. بدون خيار sharedscripts، سيتم تشغيل النص المحدد في postrotate في كل مرة يقوم فيها logrotate بمعالجة ملف سجل بدون هذا الخيار.
  • postrotate إلى endscript: يحتوي هذا الكتلة على سكريبت لتشغيله بعد تدوير ملف السجل. في هذه الحالة، نقوم بإعادة تحميل تطبيق المثال الخاص بنا. قد يكون هذا ضروريًا في بعض الأحيان لجعل تطبيقك ينتقل إلى ملف السجل الجديد الذي تم إنشاؤه حديثًا.
    يرجى ملاحظة أن postrotate يعمل قبل ضغط السجلات. قد يستغرق الضغط وقتًا طويلاً، ويجب على برنامجك التبديل إلى ملف السجل الجديد فورًا. بالنسبة للمهام التي تحتاج إلى تشغيلها بعد ضغط السجلات، استخدم كتلة lastaction بدلاً من ذلك.

لحفظ والخروج من nano، اضغط Ctrl+X، ثم عندما يُطلب منك، اضغط Y ثم Enter. يمكنك اختبار ملف التكوين عن طريق عملية تشغيل جافة:

  1. sudo logrotate /etc/logrotate.conf --debug

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

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

بعد ذلك، سنحاول إعداد لا يستخدم تكوين أوبونتو الافتراضي على الإطلاق.

الخطوة 4 — إنشاء تكوين مستقل لـ Logrotate

في هذا المثال، لدينا تطبيق يعمل بصفتنا مستخدمًا باسم sammy، يولِّد سجلات تُخزَّن في /home/sammy/logs/. نريد تدوير هذه السجلات كل ساعة، لذا نحتاج إلى إعداد هذا خارج هيكل /etc/logrotate.d الذي توفره أوبونتو.

أولاً، سنقوم بإنشاء ملف تكوين في دليل منزلنا. افتحه في محرر نصوص:

  1. nano /home/sammy/logrotate.conf

ثم الصق التكوين التالي:

/home/sammy/logrotate.conf
/home/sammy/logs/*.log {
	hourly
	missingok
	rotate 24
	compress
	create
}

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

ستحتاج إلى تخصيص التكوين ليتناسب مع تطبيقك، ولكن هذا بداية جيدة.

للاختبار ما إذا كانت التكوين تعمل، دعنا ننشئ ملف تسجيل. أولاً cd إلى دليل المستخدم الخاص بك باستخدام الأمر cd ~. ثم قم بإنشاء دليل لسجلات باستخدام الأمر mkdir. وأخيرًا، أنشئ ملفًا فارغًا في دليل logs باستخدام الأمر touch. قم بتشغيل الأوامر التالية لإكمال هذه الخطوات:

  1. cd ~
  2. mkdir logs
  3. touch logs/access.log

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

نظرًا لأن السجلات تمتلكها sammy لا نحتاج إلى استخدام sudo. ومع ذلك، نحتاج لتحديد ملف الحالة. يقوم هذا الملف بتسجيل ما وجده logrotate وأي إجراءات اتخذها في المرة السابقة التي تم فيها تشغيله، بحيث يعرف ما يجب فعله في المرة القادمة التي يتم فيها تشغيله. يتم التعامل مع تتبع الحالة لنا عند استخدام تكوين /etc/logrotate.conf الافتراضي. يتم تخزين ملف الحالة في /var/lib/logrotate/status. نظرًا لأننا لا نستخدم التكوين الافتراضي، سنحتاج إلى تكوين موقع ملف الحالة يدويًا.

سنطلب من Logrotate وضع ملف الحالة مباشرة في دليل المستخدم الخاص بنا في هذا المثال. يمكن أن يكون في أي مكان يمكن الوصول إليه ومناسب. قم بتشغيل الأمر التالي لاستخدام /home/sammy/logrotate.conf الذي قمت بإنشائه وتسجيل الحالة التي يواجهها logrotate:

logrotate /home/sammy/logrotate.conf --state /home/sammy/logrotate-state --verbose
Output
reading config file /home/sammy/logrotate.conf Handling 1 logs rotating pattern: /home/sammy/logs/*.log hourly (24 rotations) empty log files are rotated, old logs are removed considering log /home/sammy/logs/access.log log does not need rotating

تعتبر علامة --verbose ستطبع معلومات مفصلة حول ما يقوم به Logrotate. في هذه الحالة، لم يتم تدوير أي شيء. هذه هي المرة الأولى التي يواجه فيها Logrotate هذا الملف السجل وهو عمره صفر ساعة، لذلك لا يجب تدويره.

إذا قمنا بفحص ملف الحالة باستخدام أداة cat، سنلاحظ أن Logrotate سجل بعض المعلومات حول العملية:

  1. cat /home/sammy/logrotate-state
Output
logrotate state -- version 2 "/home/sammy/logs/access.log" 2022-07-2-19:0:0

سجل Logrotate السجلات التي رأتها ومتى آخر مرة قامت فيها بالنظر فيها للتدوير. إذا قمنا بتشغيل نفس الأمر بعد ساعة واحدة، سيتم تدوير السجل كما هو متوقع.

إذا كنت ترغب في إجبار Logrotate على تدوير ملف السجل عندما لا يكون من المفترض أن تقوم بذلك، استخدم علامة --force:

  1. logrotate /home/sammy/logrotate.conf --state /home/sammy/logrotate-state --verbose --force

هذا مفيد عند اختبار postrotate وسكربتات أخرى.

وأخيرًا، نحتاج إلى إعداد وظيفة cron لتشغيل Logrotate كل ساعة. افتح crontab الخاص بمستخدمك:

  1. crontab -e

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

crontab
14 * * * * /usr/sbin/logrotate /home/sammy/logrotate.conf --state /home/sammy/logrotate-state

هذه المهمة ستعمل في الدقيقة 14 من كل ساعة، كل يوم. تقوم بتشغيل نفس الأمر تقريبًا الذي قمنا بتشغيله مسبقًا، على الرغم من أننا قمنا بتوسيع logrotate إلى مساره الكامل /usr/sbin/logrotate لنكون في الجانب الآمن. من الجيد أن تستخدم المسارات الكاملة عند كتابة وظائف cron. لمعرفة المزيد عن cron، يمكنك مراجعة دليلنا الآخر التعليمات.

قم بحفظ الملف والخروج. سيقوم هذا بتثبيت crontab وستعمل مهمتنا وفقًا للجدول الزمني المحدد.

إذا عدنا إلى دليل السجل الخاص بنا في حوالي ساعة، يجب أن نجد ملف السجل المدوّر والمضغوط access.log.1.gz (أو .2.gz إذا قمت بتشغيل Logrotate بعلم --force).

الاستنتاج

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

Source:
https://www.digitalocean.com/community/tutorials/how-to-manage-logfiles-with-logrotate-on-ubuntu-22-04