دانشنامه مارال هاست دانشنامه مارال هاست
  • صفحه اصلی
  • مقالات
    • هاست اشتراکی
    • دامنه
    • سرور مجازی
    • کنترل پنل سی‌پنل
    • کنترل پنل پلسک
    • کنترل پنل دایرکت ادمین
    • ایمیل
    • CloudLinux
    • Cloudflare
  • تماس با ما
دانشنامه مارال هاست دانشنامه مارال هاست
دانشنامه مارال هاست دانشنامه مارال هاست
  • صفحه اصلی
  • مقالات
    • هاست اشتراکی
    • دامنه
    • سرور مجازی
    • کنترل پنل سی‌پنل
    • کنترل پنل پلسک
    • کنترل پنل دایرکت ادمین
    • ایمیل
    • CloudLinux
    • Cloudflare
  • تماس با ما
لینوکس
  • Folder icon closed Folder open iconآشنایی با لینوکس (Linux Fundamentals)
  • Folder icon closed Folder open iconتوزیع‌های مختلف لینوکس (Linux Distributions)
  • Folder icon closed Folder open iconFHS؛ آشنایی با ساختار فایل‌ و پوشه‌های لینوکسی
  • Folder icon closed Folder open iconمهم‌ترین دستورات پایه‌ای برای هر sysadmin
  • Folder icon closed Folder open iconمدیریت فایل و پوشه (file & directory management) در لینوکس
  • Folder icon closed Folder open iconآموزش ویرایش فایل‌های متنی در لینوکس با Nano و Vim
  • Folder icon closed Folder open iconآشنایی با users، groups و ساختار مدیریت کاربران در لینوکس
  • Folder icon closed Folder open iconآموزش Permission و Ownership در لینوکس
  • Folder icon closed Folder open iconآشنایی با Root و sudo
  • Folder icon closed Folder open iconآشنایی با Processها در لینوکس
  • Folder icon closed Folder open iconتغییر Hostname در لینوکس
  • Folder icon closed Folder open iconتنظیم Timezone در لینوکس
  • Folder icon closed Folder open iconتنظیم NTP در لینوکس
  • Folder icon closed Folder open iconبروزرسانی سیستم در لینوکس
  • Folder icon closed Folder open iconساخت کاربر جدید در لینوکس
  • Folder icon closed Folder open iconایجاد کاربران و گروه ها در لینوکس
  • Folder icon closed Folder open iconآموزش ACL در لینوکس؛ مدیریت سطح دسترسی پیشرفته برای کاربران و گروه‌ها
  • Folder icon closed Folder open iconآموزش umask در لینوکس؛ تعیین مجوز پیش‌فرض فایل‌ها و پوشه‌های جدید
  • Folder icon closed Folder open iconآموزش فایل sudoers؛ مدیریت دسترسی کاربران به دستورات مدیریتی در لینوکس
  • Folder icon closed Folder open iconآموزش دستور chown در لینوکس
  • Folder icon closed Folder open iconآموزش دستور chmod در لینوکس
  • Folder icon closed Folder open iconSticky Bit در لینوکس چیست؟ آموزش افزایش امنیت پوشه‌های اشتراکی
  • Folder icon closed Folder open iconآموزش SUID در لینوکس؛ اجرای برنامه‌ها با دسترسی مالک فایل
  • Folder icon closed Folder open iconآموزش SGID در لینوکس؛ مدیریت دسترسی گروه‌ها و اجرای برنامه‌ها
  • Folder icon closed Folder open iconآموزش ریست پسورد ubuntu
  • Folder icon closed Folder open iconآموزش ریست پسورد Debian
  • Folder icon closed Folder open iconاگر منابع سرور لینوکسی کامل درگیر شد چکار کنیم ؟
  • Folder icon closed Folder open iconآموزش تست استرس سرور لینوکس
  • Folder icon closed Folder open iconآموزش کامل systemctl
  • Folder icon closed Folder open iconساخت سرویس سفارشی در Systemd
  • Folder icon closed Folder open iconآموزش کامل cron
  • Folder icon closed Folder open iconآموزش کامل OpenSSL در لینوکس
  • Folder icon closed Folder open iconآموزش کامل htop در لینوکس
  • Folder icon closed Folder open iconآموزش کامل دستور kill در لینوکس
  • Folder icon closed Folder open iconآموزش کامل دستور df در لینوکس
  • Folder icon closed Folder open iconآموزش کامل دستور du در لینوکس
  • Folder icon closed Folder open iconآموزش کامل دستور lsblk در لینوکس
  • Folder icon closed Folder open iconآموزش کامل journalctl در لینوکس
  • Folder icon closed Folder open iconپیدا کردن فایل‌های حجیم در لینوکس
  • Folder icon closed Folder open iconپیدا کردن فایل‌های حجیم در لینوکس
  • Folder icon closed Folder open iconپیدا کردن پردازش‌های مصرف‌کننده CPU
  • Folder icon closed Folder open iconTerminal Multiplexer چیست؟ آشنایی با Screen، tmux و ابزارهای مشابه
    • آموزش Screen در لینوکس؛ مدیریت Sessionها و پردازش‌های طولانی
    • آموزش tmux در لینوکس؛ مدیریت Session، Window و Pane
    • اجرای پردازش‌های طولانی پس از قطع SSH با Screen و tmux
    • شخصی‌سازی Screen با فایل .screenrc
    • شخصی‌سازی tmux با فایل .tmux.conf
    • مقایسه Screen و tmux؛ کدام Terminal Multiplexer مناسب‌تر است؟
    • تفاوت nohup، Screen، tmux و systemd؛ کدام روش برای اجرای پردازش‌ها مناسب است؟
  • Folder icon closed Folder open iconتست SMTP در لینوکس به سمت مقصد
  • Folder icon closed Folder open iconآموزش بررسی وضعیت ارسال ایمیل در Track Delivery
  • Folder icon closed Folder open iconآموزش انتقال خودکار ایمیل‌ها به یک پوشه(mailenable , roundcube)
  • Folder icon closed Folder open iconآموزش مسدود کردن یک فرستنده در Webmail (Roundcube و MailEnable)
  • Folder icon closed Folder open iconآموزش تعریف Email Filter در cPanel
  • Folder icon closed Folder open iconآموزش بررسی فایل‌های لاگ در /var/log لینوکس
  • Folder icon closed Folder open iconآموزش grep برای جستجوی خطا در لاگ‌های لینوکس
  • Folder icon closed Folder open iconjournalctl -b؛ بررسی خطاهای Boot در لینوکس
  • Folder icon closed Folder open iconlogrotate؛ مدیریت و چرخش لاگ‌ها در لینوکس
  • Folder icon closed Folder open iconآموزش ریست پسورد centos 7
  • Folder icon closed Folder open iconآموزش ریست پسورد فراموش‌شده root در AlmaLinux 8.7 و AlmaLinux 9.1
  • Folder icon closed Folder open iconچرا در سرور لینوکس فضای دیسک آزاد نمی‌شود؟ آموزش کامل عیب‌یابی فضای Disk
لینوکس

logrotate؛ مدیریت و چرخش لاگ‌ها در لینوکس

Linux logrotate

فایل‌های Log در یک سرور لینوکسی می‌توانند به‌مرور زمان بسیار بزرگ شوند. اگر سرویسی دائماً اطلاعاتی مانند Requestها، Errorها یا Eventهای سیستم را ثبت کند، ممکن است یک فایل Log طی چند روز یا چند هفته چندین گیگابایت فضا اشغال کند.

ابزار Linux logrotate برای مدیریت همین وضعیت طراحی شده است. logrotate می‌تواند فایل‌های Log را به‌صورت خودکار:

  • Rotate کند.
  • نسخه‌های قدیمی را نگهداری یا حذف کند.
  • Logهای قدیمی را فشرده کند.
  • فایل Log جدید ایجاد کند.
  • بر اساس زمان یا حجم فایل Rotation انجام دهد.
  • بعد از Rotation یک Command یا Script اجرا کند.

طبق Manual رسمی، logrotate برای مدیریت تعداد زیادی فایل Log و انجام خودکار Rotation، فشرده‌سازی و حذف Logهای قدیمی طراحی شده است.

در این مقاله ساختار تنظیمات logrotate، مقادیر مهم، روش ساخت Rule سفارشی و نحوه تست تنظیمات را بررسی می‌کنیم.


Log Rotation چیست؟

فرض کنید Application زیر فایل:

/var/log/myapp/app.log

را ایجاد می‌کند.

بعد از مدتی حجم فایل ممکن است به چند گیگابایت برسد.

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

app.log
app.log.1
app.log.2.gz
app.log.3.gz
app.log.4.gz

در این ساختار:

app.log

فایل فعال است.

نسخه قبلی:

app.log.1

و نسخه‌های قدیمی‌تر ممکن است فشرده شده باشند:

app.log.2.gz
app.log.3.gz

بعد از رسیدن به تعداد مشخصی نسخه، قدیمی‌ترین Log حذف می‌شود.


چرا Log Rotation اهمیت دارد؟

بدون Rotation ممکن است Logها به شکل زیر رشد کنند:

500 MB
2 GB
8 GB
20 GB
...

در نهایت ممکن است Partition مربوط به:

/
/var

پر شود.

در این شرایط Serviceها ممکن است دیگر نتوانند فایل ایجاد کنند یا حتی Database و Applicationها با خطا مواجه شوند.

بنابراین Log Rotation فقط برای مرتب نگه داشتن فایل‌ها نیست؛ بخشی از مدیریت فضای Disk سرور محسوب می‌شود.

برای بررسی فضای Disk:

آموزش کامل دستور df در لینوکس

و برای پیدا کردن مصرف فضای Directoryها:

آموزش کامل دستور du در لینوکس


بررسی نصب بودن logrotate

ابتدا اجرا کنید:

Bash
Copy
logrotate --version
Bash

اگر نصب باشد، نسخه برنامه نمایش داده می‌شود.

logrotate؛ مدیریت و چرخش لاگ‌ها در لینوکس

همچنین می‌توانید مسیر Binary را بررسی کنید:

Bash
Copy
which logrotate
Bash

معمولاً:

logrotate؛ مدیریت و چرخش لاگ‌ها در لینوکس

نمایش داده می‌شود.


نصب logrotate

در بسیاری از Distributionهای Server، logrotate به‌صورت پیش‌فرض نصب است.

در Ubuntu و Debian:

Bash
Copy
sudo apt install logrotate
Bash

در AlmaLinux، Rocky Linux و RHEL:

Bash
Copy
sudo dnf install logrotate
Bash

فایل‌های اصلی logrotate

دو مسیر مهم در بیشتر Distributionها عبارت‌اند از:

/etc/logrotate.conf

و:

/etc/logrotate.d/

فایل /etc/logrotate.conf معمولاً تنظیمات عمومی را نگهداری می‌کند. پوشه /etc/logrotate.d/ برای Ruleهای مربوط به Service یا Applicationهای مختلف استفاده می‌شود.


بررسی فایل اصلی logrotate.conf

برای مشاهده:

Bash
Copy
sudo less /etc/logrotate.conf
Bash

ممکن است محتوا مشابه زیر باشد:

logrotate؛ مدیریت و چرخش لاگ‌ها در لینوکس

این تنظیمات می‌توانند به‌عنوان Default برای Ruleهای دیگر استفاده شوند.


دستور include

خط:

include /etc/logrotate.d

به logrotate می‌گوید فایل‌های تنظیمات موجود در این Directory را نیز بخواند.

بنابراین معمولاً برای اضافه کردن Rule مربوط به Application جدید، فایل اصلی:

/etc/logrotate.conf

را تغییر نمی‌دهیم.

بهتر است یک فایل جداگانه مانند:

/etc/logrotate.d/myapp

ایجاد کنیم.

این ساختار configuration در توزیع‌های لینوکسی برای جلوگیری از تنظیمات اشتباه در فایل اصلی کانفیگ بسیار متداول است.


مشاهده Ruleهای موجود

اجرا کنید:

Bash
Copy
ls -lah /etc/logrotate.d/
Bash

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

apache2
nginx
rsyslog
mysql
php
dnf

محتوای یکی از آن‌ها را می‌توانید بررسی کنید:

Bash
Copy
sudo less /etc/logrotate.d/nginx
Bash

وجود فایل دقیق به Distribution و Packageهای نصب‌شده بستگی دارد.


ساختار یک Rule ساده

یک Rule ساده می‌تواند به شکل زیر باشد:

Bash
Copy
/var/log/myapp/app.log {
    daily<br>    rotate 7
    compress
    missingok
    notifempty
}
Bash

در این مثال daily یعنی Log روزانه بررسی و در صورت رسیدن زمان Rotation چرخانده شود.

rotate 7 یعنی ۷ نسخه قدیمی نگهداری شود.

compress نسخه‌های قدیمی را فشرده می‌کند.

missingok اگر فایل وجود نداشت، Error ایجاد نمی‌کند.

و notifempty از Rotate شدن فایل خالی جلوگیری می‌کند.


Directive مربوط به زمان Rotation

logrotate از چند بازه زمانی چرخش اصلی پشتیبانی می‌کند.

  • daily
  • weekly
  • monthly
  • yearly

rotate چه کاری انجام می‌دهد؟

تنظیم rotate 7 تعداد نسخه‌های قدیمی نگهداری‌شده را مشخص می‌کند.

مثلاً rotate 4 می‌تواند چیزی شبیه زیر ایجاد کند:

app.log
app.log.1
app.log.2
app.log.3
app.log.4

وقتی Rotation جدید انجام شود، قدیمی‌ترین نسخه حذف می‌شود.

Manual رسمی مشخص می‌کند که rotate 0 باعث می‌شود نسخه قدیمی نگهداری نشود.


فشرده‌سازی Logهای قدیمی با compress

برای کاهش مصرف فضای Disk:

compress

را استفاده کنید.

در این حالت Logهای قدیمی معمولاً با gzip فشرده می‌شوند:

app.log.2.gz
app.log.3.gz

برای مشاهده فایل Compressشده:

Bash
Copy
zless /var/log/myapp/app.log.2.gz
Bash

و برای جستجو:

Bash
Copy
zgrep -i "error" /var/log/myapp/app.log.2.gz
Bash

مقاله مرتبط:

آموزش جستجوی خطا در لاگ‌های لینوکس با grep


delaycompress چیست؟

گاهی بهتر است آخرین Log Rotate شده بلافاصله Compress نشود.

در این حالت delaycompress استفاده می‌شود.

مثلاً:

app.log
app.log.1
app.log.2.gz
app.log.3.gz

نسخه app.log.1 هنوز Compress نشده و در Rotation بعدی فشرده می‌شود.

delaycompress مخصوصاً زمانی مفید است که Application برای مدت کوتاهی هنوز به فایل Rotate شده نیاز داشته باشد.


جلوگیری از Rotate شدن فایل خالی

تنظیم notifempty باعث می‌شود اگر Log حجم صفر داشته باشد، Rotation انجام نشود.

در مقابل حالت Default مربوط به ifempty اجازه Rotation فایل خالی را می‌دهد.


missingok چیست؟

اگر Rule به فایلی اشاره کند که وجود ندارد، logrotate به‌صورت پیش‌فرض می‌تواند Error گزارش کند.

با missingok نبودن فایل مشکلی ایجاد نمی‌کند و logrotate سراغ Rule بعدی می‌رود.

برای Applicationهایی که همیشه Log File را ایجاد نمی‌کنند، این Directive مفید است.


Rotation بر اساس حجم فایل

گاهی نمی‌خواهیم منتظر Daily یا Weekly Rotation بمانیم.

مثلاً اگر Log به 500M رسید، باید Rotate شود.

می‌توان استفاده کرد:

size 500M

مثلاً:

Bash
Copy
/var/log/myapp/app.log {
    size 500M
    rotate 5
    compress
}
Bash

در این حالت فایل زمانی Rotate می‌شود که از حجم تعیین‌شده عبور کند.

Manual رسمی اندازه‌هایی مانند k، M و G را برای Directive size پشتیبانی می‌کند.


تفاوت size و minsize

size عملاً معیار Rotation را بر اساس حجم فایل قرار می‌دهد.

اما minsize 100M معمولاً همراه با یک Interval زمانی استفاده می‌شود.

مثلاً:

daily
minsize 100M

یعنی Log فقط در بازه روزانه Rotation و در صورتی Rotate شود که حداقل 100MB حجم داشته باشد.


maxsize چیست؟

تنظیم maxsize برای شرایطی مفید است که Rotation زمانی داریم، اما نمی‌خواهیم Log پیش از رسیدن زمان بعدی بیش از حد بزرگ شود.

مثلاً:

weekly
maxsize 500M

در این حالت Log طبق برنامه هفتگی Rotate می‌شود، اما اگر قبل از آن از 500MB عبور کند می‌تواند زودتر Rotate شود.


نکته مهم درباره size و Interval زمانی

هنگام استفاده از:

size

در کنار:

daily
weekly
monthly

باید دقت کنید.

طبق Manual، size با Intervalهای زمانی حالت متقابل دارد و ترتیب Directiveها می‌تواند روی نتیجه اثر بگذارد.

اگر هدف شما ترکیب زمان و حجم است، معمولاً minsize یا maxsize انتخاب واضح‌تری است.


ایجاد فایل Log جدید با create

بعد از Rename شدن Log قدیمی، ممکن است Application به فایل جدید نیاز داشته باشد.

تنظیم create فایل جدید ایجاد می‌کند.

مثلاً:

create 0640 myapp adm

به معنی ایجاد Log جدید با:

Permission: 0640
Owner: myapp
Group: adm

است.

نمونه کامل:

Bash
Copy
/var/log/myapp/app.log {
    daily
    rotate 7
    compress
    missingok
    notifempty
    create 0640 myapp adm
}
Bash

User و Group باید مطابق Application واقعی تنظیم شوند.


چرا Owner و Group فایل Log اهمیت دارند؟

اگر بعد از Rotation فایل جدید با Owner اشتباه ساخته شود، ممکن است Application دیگر نتواند داخل آن Log بنویسد.

برای مثال اگر Service با کاربر myapp اجرا شود اما Log جدید:

root:root

باشد، ممکن است با:

Permission denied

مواجه شود.

برای بررسی فایل فعلی:

Bash
Copy
ls -l /var/log/myapp/app.log
Bash

یا:

Bash
Copy
stat /var/log/myapp/app.log
Bash

را اجرا کنید.

قبل از تنظیم create بهتر است Owner و Permission فایل فعلی را بررسی کنید.


چرا بعضی Serviceها بعد از Rotation هنوز در فایل قدیمی می‌نویسند؟

در Linux یک Process می‌تواند File Descriptor فایل Log را باز نگه دارد.

اگر logrotate فایل app.log را Rename کند

app.log.1

Process ممکن است همچنان همان File Descriptor قبلی را داشته باشد.

در نتیجه Logها همچنان وارد app.log.1 می‌شوند.

برای حل این موضوع معمولاً Service باید به شکلی مطلع شود که Log File را دوباره باز کند.

اینجاست که:

postrotate

کاربرد پیدا می‌کند.


اجرای Command بعد از Rotation با postrotate

ساختار:

Bash
Copy
postrotate
    COMMAND
endscript
Bash

است.

مثلاً:

Bash
Copy
/var/log/myapp/app.log {
    daily
    rotate 7
    compress
    missingok
    notifempty
    create 0640 myapp adm

    postrotate
        systemctl reload myapp.service >/dev/null 2>&1 || true
    endscript
}
Bash

در این مثال بعد از چرخش لاگ،Service مجددا اجرا می‌شود.

اما این Command فقط زمانی صحیح است که Application شما:

systemctl reload

را پشتیبانی کند.

برای هر Service باید روش مناسب Reopen کردن Logها از Documentation همان Application بررسی شود.


prerotate چیست؟

اگر لازم باشد قبل از Rotation یک Command اجرا شود:

Bash
Copy
prerotate
    COMMAND
endscript
Bash

استفاده می‌شود.

مثلاً ممکن است Application نیاز داشته باشد قبل از Rotation یک عملیات خاص انجام دهد.

در بیشتر Ruleهای معمولی نیازی به prerotate نیست.


sharedscripts چیست؟

فرض کنید Rule چند Log را پوشش می‌دهد:

/var/log/myapp/*.log

بدون تنظیم خاص، Scriptهای postrotate ممکن است برای هر Log اجرا شوند.

با:

sharedscripts

Script یک‌بار برای کل مجموعه اجرا می‌شود.

مثلاً:

Bash
Copy
/var/log/myapp/*.log {
    daily
    rotate 7
    compress
    sharedscripts

    postrotate
        systemctl reload myapp.service >/dev/null 2>&1 || true
    endscript
}
Bash

copytruncate چیست؟

بعضی Applicationها امکان باز کردن مجدد فایل Log بعد از تغییر نام را ندارند.

در این شرایط ممکن است از:

copytruncate

استفاده شود.

مثلاً:

Bash
Copy
/var/log/legacy-app/app.log {
    daily
    rotate 7
    compress
    copytruncate
}
Bash

در این روش logrotate ابتدا محتویات فایل را Copy کرده و سپس فایل اصلی را خالی می‌کند.

بنابراین Application همچنان همان فایل را باز نگه می‌دارد.


آیا copytruncate بهترین روش است؟

خیر.

copytruncate معمولاً یک روش جایگزین برای Applicationهایی است که نمی‌توانند Log را مجددا باز کنند.

بین مرحله Copy و Truncate یک بازه زمانی کوتاه وجود دارد و ممکن است بعضی Log Entryها در این فاصله از دست بروند. این محدودیت در Manual رسمی logrotate نیز ذکر شده است.

اگر Application از Signal یا Reload برای Reopen کردن Log پشتیبانی می‌کند، معمولاً همان روش انتخاب بهتری است.


نمونه Rule پیشنهادی برای یک Application

فرض کنیم Application این فایل را ایجاد می‌کند:

/var/log/myapp/app.log

یک Rule مناسب می‌تواند باشد:

Bash
Copy
/var/log/myapp/app.log {
    daily
    rotate 14
    compress
    delaycompress
    missingok
    notifempty
    create 0640 myapp adm

    postrotate
        systemctl reload myapp.service >/dev/null 2>&1 || true
    endscript
}
Bash

این تنظیم:

  • هر روز Rotation را بررسی می‌کند.
  • 14 نسخه قدیمی نگه می‌دارد.
  • Logهای قدیمی را Compress می‌کند.
  • آخرین Log Rotate شده را تا Rotation بعدی Compress نمی‌کند.
  • فایل خالی را Rotate نمی‌کند.
  • نبودن Log را Error در نظر نمی‌گیرد.
  • فایل جدید با Permission مشخص می‌سازد.
  • بعد از Rotation سرویس را Reload می‌کند.

User، Group و Command مربوط به postrotate باید متناسب با Application واقعی تغییر کنند.


ایجاد فایل تنظیمات سفارشی

فایل جدید ایجاد کنید:

Bash
Copy
sudo nano /etc/logrotate.d/myapp
Bash

و مثلاً قرار دهید:

Bash
Copy
/var/log/myapp/app.log {
    daily
    rotate 7
    compress
    delaycompress
    missingok
    notifempty
    create 0640 myapp adm
}
Bash

سپس فایل را ذخیره کنید.


قبل از اجرای واقعی تنظیمات را تست کنید

یکی از مهم‌ترین Commandها:

Bash
Copy
sudo logrotate -d /etc/logrotate.conf
Bash

است.

گزینه -d یا --debug تنظیمات را بررسی می‌کند، اما تغییری در Logها ایجاد نمی‌کند و State File را نیز Update نمی‌کند.

این Command قبل از اعمال Rule جدید بسیار مهم است.


تست فقط یک Rule

اگر فقط فایل جدید:

/etc/logrotate.d/myapp

را می‌خواهید بررسی کنید:

Bash
Copy
sudo logrotate -d /etc/logrotate.d/myapp
Bash

این روش برای پیدا کردن Syntax Error بسیار مناسب است.


مشاهده خروجی بیشتر با verbose

برای نمایش جزئیات بیشتر:

Bash
Copy
sudo logrotate -v /etc/logrotate.conf
Bash

یا:

Bash
Copy
sudo logrotate -v /etc/logrotate.d/myapp
Bash

گزینه -v اطلاعات بیشتری درباره logrotate نمایش می‌دهد.


اجرای اجباری Rotation

برای Force کردن Rotation:

Bash
Copy
sudo logrotate -f /etc/logrotate.conf
Bash

یا فقط Rule موردنظر:

Bash
Copy
sudo logrotate -f /etc/logrotate.d/myapp
Bash

گزینه -fباعث می‌شود Rotation انجام شود حتی اگر logrotate تشخیص دهد هنوز زمان آن نرسیده انجام شود.


مراقب logrotate -f باشید

روی Production Server بدون دلیل از logrotate -f برای تمام Configuration استفاده نکنید.

این دستور می‌تواند تمام Ruleهای واجد شرایط را به‌صورت اجباری Rotate کند.

برای تست Rule جدید بهتر است ابتدا logrotate -d و در صورت نیاز فقط همان فایل:

Bash
Copy
sudo logrotate -f /etc/logrotate.d/myapp
Bash

را اجرا کنید.


State File چیست؟

logrotate باید بداند هر Log آخرین بار چه زمانی Rotate شده است.

این اطلاعات معمولاً در State File ذخیره می‌شوند.

مسیر رایج:

/var/lib/logrotate/status

برای مشاهده:

Bash
Copy
sudo cat /var/lib/logrotate/status
Bash

ممکن است ببینید:

"/var/log/syslog" 2026-9-7-0:0:0
"/var/log/nginx/access.log" 2026-9-7-0:0:0

چرا Rule من Rotate نمی‌شود؟

یکی از علت‌های رایج این است که طبق State File هنوز زمان Rotation بعدی نرسیده است.

مثلاً daily است اما همان روز قبلاً اجرا شده.

برای بررسی:

Bash
Copy
sudo logrotate -d /etc/logrotate.d/myapp
Bash

معمولاً logrotate دلیل Rotate نکردن را نمایش می‌دهد.


logrotate چه زمانی اجرا می‌شود؟

خود logrotate یک Daemon دائماً در حال اجرا نیست.

معمولاً یک Scheduler آن را به‌صورت دوره‌ای اجرا می‌کند.

بسته به Distribution ممکن است این کار توسط:

systemd timer

یا:

cron

انجام شود.

Manual فعلی نیز اشاره می‌کند که logrotate معمولاً توسط Cron Job روزانه یا logrotate.timer در سیستم‌های systemd اجرا می‌شود.


بررسی logrotate.timer

روی سیستم‌هایی که از systemd Timer استفاده می‌کنند:

Bash
Copy
systemctl status logrotate.timer
Bash

را اجرا کنید.

logrotate؛ مدیریت و چرخش لاگ‌ها در لینوکس

بررسی Service مربوط به logrotate

برای مشاهده آخرین اجرا:

Bash
Copy
systemctl status logrotate.service
Bash

یا:

Bash
Copy
journalctl -u logrotate.service
Bash

این Log هنگام عیب‌یابی خطای خود logrotate مفید است.


اگر logrotate.timer وجود نداشت

ممکن است Distribution از Cron استفاده کند.

مسیرهای متداول:

/etc/cron.daily/logrotate

یا Configuration مشابه در Cron هستند.

بررسی کنید:

Bash
Copy
ls -l /etc/cron.daily/ | grep logrotate
Bash

بنابراین نبودن logrotate.timer الزاماً به معنی غیرفعال بودن Rotation نیست.


Rotation ساعتی

تنظیم hourly وجود دارد، اما یک نکته مهم دارد. اگر خود logrotate فقط روزی یک بار اجرا شود، قرار دادن hourly داخل Rule باعث اجرای واقعی Rotation در هر ساعت نمی‌شود.

Scheduler نیز باید logrotate را حداقل هر ساعت اجرا کند. Manual رسمی روی همین نکته تأکید می‌کند.


استفاده از Wildcard

می‌توان چند Log را با یک Rule مدیریت کرد:

Bash
Copy
/var/log/myapp/*.log {
    daily
    rotate 7
    compress
    missingok
    notifempty
}
Bash

اما در استفاده از * باید دقت کرد.

اگر Pattern بیش از حد عمومی باشد، ممکن است فایل‌های Rotateشده قبلی نیز Match شوند.

*.log معمولاً از * امن‌تر و دقیق‌تر است.


استفاده از su

اگر Log داخل Directoryای قرار دارد که توسط User غیر Root کنترل می‌شود، تنظیم su می‌تواند اهمیت داشته باشد.

مثلاً:

su myapp myapp

نمونه:

Bash
Copy
/home/myapp/logs/*.log {
    daily
    rotate 7
    compress
    su myapp myapp
}
Bash

بررسی فایل‌های Rotate شده

بعد از اجرای Rotation:

Bash
Copy
ls -lh /var/log/myapp/
Bash

را اجرا کنید.

ممکن است ببینید:

app.log
app.log.1
app.log.2.gz
app.log.3.gz

همچنین باید بررسی کنید Application همچنان داخل:

app.log

Log جدید می‌نویسد.


پیدا کردن Processی که فایل Log را باز نگه داشته است

می‌توانید از:

Bash
Copy
sudo lsof /var/log/myapp/app.log
Bash

یا برای نسخه Rotateشده از:

Bash
Copy
sudo lsof /var/log/myapp/app.log.1
Bash

استفاده کنید.

اگر Process همچنان فایل قدیمی را باز نگه داشته باشد، در خروجی مشخص می‌شود.


آیا باید Logهای بزرگ را دستی حذف کنیم؟

اگر یک Log بسیار بزرگ شده است، اولین اقدام نباید:

Bash
Copy
rm /var/log/example.log
Bash

باشد.

ابتدا بررسی کنید چرا Log رشد کرده است:

Bash
Copy
tail -n 100 /var/log/example.log
Bash

یا:

Bash
Copy
grep -Ei "error|failed|warning" /var/log/example.log | tail
Bash

ممکن است یک Error دائماً تکرار شود.

در این شرایط logrotate فقط مصرف Disk را مدیریت می‌کند؛ علت اصلی رشد Log همچنان باید برطرف شود.


logrotate جایگزین رفع خطا نیست

فرض کنید Application هر ثانیه این پیام را ثبت می‌کند:

Database connection failed
Database connection failed
Database connection failed

Log Rotation می‌تواند فایل را کوچک‌تر نگه دارد، اما مشکل اصلی یعنی Database Connection همچنان وجود دارد.

بنابراین:

Large log
    ↓
Find repeating message
    ↓
Fix the cause
    ↓
Configure proper rotation

رویکرد صحیح‌تری است.


تفاوت logrotate و systemd Journal Rotation

logrotate عمدتاً برای File Logهای معمولی استفاده می‌شود:

/var/log/nginx/error.log
/var/log/myapp/app.log
/var/log/messages

اما فایل‌های Binary مربوط به:

systemd-journald

با مکانیزم داخلی Journal مدیریت می‌شوند.

برای مثال محدودیت‌های Journal از طریق:

/etc/systemd/journald.conf

کنترل می‌شوند.

پس فایل‌های داخل:

/var/log/journal/

را نباید مانند یک Log معمولی با Rule سفارشی logrotate مدیریت کرد.

برای آموزش Journal:

آموزش کامل journalctl در لینوکس


مثال: نگهداری 30 روز Log

اگر روزانه Rotation انجام شود و:

rotate 30

تنظیم شود:

Bash
Copy
/var/log/myapp/app.log {
    daily
    rotate 30
    compress
    missingok
    notifempty
}
Bash

تقریباً 30 نسخه Daily نگهداری می‌شود.

البته مدت واقعی نگهداری به Frequency اجرای logrotate و شرایط Rotation بستگی دارد.


مثال: Rotation با حجم 1GB

برای Log بسیار پرحجم:

Bash
Copy
/var/log/myapp/app.log {
    size 1G
    rotate 5
    compress
    missingok
    notifempty
}
Bash

وقتی Log از 1GB عبور کند و logrotate اجرا شود، امکان Rotation وجود دارد.

نکته مهم این است که logrotate فایل را لحظه‌ای Monitor نمی‌کند.

اگر Scheduler فقط روزی یک‌بار اجرا شود، ممکن است Log مدت زیادی بالاتر از 1GB باقی بماند.


مثال: Daily Rotation با سقف 500MB

برای ترکیب زمان و حداکثر حجم:

Bash
Copy
/var/log/myapp/app.log {
    daily
    maxsize 500M
    rotate 14
    compress
    missingok
    notifempty
}
Bash

این مدل برای Applicationهایی مناسب است که معمولاً Daily Rotation کافی است اما گاهی Log به‌سرعت رشد می‌کند.


خطای Permission denied در logrotate

اگر هنگام اجرا خطایی مشابه:

Permission denied

مشاهده کردید، موارد زیر را بررسی کنید:

  • Owner و Group فایل Log
  • Permission Directory
  • Directive create
  • Directive su
  • User مربوط به Application
  • SELinux در Distributionهای دارای SELinux

فقط با اجرای:

chmod 777

مشکل را حل نکنید.

Permissionهای باز می‌توانند یک ایراد امنیتی ایجاد کنند.


خطای bad rotation count یا Syntax Error

اگر Configuration اشتباه باشد، logrotate -d معمولاً Error را نشان می‌دهد.

مثلاً:

Bash
Copy
sudo logrotate -d /etc/logrotate.d/myapp
Bash

قبل از قرار دادن Rule در Production، همین Command را اجرا کنید.


بعد از تغییر Rule چه کنیم؟

یک Workflow مناسب:

Edit rule
   ↓
logrotate -d
   ↓
Check for errors
   ↓
logrotate -f on that rule if needed
   ↓
Check rotated files
   ↓
Check application still writes logs

Workflow پیشنهادی برای ساخت Rule جدید

فرض کنیم Application فایل زیر را تولید می‌کند:

/var/log/myapp/app.log

1. بررسی فایل

Bash
Copy
ls -lh /var/log/myapp/app.log
Bash

2. بررسی Owner

Bash
Copy
stat /var/log/myapp/app.log
Bash

3. ایجاد Rule

Bash
Copy
sudo nano /etc/logrotate.d/myapp
Bash

4. اضافه کردن تنظیمات

Bash
Copy
/var/log/myapp/app.log {
    daily
    rotate 14
    compress
    delaycompress
    missingok
    notifempty
    create 0640 myapp adm
}
Bash

5. بررسی Syntax

Bash
Copy
sudo logrotate -d /etc/logrotate.d/myapp
Bash

6. اجرای تست در صورت نیاز

Bash
Copy
sudo logrotate -f /etc/logrotate.d/myapp
Bash

7. بررسی نتیجه

Bash
Copy
ls -lh /var/log/myapp/
Bash

8. بررسی ادامه Logging

Bash
Copy
tail -f /var/log/myapp/app.log
Bash

اشتباهات رایج

حذف دستی Logهای بزرگ بدون بررسی علت

ممکن است Log چند ساعت بعد دوباره پر شود.


استفاده از copytruncate برای همه Applicationها

اگر Application قابلیت Reopen کردن Log دارد، معمولاً روش Rename + Signal/Reload مناسب‌تر است.


تنظیم create با Owner اشتباه

ممکن است Service بعد از Rotation دیگر نتواند Log بنویسد.


استفاده از hourly بدون Scheduler ساعتی

اگر logrotate فقط روزی یک بار اجرا شود، Rule ساعتی نیز روزی یک بار بررسی می‌شود.


استفاده بی‌احتیاط از Wildcard

Rule زیر:

/var/log/myapp/*

می‌تواند فایل‌های بیشتری از چیزی که انتظار دارید Match کند.


اجرای logrotate -f /etc/logrotate.conf برای یک تست کوچک

این Command ممکن است Ruleهای متعدد سیستم را Force کند.

بهتر است Rule خودتان را جداگانه تست کنید.


عدم بررسی Log بعد از Rotation

ممکن است Rotation انجام شده باشد ولی Application همچنان داخل فایل قدیمی بنویسد.


استفاده از Permission برابر 777

مشکل Owner یا Access را با Permission ناامن پنهان نکنید.


دستورات سریع logrotate

هدفدستور
نمایش نسخهlogrotate --version
بررسی تنظیمات اصلیlogrotate -d /etc/logrotate.conf
بررسی یک Rulelogrotate -d /etc/logrotate.d/myapp
اجرای Verboselogrotate -v /etc/logrotate.conf
Force یک Rulelogrotate -f /etc/logrotate.d/myapp
مشاهده Statecat /var/lib/logrotate/status
بررسی Timersystemctl status logrotate.timer
مشاهده Timerهاsystemctl list-timers | grep logrotate
بررسی Servicesystemctl status logrotate.service
Log اجرای logrotatejournalctl -u logrotate.service

مطالعه بیشتر

مقالات مرتبط در دانشنامه:

  • آموزش بررسی فایل‌های لاگ در /var/log لینوکس
  • آموزش جستجوی خطا در لاگ‌های لینوکس با grep
  • آموزش کامل journalctl در لینوکس
  • آموزش کامل دستور df در لینوکس
  • آموزش کامل دستور du در لینوکس
  • پیدا کردن فایل‌های حجیم در لینوکس

منابع خارجی:

  • logrotate(8) — Linux Manual Page
  • logrotate — Upstream Project
  • Debian Manpages — logrotate(8)
  • Red Hat Documentation — Log Rotation

جمع‌بندی

ابزار logrotate برای جلوگیری از رشد بدون کنترل فایل‌های Log و مدیریت نسخه‌های قدیمی استفاده می‌شود.

تنظیمات اصلی معمولاً در:

/etc/logrotate.conf

و Ruleهای مربوط به Applicationها در:

/etc/logrotate.d/

قرار دارند.

یک Rule ساده می‌تواند شامل:

daily
rotate 7
compress
missingok
notifempty

باشد.

قبل از اعمال Rule جدید بهتر است همیشه از:

Bash
Copy
logrotate -d
Bash

استفاده شود، زیرا Debug Mode بدون تغییر فایل‌ها و State File نتیجه Configuration را بررسی می‌کند.

در صورت نیاز می‌توان یک Rule را با:

Bash
Copy
logrotate -f
Bash

به‌صورت اجباری اجرا کرد، اما بهتر است این کار فقط روی Configuration موردنظر انجام شود.

همچنین هنگام انتخاب بین:

create + postrotate

و:

copytruncate

باید رفتار Application را در نظر گرفت. copytruncate برای بعضی Applicationهای قدیمی کاربرد دارد، اما به دلیل فاصله کوتاه میان Copy و Truncate احتمال از دست رفتن بخشی از Log وجود دارد.

در نهایت logrotate فقط حجم و نگهداری Log را مدیریت می‌کند؛ اگر یک Error دائماً باعث رشد فایل شود، علت اصلی آن خطا نیز باید جداگانه پیدا و رفع شود.

هنوز نیاز به کمک دارید؟

آیا سوالی دارید؟

آیا این مقاله برای شما مفید بود؟ بله خیر

نظرات خود را بنویسید... لغو پاسخ

اشتراک گذاری این مقاله

logrotate؛ مدیریت و چرخش لاگ‌ها در لینوکس

کپی کردن لینک

Clipboard Icon

جدیدترین مقالات

آموزش نصب و راه‌اندازی RustDesk Server با Docker
آموزش نصب و راه‌اندازی RustDesk Server با Docker
2 minutes جولای 2, 2026
آموزش نصب و راه‌اندازی Matrix Synapse + Element Web + Coturn با Docker روی ...
4 minutes جولای 2, 2026
CXS چیست و چگونه کار می‌کند
1 minute می 3, 2026
ساخت سرور چت المنت بروی لینوکس
5 minutes آوریل 25, 2026
Geo Routing و Geo DNS
2 minutes آوریل 22, 2026

تقویم

سپتامبر 2026
شیدسچپج
 1234
567891011
12131415161718
19202122232425
2627282930 
« جولای    

عضویت

جدیدترین پست‌ها

آموزش نصب و راه‌اندازی RustDesk Server با Docker
آموزش نصب و راه‌اندازی RustDesk Server با Docker
2 minutes جولای 2, 2026
آموزش نصب و راه‌اندازی Matrix Synapse + Element Web + Coturn با Docker روی Ubuntu 24.04
4 minutes جولای 2, 2026
CXS چیست و چگونه کار می‌کند
1 minute می 3, 2026
ساخت سرور چت المنت بروی لینوکس
5 minutes آوریل 25, 2026
Geo Routing و Geo DNS
2 minutes آوریل 22, 2026

سلام