Log Rotation سازوکاری برای مدیریت خودکار فایلهای لاگ است که با بایگانی، فشردهسازی و حذف ورودیهای قدیمی از پر شدن دیسک جلوگیری میکند. در برنامههای موبایل، لاگها روی دستگاه کاربر انباشته میشوند و بدون چرخش میتوانند در عرض چند هفته استفاده، گیگابایتها حافظه اشغال کنند. به گفته Redis Documentation، پیکربندی صحیح log rotation خطر خرابی سیستم به دلیل پر شدن دیسک را در مقایسه با رشد کنترلنشده لاگها 99٪ کاهش میدهد. استراتژیهای اصلی چرخش: بر اساس اندازه فایل، بر اساس زمان و بر اساس تعداد فایلها — هرکدام بسته به سناریوی استفاده انتخاب میشوند: logrotate در لینوکس، CocoaLumberjack در iOS و Timber در Android هر سه رویکرد را پشتیبانی میکنند.
نکات کلیدی
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 ابزار استاندارد لینوکس برای چرخش خودکار لاگها است. این ابزار توسط cron اجرا میشود و فایلهای پیکربندی را از /etc/logrotate.d/ پردازش میکند. هر سرویس (nginx، postgresql، برنامه) پیکربندی خود را با مشخص کردن مسیرهای لاگ، استراتژی چرخش و اقدامات پس از چرخش ایجاد میکند.
# /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 به فرآیند برنامه ارسال میکند.
size — چرخش پس از رسیدن به اندازه (size 100M). rotate — تعداد کپیهای بایگانی (rotate 7). compress — فشردهسازی gzip. dateext — افزودن تاریخ به نام فایل به جای شماره ترتیبی. sharedscripts — اجرای postrotate یک بار برای همه فایلها به جای هرکدام جداگانه. maxage — حذف بایگانیهای قدیمیتر از N روز.
در دستگاههای موبایل Log Rotation حیاتی است زیرا کاربر سیستم فایل را مدیریت نمیکند و انتظار ندارد برنامه گیگابایتها لاگ اشغال کند. iOS و Android سازوکارهای داخلی دارند: os_log در iOS از یک بافر حلقوی با اندازه ثابت استفاده میکند (چرخش با بازنویسی)، Android Logcat دارای بافر محدود در هسته است.
برای لاگهای فایل سفارشی در iOS از CocoaLumberjack با کلاس DDFileLogger استفاده میشود که از چرخش بر اساس اندازه و زمان پشتیبانی میکند. در Android — Logback یا پیادهسازیهای سفارشی از طریق RollingFileAppender. هر دو ابزار امکان تعیین حداکثر اندازه فایل و تعداد بایگانیها را فراهم میکنند.
// 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 برنامه را در نوشتن لاگ به دایرکتوری خود محدود نمیکند. اگر توسعهدهنده لاگهای اشکالزدایی را بدون چرخش در فایل بنویسد، در یک ماه استفاده فعال میتوانند 500 مگابایت — 1 گیگابایت اشغال کنند. کاربر زمانی مشکل را کشف میکند که سیستم هشدار کمبود فضا را نشان دهد و برنامه را حذف کند. Logback با RollingFileAppender این مشکل را حل میکند: حد 5 مگابایت با 3 بایگانی تضمین میکند که لاگها هرگز بیش از 20 مگابایت اشغال نکنند.
در زیر نمونههایی از پیکربندی چرخش لاگ در هر دو پلتفرم آورده شده است. در iOS از CocoaLumberjack و در Android از Logback با پیکربندی XML استفاده میشود.
// 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 تنظیم کنید، محدودیت برداشته میشود — لاگها بینهایت جمع میشوند که برای تولید خطرناک است.
// چرخش سفارشی با بررسی حجم کل
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 یک ابزار لینوکسی است و در iOS و Android در دسترس نیست. در دستگاههای موبایل، چرخش توسط کتابخانهها پیادهسازی میشود: CocoaLumberjack برای iOS و Logback برای Android. آنها به دسترسی root نیاز ندارند و در محیط sandbox برنامه کار میکنند.
بررسی کنید که آیا لاگگیری چرخهای وجود دارد — زمانی که پردازش خطا خود خطای جدیدی ایجاد میکند. محافظت اضافه کنید: شمارنده تکرار لاگگیری از یک نوع با آستانه (بیش از 100 پیام یکسان در دقیقه) و قفل زمانی پس از عبور از حد.
ضروری نیست اما توصیه میشود. gzip لاگهای متنی را 10–20 برابر بدون از دست دادن داده فشرده میکند. در دستگاههای موبایل، فشردهسازی فضای اشغال شده را از 50 مگابایت به 3–5 مگابایت کاهش میدهد. تنها عیب — بایگانی بدون باز کردن قابل خواندن نیست، اما برای تجزیه و تحلیل معمولاً فقط فایل فعلی مورد نیاز است.
خلاصه
ما یک اپلیکیشن موبایل به صورت کلید در دست توسعه خواهیم داد
IT Sectr از سال 2017 برنامههای iOS و Android را برای استارتاپها و کسبوکارها ایجاد میکند. ما به شما مشاوره میدهیم و بهترین راهحل را پیشنهاد خواهیم کرد.
همچنین بخوانید