تنظیم logrotate در لینوکس برای لاگ برنامه ها

برای تنظیم 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بعد از چرخش این دستور را اجرا کن، مثلاً برنامه را دوباره بارگذاری کن
sharedscriptspostrotate فقط یک بار برای همه فایل‌ها اجرا شود

دسترسی‌ها را درست بگذارید؛ توضیح اعداد در مدیریت دسترسی در لینوکس آمده است.

چرخش بر اساس اندازه

اگر لاگ ناگهان بزرگ می‌شود، به‌جای زمان از اندازه استفاده کنید:

/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 را دستی اجرا کنید.

منابع

پاسخی بگذارید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *