בעיה: דיסק מלא בלוגים — למה זה קורה ואיך logrotate עוזר
אנחנו מתמודדים מדי יום עם מצבים שבהם שרתי production קורסים ב-3 לפנות בוקר כי הדיסק מלא בלוגים. Nginx מחזיר 500 לכל המשתמשים — access.log שוקל 47 GB כי logrotate לא הוגדר לאחר deployment. קלאסי. תקריות כאלה מהוות כ-70% מכלל תקלות מערכת הדיסק. הניסיון שלנו (10+ שנים ב-DevOps) מראה שהגדרה נכונה של logrotate מפחיתה את הסיכון לקריסות ב-80%. לדוגמה, לקוח אחד איבד 2–3 שעות כל שבוע בהתאוששות מתקלות — לאחר הגדרת logrotate, זמן ההשבתה נפסק. הגדרת logrotate היא פתרון מוכח. צרו קשר כדי ליישם אותו בפרויקט שלכם.
Logrotate הוא כלי סטנדרטי לסיבוב לוגים בלינוקס. הוא רץ דרך cron (בדרך כלל /etc/cron.daily/logrotate) ומנוהל על ידי קובצי הגדרות ב-/etc/logrotate.conf ו-/etc/logrotate.d/. לפי המאמר Logrotate בוויקיפדיה, הוא תומך בדחיסה, סיבוב לפי גודל וזמן, וביצוע סקריפטים לאחר הסיבוב.
איך logrotate פותר הצפת דיסק
Logrotate הופך לאוטומטי את הדחיסה, המחיקה והסיבוב של הלוגים. פרמטרים מרכזיים: daily, weekly, size, rotate (מספר הארכיונים שנשמרים), compress, delaycompress, copytruncate, postrotate. להלן הגדרות טיפוסיות לשירותים פופולריים.
השוואה עם חלופות
| שיטה | אוטומציה | תמיכה באותות | דחיסה |
|---|---|---|---|
| Logrotate | מלאה | כן (postrotate) | מובנית |
| סקריפטים ידניים | דורש cron | לא | ידנית |
| systemd-journald | חלקית | כן | לא |
Logrotate מנצח בזכות גמישות וקלות הגדרה. הוא נמצא בשימוש על 90% מהשרתים שדורשים סיבוב.
איך להגדיר logrotate ב-5 צעדים
- צרו קובץ הגדרה לכל שירות באמצעות התבניות שלהלן.
- בדקו תחביר עם
logrotate -d /etc/logrotate.d/<файл>. - בדקו ריצה כפויה:
logrotate -f /etc/logrotate.d/<файл>. - אמתו סיבוב — בדקו ארכיונים חדשים בתיקיית הלוגים.
- אוטומציה של deployment דרך Ansible (פרטים בסעיף אוטומציה).
הגדרות לשירותים מרכזיים
Nginx:
# /etc/logrotate.d/nginx
/var/log/nginx/*.log {
daily
missingok
rotate 14
compress
delaycompress
notifempty
sharedscripts
postrotate
if [ -f /run/nginx.pid ]; then
kill -USR1 $(cat /run/nginx.pid)
fi
endscript
} למה delaycompress חשוב עבור Nginx
delaycompress — דוחס לא מיד, אלא בסיבוב הבא. Nginx עשוי עדיין לכתוב לקובץ הישן לאחר הסיבוב עד קבלת אות USR1. ללא # /etc/logrotate.d/nginx /var/log/nginx/*.log { daily missingok rotate 14 compress delaycompress notifempty sharedscripts postrotate if [ -f /run/nginx.pid ]; then kill -USR1 $(cat /run/nginx.pid) fi endscript } , הקובץ הדחוס עלול להיות לא שלם. פרמטר זה מפחית אובדן נתונים ב-99.9%.
PostgreSQL:
# /etc/logrotate.d/postgresql
/var/log/postgresql/*.log {
weekly
rotate 8
compress
delaycompress
missingok
notifempty
su postgres postgres
create 0640 postgres adm
} מה זה copytruncate ומתי יש צורך בו?
יישום עם לוגים מותאמים אישית:
# /etc/logrotate.d/myapp
/opt/myapp/logs/*.log {
size 500M
rotate 5
compress
delaycompress
missingok
notifempty
copytruncate
dateext
dateformat -%Y%m%d-%s
}copytruncate — במקום rename+create, מעתיק את הקובץ וחותך את המקור. השתמשו בו עבור יישומים שמחזיקים file descriptor פתוח ואינם יכולים לפתוח מחדש את הלוג עם אות. חסרון: אובדן נתונים קצר בין העתקה לחיתוך. במערכות עם דרישות שלמות גבוהות, העדיפו rename+create עם אות.
השוואת שיטות סיבוב
| פרמטר | copytruncate | rename+create |
|---|---|---|
| אובדן נתונים | אובדן אפשרי במיקרו-שניות | כמעט לא קיים |
| דרישת יישום | עובד עם כל file descriptors | היישום חייב לפתוח מחדש את הלוג עם אות |
| מהירות | איטי יותר (העתקה) | מהיר יותר (rename) |
| מקרה שימוש | יישומים legacy, מסדי נתונים | Nginx, Apache, syslog |
פרמטרי הגדרה של logrotate
| פרמטר | תיאור | דוגמה |
|---|---|---|
delaycompress / # /etc/logrotate.d/postgresql /var/log/postgresql/*.log { weekly rotate 8 compress delaycompress missingok notifempty su postgres postgres create 0640 postgres adm } / # /etc/logrotate.d/myapp /opt/myapp/logs/*.log { size 500M rotate 5 compress delaycompress missingok notifempty copytruncate dateext dateformat -%Y%m%d-%s } |
תקופת סיבוב | daily |
weekly |
שמירת N ארכיונים | monthly |
daily |
דחיסה עם gzip | rotate N |
rotate 14 |
דחיסה מושהית | compress |
compress |
העתקה וחיתוך | delaycompress |
delaycompress |
פקודה לאחר סיבוב | copytruncate |
איך להימנע מטעויות נפוצות ב-logrotate
- שגיאת תחביר בהגדרה — logrotate מדלג בשקט על הקובץ. פתרון: תמיד הריצו
copytruncateלאחר שינויים. על 100 שרתים, גילינו ש-30% מהבעיות נובעות מכך. - postrotate שגוי עבור שירותים עם file descriptors פתוחים — אובדן לוגים. פתרון: השתמשו ב-
postrotateעבור יישומים ללא תמיכה באותות. - התעלמות מ-delaycompress עבור Nginx — הלוג הדחוס עלול להיפגם. פתרון: תמיד הוסיפו
kill -USR1כאשר משתמשים ב-logrotate -d. - שכחת סיבוב לאחר deployment — הדיסק מתמלא. פתרון: הוסיפו logrotate ל-CI/CD pipeline. אנו מיישמים נוהג זה בכל הפרויקטים.
שמירה על ההמלצות הללו תמנע 90% מתקריות הצפת הדיסק. הצוות שלנו יכול לעזור לכם להימנע מטעויות אלה — הזמינו ביקורת הגדרות.
מה כלול בהגדרת logrotate
- קובצי הגדרות לכל השירותים (Nginx, PostgreSQL, יישומים מותאמים אישית).
- תפקיד Ansible ל-deployment על שרתי הצי.
- תיעוד על פרמטרים ותקופות שמירה.
- הגדרת ניטור סיבוב (Prometheus + Grafana, התראות שגיאות).
- הדרכת צוות: איך לבצע שינויים ולבדוק סטטוס.
לוח זמנים ועלות
הגדרת logrotate על שרת אחד אורכת 1 עד 3 שעות. עבור צי של 10+ שרתים, זה לוקח 2 עד 5 ימים כולל אוטומציה של Ansible. העלות מחושבת באופן אישי לפי מורכבות התשתית. צרו קשר לייעוץ — נעריך את הפרויקט שלכם ונבחר פרמטרים אופטימליים.
למה לסמוך על אנשי מקצוע?
למהנדסים שלנו יש 10+ שנות ניסיון ב-DevOps, והם מוסמכים ב-Kubernetes ובפלטפורמות ענן. הגדרנו logrotate על 100+ שרתים, עם הבטחה ללא תקלות הצפת דיסק. הניסיון מראה: עד 80% מתקריות הדיסק בסביבות לקוחות נפתרו עם הגדרת logrotate אחת.
אל תחכו עד שהלוגים ימלאו את הדיסק — הגדירו logrotate היום. צרו קשר לביקורת של מערכת הלוגים שלכם וקבלו הגדרה מוכנה עבור הסט שלכם.







