المشكلة
PM2 بيكتب الـ logs في ~/.pm2/logs، ملف للـ out وملف للـ error لكل app. ولو التطبيق بيطبع كتير، الملفات دي بتكبر لحد ما الهارد يتملي والسيرفر كله يقف.
الحل مش إنك تمسح الملفات بإيدك، الحل rotation. يعني الملف الحالي يتقفل ويتسمى بالتاريخ، ويبدأ ملف جديد، والقديم يتمسح بعد عدد معين.
التثبيت
pm2-logrotate ده PM2 module، فبيتسطب بـ pm2 install مش بـ npm أو pnpm:
terminal
pm2 install pm2-logrotateالإعداد
terminal
pm2 set pm2-logrotate:max_size 1Gpm2 set pm2-logrotate:retain 7pm2 set pm2-logrotate:compress falsepm2 set pm2-logrotate:dateFormat YYYY-MM-DD_HH-mm-sspm2 set pm2-logrotate:workerInterval 30pm2 set pm2-logrotate:rotateInterval '0 0 * * *'pm2 set pm2-logrotate:TZ Asia/Kuwaitpm2 conf pm2-logrotate # راجع القيمكل سطر معناه إيه؟
max_size 1G: لما الملف يعدّي 1G، يتعمله rotate. وممكن يعدّي الرقم شوية، لأن الفحص بيحصل كل فترة مش مع كل سطر.retain 7: يحتفظ بآخر 7 ملفات قديمة، والملف الحالي فوقهم. يعني مش 7 إجمالي.compress false: الضغط مقفول. لو عايز الملفات القديمة تتضغط بـ gzip وتاخد مساحة أقل، خليهاtrue.dateFormat: شكل التاريخ اللي بيتحط في اسم الملف القديم.workerInterval 30: كل كام ثانية يفحص حجم الملفات.rotateInterval '0 0 * * *': cron بيعمل rotate كل يوم الساعة 12 بالليل، حتى لو الملف لسه موصلش للحجم. والـ quotes مهمة عشان الـ shell ميفسّرش النجوم كأسماء ملفات.TZ Asia/Kuwait: التوقيت اللي الـ cron والتاريخ بيمشوا عليه. ولو مش محطوطة، بياخد توقيت السيستم.
شكل الملفات
~/.pm2/logs/├── LMS--backend-out.log ← الحالي├── LMS--backend-out__2026-10-12_00-00-00.log ← قديم├── LMS--backend-out__2026-10-11_00-00-00.log├── LMS--backend-error.log└── LMS--backend-error__2026-10-12_00-00-00.logالاسم الفعلي بيختلف حسب اسم الـ app والإصدار، والرموز زي : في الاسم بتتحوّل لـ -. اعتمد على اللي عندك في ls ~/.pm2/logs.
متمسحش log شغال بـ rm
لو عملت rm على ملف الـ app لسه فاتحه، الملف هيختفي من الفولدر، لكن الـ app هيفضل يكتب فيه، والمساحة مش هترجع لحد ما الـ process تقفل. وده اللي بيخلي df يقول الهارد مليان وdu مش لاقي حاجة.
terminal
pm2 flush # يفضّي كل ملفات الـ logs من غير ما يمسحهاpm2 flush "LMS::backend" # app واحد بس# لو مسحت بـ rm خلاص، خلي الـ app يفتح ملف جديد:pm2 reload all # في cluster من غير downtimepm2 restart all # في forkخلّصت الفصل لما
🧠 اختبر نفسك
١) retain 7. كام ملف هتلاقي لكل نوع log؟
لحد 8: الحالي و7 قديمين.
٢) compress false معناها إيه؟
الضغط مقفول، والملفات القديمة بتفضل نص عادي.
٣) عملت rm على ملف log، وdf لسه بيقول الهارد مليان. ليه؟
لأن الـ app لسه فاتح الملف وبيكتب فيه. اعمل reload أو restart عشان يفتح ملف جديد والمساحة ترجع.