برای تنظیم logrotate، یک فایل برای برنامه خودتان در /etc/logrotate.d/ میسازید و مشخص میکنید لاگ هر چند وقت یک بار چرخانده شود، چند نسخه نگه داشته شود و فشرده شود یا نه. logrotate بدون کار اضافه، هر روز از طریق کرون یا تایمر systemd اجرا میشود و فایلهای لاگ را عوض، فشرده و قدیمیها را حذف میکند تا دیسک پر نشود. با دستور logrotate -d /etc/logrotate.conf تنظیم را بدون اعمال واقعی آزمایش میکنید.
لاگ بدون چرخش یکی از رایجترین دلایل پر شدن دیسک است. اگر دیسک سرورتان پر شده، پیش از این راهنما، آموزش Cron Job را هم بخوانید، چون logrotate همانجا زمانبندی میشود. برای پیدا کردن بزرگترین لاگها از du -ah /var/log | sort -rh | head استفاده کنید.
logrotate چطور کار میکند؟
تنظیم اصلی در /etc/logrotate.conf است و فایلهای هر برنامه در /etc/logrotate.d/ قرار دارند. در Ubuntu یک تایمر systemd به نام logrotate.timer روزی یک بار آن را اجرا میکند:
systemctl list-timers | grep logrotate
cat /var/lib/logrotate/status | headفایل status تاریخ آخرین چرخش هر لاگ را نگه میدارد. اگر لاگی چرخانده نمیشود، اول همین فایل و شرطهای اندازه یا زمان را بررسی کنید.
نمونه تنظیم logrotate برای لاگ برنامه
فرض کنید برنامه شما در /var/log/myapp/*.log مینویسد. فایل /etc/logrotate.d/myapp را بسازید:
/var/log/myapp/*.log {
daily
rotate 14
compress
delaycompress
missingok
notifempty
create 0640 myapp adm
sharedscripts
postrotate
systemctl reload myapp >/dev/null 2>&1 || true
endscript
}معنی دستورها:
| دستور | معنی |
|---|---|
daily | هر روز چرخش (یا weekly، monthly) |
rotate 14 | ۱۴ نسخه قدیمی را نگه دار |
compress | فایلهای قدیمی را با gzip فشرده کن |
delaycompress | یک نسخه را فشرده نکن تا برنامههایی که هنوز آن را باز دارند مشکل نداشته باشند |
missingok | اگر فایل نبود خطا نده |
notifempty | لاگ خالی را نچرخان |
create 0640 myapp adm | فایل جدید را با این دسترسی و مالک بساز |
postrotate | بعد از چرخش این دستور را اجرا کن، مثلاً برنامه را دوباره بارگذاری کن |
sharedscripts | postrotate فقط یک بار برای همه فایلها اجرا شود |
دسترسیها را درست بگذارید؛ توضیح اعداد در مدیریت دسترسی در لینوکس آمده است.
چرخش بر اساس اندازه
اگر لاگ ناگهان بزرگ میشود، بهجای زمان از اندازه استفاده کنید:
/var/log/myapp/*.log {
size 100M
rotate 7
compress
missingok
notifempty
}با size فقط وقتی لاگ از 100 مگابایت بگذرد چرخیده میشود، ولی logrotate فقط وقتی اجرا میشود که تایمرش بیاید (روزی یک بار). اگر لاگ در چند ساعت از حد بگذرد، تا اجرای بعدی بزرگ میماند. برای کنترل دقیقتر، حد maxsize را با daily ترکیب کنید یا اجرا را زمانبندیشدهتر کنید.
copytruncate یا postrotate
برنامههایی که فایل لاگ را باز نگه میدارند، بعد از جابهجایی فایل همچنان در فایل قدیمی مینویسند. دو راه هست:
- postrotate با reload: برنامه را وادار میکنید فایل جدید را باز کند. روش درستتر است، اگر برنامه از reload یا سیگنال USR1 پشتیبانی کند.
- copytruncate: نسخهای از فایل برمیدارد و خود فایل را خالی میکند. ساده است ولی ممکن است چند خط بین کپی و خالی کردن از دست برود.
/var/log/legacy-app.log {
weekly
rotate 8
compress
copytruncate
missingok
}لاگ Nginx و Apache
بستههای Nginx و Apache فایل logrotate آماده دارند (/etc/logrotate.d/nginx). معمولاً کافی است rotate را با نیازتان هماهنگ کنید. اگر Nginx دارید، نصب Nginx روی اوبونتو محل لاگها را توضیح میدهد. نمونه رایج postrotate برای Nginx:
postrotate
[ -f /run/nginx.pid ] && kill -USR1 $(cat /run/nginx.pid)
endscriptسیگنال USR1 به Nginx میگوید فایلهای لاگ را دوباره باز کند.
آزمایش تنظیم logrotate و اجرای دستی
پیش از اعتماد به تنظیم جدید:
sudo logrotate -d /etc/logrotate.d/myapp
sudo logrotate -f /etc/logrotate.d/myapp
sudo logrotate -v /etc/logrotate.conf-d فقط شبیهسازی (debug) است و چیزی را عوض نمیکند. -f اجرای اجباری است. -v توضیح مفصل میدهد. بعد از -f فایل .1 یا .gz در پوشه لاگ را ببینید و مطمئن شوید برنامه هنوز در فایل جدید مینویسد.
journald و لاگ systemd
لاگ سرویسهای systemd در journal است و logrotate مدیریتش نمیکند. حجم آن را محدود کنید:
sudo journalctl --disk-usage
sudo journalctl --vacuum-size=500Mبرای دائمی کردن، در /etc/systemd/journald.conf مقدار SystemMaxUse=500M را بگذارید و sudo systemctl restart systemd-journald بزنید. دستورات journalctl را در دستورات مانیتورینگ سرور لینوکس هم میبینید.
خطاهای رایج
| نشانه | علت و راه حل |
|---|---|
| لاگ چرخانده نمیشود | شرط زمان یا اندازه نرسیده؛ -d و status را ببینید |
error: skipping ... because parent directory has insecure permissions | پوشه لاگ برای گروه یا دیگران قابل نوشتن است؛ دسترسی یا su را تنظیم کنید |
| برنامه بعد از چرخش لاگ نمینویسد | postrotate یا reload درست نیست؛ copytruncate را بررسی کنید |
| فایلهای قدیمی حذف نمیشوند | rotate بزرگ است یا الگوی فایل با نام لاگ نمیخواند |
| خطای نگارش در فایل | logrotate -d پیام و شماره خط را نشان میدهد |
| فشردهسازی CPU میگیرد | compresscmd سبکتر یا nocompress برای لاگ بزرگ |
سوالات متداول
لاگ چرخاندهشده کجا میرود؟
در همان پوشه، با پسوند عددی (app.log.1) یا فشرده (app.log.2.gz). با olddir میتوان آنها را به پوشه دیگری برد.
آیا میتوان لاگ را به سرور دیگر فرستاد؟
logrotate این کار را نمیکند. برای ارسال لاگ، از rsyslog، Filebeat یا ابزار جمعآوری لاگ استفاده کنید و logrotate فقط برای مدیریت دیسک محلی بماند.
چقدر لاگ نگه دارم؟
به الزامهای کسبوکار و قانونی بستگی دارد. بعضی لاگها (مثل دسترسی) را باید بر اساس سیاست داخلی نگه دارید؛ برای عیبیابی عادی ۷ تا ۳۰ روز معمولاً کافی است.
چرا بعد از تغییر تنظیم، اثری نمیبینم؟
logrotate روزی یک بار اجرا میشود. برای دیدن فوری نتیجه، -f را دستی اجرا کنید.





