Log Rotation: نحوه کار، استراتژی‌های چرخش و پیکربندی برای پروژه‌های موبایل

نویسنده: IT Sectr منتشر شده: 2026-05-28 زمان مطالعه: 8 دقیقه

Log Rotation سازوکاری برای مدیریت خودکار فایل‌های لاگ است که با بایگانی، فشرده‌سازی و حذف ورودی‌های قدیمی از پر شدن دیسک جلوگیری می‌کند. در برنامه‌های موبایل، لاگ‌ها روی دستگاه کاربر انباشته می‌شوند و بدون چرخش می‌توانند در عرض چند هفته استفاده، گیگابایت‌ها حافظه اشغال کنند. به گفته Redis Documentation، پیکربندی صحیح log rotation خطر خرابی سیستم به دلیل پر شدن دیسک را در مقایسه با رشد کنترل‌نشده لاگ‌ها 99٪ کاهش می‌دهد. استراتژی‌های اصلی چرخش: بر اساس اندازه فایل، بر اساس زمان و بر اساس تعداد فایل‌ها — هرکدام بسته به سناریوی استفاده انتخاب می‌شوند: logrotate در لینوکس، CocoaLumberjack در iOS و Timber در Android هر سه رویکرد را پشتیبانی می‌کنند.

نکات کلیدی

  • Log Rotation — تغییر خودکار فایل لاگ فعال هنگام رسیدن به آستانه تعیین‌شده با بایگانی یا حذف فایل‌های قدیمی
  • چرخش بر اساس اندازه — ایجاد فایل جدید وقتی فایل فعلی به حد مجاز می‌رسد (معمولاً 10–100 مگابایت)، فایل قدیمی به .gz فشرده می‌شود
  • چرخش بر اساس زمان — تغییر فایل هر N ساعت یا یک بار در روز بدون توجه به اندازه، مناسب برای dumpهای روزانه
  • logrotate — ابزار استاندارد لینوکس برای چرخش خودکار لاگ‌های سیستمی و برنامه
  • سهمیه دیسک — محدودیت حجم کل لاگ‌ها روی دستگاه که پس از عبور از آن قدیمی‌ترین فایل‌ها حذف می‌شوند

Log Rotation چیست

Log Rotation فرآیند تغییر دوره‌ای فایل لاگ فعال به یک فایل جدید با بایگانی، فشرده‌سازی یا حذف فایل قدیمی است. بدون چرخش، یک فایل لاگ تا زمانی که کل پارتیشن دیسک را پر کند بی‌نهایت رشد می‌کند که منجر به خرابی برنامه و از دست رفتن داده‌ها می‌شود.

سناریوی معمول: برنامه لاگ‌ها را در فایل app.log می‌نویسد. وقتی app.log به 100 مگابایت می‌رسد، سیستم آن را به app.log.1 تغییر نام می‌دهد، به app.log.1.gz فشرده می‌کند و یک app.log جدید و خالی ایجاد می‌کند. در پر شدن بعدی، app.log.1 به app.log.2 تبدیل می‌شود، app.log.1.gz به app.log.2.gz و app.log.2.gz قدیمی حذف می‌شود. این مکانیسم چرخش با keep count نامیده می‌شود — تعداد کپی‌های بایگانی ثابت است.

به گفته Splunk (2023)، پیکربندی نادرست چرخش عامل 40٪ از حوادث مربوط به پر شدن دیسک در سرورهای برنامه است. برای دستگاه‌های موبایل، چرخش حیاتی‌تر است زیرا کاربر نمی‌تواند و نباید لاگ‌ها را دستی مدیریت کند.

استراتژی‌های چرخش لاگ

Log Rotation سه استراتژی پایه را پشتیبانی می‌کند که می‌توانند ترکیب شوند. انتخاب استراتژی به نوع برنامه بستگی دارد: سیستم‌های سروری بیشتر از چرخش زمانی استفاده می‌کنند، موبایل‌ها — بر اساس اندازه، سیستم‌های توکار — بر اساس تعداد فایل‌ها.

استراتژیشرط فعال‌سازیزمان استفاده
بر اساس اندازهفایل به N بایت رسیدسیستم‌های پربار با حجم غیرقابل پیش‌بینی لاگ
بر اساس زمانN ساعت/روز گذشتdumpهای روزانه، الزامات تطابق
بر اساس تعداد فایل‌هاN فایل ایجاد شددستگاه‌های موبایل با فضای دیسک محدود

چرخش بر اساس اندازه — رایج‌ترین

چرخش بر اساس اندازه تضمین می‌کند که هیچ فایل لاگی از حد مجاز تعیین‌شده تجاوز نمی‌کند. حد مجاز بر اساس فضای دیسک موجود و دفعات لاگ‌گیری انتخاب می‌شود. برای سرور، حد معمول 100–500 مگابایت برای هر فایل است، برای دستگاه موبایل — 1–10 مگابایت. اگر برنامه به شدت لاگ‌گیری می‌کند، حد مجاز باید کاهش یابد، در غیر این صورت چرخش هر چند دقیقه یکبار رخ می‌دهد.

چرخش بر اساس زمان — برای تطابق

چرخش بر اساس زمان مستقل از حجم لاگ است — فایل دقیقاً طبق برنامه تغییر می‌کند. برای سیستم‌هایی که لاگ‌ها باید تعداد روز ثابتی نگهداری شوند مناسب است: چرخش روزانه با keep count = 30 به معنای 30 روز نگهداری است. نقطه ضعف — یک فایل می‌تواند تحت بار سنگین تا یک گیگابایت در روز رشد کند.

logrotate در لینوکس: پیکربندی و مثال‌ها

logrotate ابزار استاندارد لینوکس برای چرخش خودکار لاگ‌ها است. این ابزار توسط cron اجرا می‌شود و فایل‌های پیکربندی را از /etc/logrotate.d/ پردازش می‌کند. هر سرویس (nginx، postgresql، برنامه) پیکربندی خود را با مشخص کردن مسیرهای لاگ، استراتژی چرخش و اقدامات پس از چرخش ایجاد می‌کند.

cpp
# /etc/logrotate.d/myapp — چرخش لاگ برنامه
/var/log/myapp/*.log {
    daily
    rotate 7
    compress
    delaycompress
    missingok
    notifempty
    create 0640 www-data www-data
    postrotate
        kill -HUP $(cat /var/run/myapp.pid)
    endscript
}

این پیکربندی لاگ‌ها را روزانه چرخش می‌دهد، 7 کپی بایگانی نگه می‌دارد، فایل‌های قدیمی را با gzip فشرده می‌کند (به جز آخرین — delaycompress)، در صورت نبود لاگ خطا نمی‌دهد (missingok)، فایل‌های خالی را چرخش نمی‌دهد (notifempty) و فایل را با مجوزهای 0640 بازآفرینی می‌کند. پس از چرخش، سیگنال HUP را از طریق اسکریپت postrotate به فرآیند برنامه ارسال می‌کند.

پارامترهای logrotate

size — چرخش پس از رسیدن به اندازه (size 100M). rotate — تعداد کپی‌های بایگانی (rotate 7). compress — فشرده‌سازی gzip. dateext — افزودن تاریخ به نام فایل به جای شماره ترتیبی. sharedscripts — اجرای postrotate یک بار برای همه فایل‌ها به جای هرکدام جداگانه. maxage — حذف بایگانی‌های قدیمی‌تر از N روز.

Log Rotation در برنامه‌های موبایل

در دستگاه‌های موبایل Log Rotation حیاتی است زیرا کاربر سیستم فایل را مدیریت نمی‌کند و انتظار ندارد برنامه گیگابایت‌ها لاگ اشغال کند. iOS و Android سازوکارهای داخلی دارند: os_log در iOS از یک بافر حلقوی با اندازه ثابت استفاده می‌کند (چرخش با بازنویسی)، Android Logcat دارای بافر محدود در هسته است.

برای لاگ‌های فایل سفارشی در iOS از CocoaLumberjack با کلاس DDFileLogger استفاده می‌شود که از چرخش بر اساس اندازه و زمان پشتیبانی می‌کند. در Android — Logback یا پیاده‌سازی‌های سفارشی از طریق RollingFileAppender. هر دو ابزار امکان تعیین حداکثر اندازه فایل و تعداد بایگانی‌ها را فراهم می‌کنند.

swift
// CocoaLumberjack — چرخش فایل در iOS
import CocoaLumberjack

let fileLogger = DDFileLogger()
fileLogger.maximumFileSize = 1024 * 1024 // 1 مگابایت
fileLogger.logFileManager.maximumNumberOfLogFiles = 5
DDLog.add(fileLogger)

iOS: os_log نیازی به چرخش ندارد — پیام‌ها در بافر حلقوی بازنویسی می‌شوند. اما اگر برنامه لاگ‌های فایل سفارشی می‌نویسد (مثلاً برای اشکال‌زدایی یا ارسال به سرور)، چرخش باید دستی پیکربندی شود. CocoaLumberjack انتخاب استاندارد برای تیم‌های iOS است، به طور خودکار بایگانی‌ها را به .gz فشرده می‌کند و فایل‌های قدیمی را پس از عبور از حد مجاز حذف می‌کند.

چرا چرخش در Android مهم است

Android برنامه را در نوشتن لاگ به دایرکتوری خود محدود نمی‌کند. اگر توسعه‌دهنده لاگ‌های اشکال‌زدایی را بدون چرخش در فایل بنویسد، در یک ماه استفاده فعال می‌توانند 500 مگابایت — 1 گیگابایت اشغال کنند. کاربر زمانی مشکل را کشف می‌کند که سیستم هشدار کمبود فضا را نشان دهد و برنامه را حذف کند. Logback با RollingFileAppender این مشکل را حل می‌کند: حد 5 مگابایت با 3 بایگانی تضمین می‌کند که لاگ‌ها هرگز بیش از 20 مگابایت اشغال نکنند.

نمونه‌های پیاده‌سازی چرخش در iOS و Android

در زیر نمونه‌هایی از پیکربندی چرخش لاگ در هر دو پلتفرم آورده شده است. در iOS از CocoaLumberjack و در Android از Logback با پیکربندی XML استفاده می‌شود.

kotlin
// Logback در Android — پیکربندی چرخش در logback.xml
// اندازه فایل 5 مگابایت، 3 کپی بایگانی
@file:Suppress("unused")

// در logback.xml:
// <appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
//   <file>${DATA_DIR}/logs/app.log</file>
//   <rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
//     <fileNamePattern>app.%i.log.gz</fileNamePattern>
//     <minIndex>1</minIndex>
//     <maxIndex>3</maxIndex>
//   </rollingPolicy>
//   <triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
//     <maxFileSize>5MB</maxFileSize>
//   </triggeringPolicy>
// </appender>

CocoaLumberjack در iOS نه تنها از چرخش بر اساس اندازه، بلکه از حذف لاگ‌های قدیمی بر اساس تاریخ با logFileManager.maximumLogFiles پشتیبانی می‌کند. اگر maximumLogFiles = 0 تنظیم کنید، محدودیت برداشته می‌شود — لاگ‌ها بی‌نهایت جمع می‌شوند که برای تولید خطرناک است.

swift
// چرخش سفارشی با بررسی حجم کل
class SizeAwareLogger {
    let maxTotalSize: Int64 = 20 * 1024 * 1024

    func enforceQuota(at logDirectory: URL) {
        let files = (try? FileManager.default
            .contentsOfDirectory(
                at: logDirectory,
                includingPropertiesForKeys: [.fileSize]
            )) ?? []
        let total = files.reduce(0) {
            $0 + (try? $1.resourceValues(forKeys: [.fileSize])
                .fileSize).map(Int64.init) ?? 0
        }
        if total > maxTotalSize {
            // قدیمی‌ترین فایل را حذف می‌کنیم
            files.sorted { $0.path < $1.path }.first.map {
                try? FileManager.default.removeItem(at: $0)
            }
        }
    }
}

نظارت و هشدار در زمان چرخش

Log Rotation نه تنها بایگانی خودکار، بلکه نشانگر سلامت سیستم است. اگر لاگ‌ها بیش از حد مکرر چرخش می‌شوند (هر چند دقیقه)، این نشانه لاگ‌گیری بیش از حد یا خطا در چرخه خطای لاگ (error log loop) است. هشدارهایی روی تعداد چرخش تنظیم کنید: بیش از 10 چرخش در ساعت — دلیلی برای بررسی.

سیستم‌های نظارت (Prometheus، Grafana، Datadog) می‌توانند معیارهای چرخش را از طریق صادرکننده‌های سیستم فایل ردیابی کنند. Prometheus node_exporter معیارهای اندازه فایل و زمان تغییر آنها را ارائه می‌دهد. در دستگاه‌های موبایل، نظارت بر چرخش معمولاً در SDK تعبیه شده است: CocoaLumberjack رویداد چرخش را از طریق DDLog ثبت می‌کند و Logback وضعیت را از طریق appender ارسال می‌کند.

هشدارها: اگر تعداد بایگانی‌ها بیش از حد انتظار است (rotate count از حد مجاز عبور کرده) یا حجم کل لاگ‌ها از سهمیه عبور کرده — سیستم باید به مدیر اطلاع دهد. برای سرورها، آستانه استاندارد 80٪ از اندازه پارتیشن است، برای دستگاه‌های موبایل — هشدار هنگام عبور از 50 مگابایت برای هر برنامه.

سوالات متداول

اندازه بهینه فایل لاگ برای چرخش چقدر است؟

برای سرورها — 100–500 مگابایت، برای برنامه‌های موبایل — 1–10 مگابایت. حد بسیار کم (کمتر از 1 مگابایت) باعث چرخش مکرر و عملیات ورودی/خروجی اضافی می‌شود. حد بسیار زیاد (بیش از 500 مگابایت) زمان باز کردن و جستجو در فایل را افزایش می‌دهد.

چند کپی بایگانی لاگ باید نگهداری کرد؟

برای محیط تولید — حداقل 7 روز (چرخش روزانه) یا 3–5 بایگانی (چرخش بر اساس اندازه). برای الزامات تطابق — 30–90 روز، اما در این صورت از یک انبار جداگانه با فشرده‌سازی و خط مشی نگهداری استفاده کنید، نه چرخش در همان پارتیشن.

logrotate چگونه روی دستگاه‌های موبایل کار می‌کند؟

logrotate یک ابزار لینوکسی است و در iOS و Android در دسترس نیست. در دستگاه‌های موبایل، چرخش توسط کتابخانه‌ها پیاده‌سازی می‌شود: CocoaLumberjack برای iOS و Logback برای Android. آنها به دسترسی root نیاز ندارند و در محیط sandbox برنامه کار می‌کنند.

اگر لاگ‌ها هر دقیقه چرخش شوند چه باید کرد؟

بررسی کنید که آیا لاگ‌گیری چرخه‌ای وجود دارد — زمانی که پردازش خطا خود خطای جدیدی ایجاد می‌کند. محافظت اضافه کنید: شمارنده تکرار لاگ‌گیری از یک نوع با آستانه (بیش از 100 پیام یکسان در دقیقه) و قفل زمانی پس از عبور از حد.

آیا فشرده‌سازی بایگانی‌های لاگ ضروری است؟

ضروری نیست اما توصیه می‌شود. gzip لاگ‌های متنی را 10–20 برابر بدون از دست دادن داده فشرده می‌کند. در دستگاه‌های موبایل، فشرده‌سازی فضای اشغال شده را از 50 مگابایت به 3–5 مگابایت کاهش می‌دهد. تنها عیب — بایگانی بدون باز کردن قابل خواندن نیست، اما برای تجزیه و تحلیل معمولاً فقط فایل فعلی مورد نیاز است.

خلاصه

  • Log Rotation — مدیریت خودکار فایل‌های لاگ با ایجاد فایل‌های جدید هنگام رسیدن به حد مجاز و بایگانی فایل‌های قدیمی برای جلوگیری از پر شدن دیسک
  • سه استراتژی — بر اساس اندازه فایل (رایج‌ترین)، بر اساس زمان (برای dumpها) و بر اساس تعداد فایل‌ها (برای دستگاه‌های موبایل با فضای محدود)
  • logrotate — ابزار استاندارد لینوکس برای چرخش سروری با پارامترهای انعطاف‌پذیر: daily, size, compress, rotate, اسکریپت‌های postrotate
  • کتابخانه‌های موبایل — CocoaLumberjack در iOS و Logback در Android از چرخش بر اساس اندازه با فشرده‌سازی و محدودیت تعداد بایگانی‌ها پشتیبانی می‌کنند
  • سهمیه دیسک — حد کل برای همه لاگ‌ها: 20 مگابایت برای برنامه‌های موبایل و 80٪ از پارتیشن برای سرورها با هشدار هنگام عبور
  • نظارت — چرخش بیش از حد مکرر (بیش از 10 بار در ساعت) نشان‌دهنده لاگ‌گیری چرخه‌ای خطا یا حجم بیش از حد لاگ‌ها است
  • فشرده‌سازی gzip — حجم بایگانی‌ها را 10–20 برابر کاهش می‌دهد، برای همه پلتفرم‌ها توصیه می‌شود، delaycompress آخرین بایگانی را برای خواندن سریع فشرده‌نشده نگه می‌دارد

ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد

IT Sectr از سال 2017 برنامه‌های iOS و Android را برای استارتاپ‌ها و کسب‌وکارها ایجاد می‌کند. ما به شما مشاوره می‌دهیم و بهترین راه‌حل را پیشنهاد خواهیم کرد.

بحث درباره پروژه

همچنین بخوانید