איך לנהל קבצי יומנים עם Logrotate על Ubuntu 22.04

הקדמה

Logrotate הוא כלי מערכת שמנהל את סיבוב היומנים ודחיסתם באופן אוטומטי. אם קבצי היומנים לא יוסבו, ידחסו ויושחזו לעתים קרובות, הם יכולים בסופו של דבר לצרוך את כל השטח הפנוי בדיסק במערכת.

Logrotate מותקן כברירת מחדל ב-Ubuntu 22.04, והוא מוגדר לטפל בצרכי סיבוב היומנים של כל החבילות שמותקנות, כולל rsyslog, מעבד היומן המוגדר כברירת מחדל במערכת.

במאמר זה, נחקור את התצורה המוגדרת ברירת מחדל של Logrotate, ולאחר מכן נגדיר סיבוב יומנים עבור אפליקציה מותאמת בדמיון.

דרישות מוקדמות

מדריך זה מניח שיש לך שרת Ubuntu 22.04, עם משתמש sudo מופעל לא רוט, כפי שמתואר ב-הגדרת השרת הראשונית עם Ubuntu 22.04.

Logrotate זמין גם בהרבה הפצות Linux אחרות, אך ההגדרה המוגדרת כברירת מחדל עשויה להיות שונה די משמעותית. קטעים אחרים במדריך זה עדיין יחולו כל עוד גרסת Logrotate שלך דומה לגרסה של Ubuntu 22.04. עקוב אחר השלב הראשון כדי לקבוע את גרסת Logrotate שלך.

התחבר לשרת שלך כמשתמש sudo כדי להתחיל.

שלב 1 — אימות גרסת Logrotate שלך

Logrotate מותקן כבר בברירת מחדל על Ubuntu. אם עליך להתקין אותו, רוץ את הפקודות הבאות כדי לעדכן את רשימת החבילות שלך ולקבל את החבילה:

  1. sudo apt update
  2. sudo apt install logrotate

אם אתה משתמש בשרת שאינו של Ubuntu, ודא תחילה ש-Logrotate מותקן על ידי בקשת מידע על גרסתו:

  1. logrotate --version
Output
logrotate 3.19.0 Default mail command: /usr/bin/mail Default compress command: /bin/gzip Default uncompress command: /bin/gunzip Default compress extension: .gz Default state file path: /var/lib/logrotate/status ACL support: yes SELinux support: yes

אם Logrotate מותקן אך מספר הגרסה שונה משמעותית, ייתכן שיש לך בעיות עם חלק מאפשרויות התצורה שמחקרת במדריך זה. עיין בתיעוד עבור גרסת ה-Logrotate הספציפית שלך על ידי קריאת עמוד המדריך (man):

  1. man logrotate

תוכל גם להתייעץ ב הגרסה המקוונת של תיעוד ה-Logrotate. הבא נבחן את מבנה התצורה ברירת המחדל של Logrotate על Ubuntu.

שלב 2 — חקירת התצורה של Logrotate

מידע על התצורה של Logrotate בדרך כלל ניתן למצוא בשני מקומות על Ubuntu:

  • /etc/logrotate.conf: קובץ זה מכיל הגדרות ברירת מחדל ומגדיר סיבובים עבור כמה לוגים שאינם שייכים לאף חבילת מערכת. הוא גם משתמש בהצהרת include כדי לכלול הגדרות מכל קובץ בתיקיית /etc/logrotate.d.
  • /etc/logrotate.d/: זהו המקום שבו כל חבילות שאתה מתקין שזקוקות לעזרה בסיבובי לוג ישימו את התצורה שלהם ב- Logrotate. בהתקנה סטנדרטית אמורים להיות קבצים כאן עבור כלי מערכת בסיסיים כמו apt, dpkg, rsyslog וכו'

באופן ברירת מחדל, logrotate.conf יגדיר סיבובי לוג עם תדירות שבועית, עם קבצי לוג ששייכים למשתמש root ולקבוצת syslog, עם ארבעה קבצי לוג שמתוחזקים בכל פעם (rotate 4), וקבצי לוג חדשים ריקים שנוצרים לאחר שהקובץ הנוכחי מסובב (create).

בואו נסתכל על קובץ התצורה של Logrotate של חבילה ב- /etc/logrotate.d. cat את הקובץ עבור יישות החבילה apt:

  1. cat /etc/logrotate.d/apt
Output
/var/log/apt/term.log { rotate 12 monthly compress missingok notifempty } /var/log/apt/history.log { rotate 12 monthly compress missingok notifempty }

קובץ זה מכיל מקטעי הגדרה לשני קבצי לוג שונים בתיקיית /var/log/apt/: term.log ו- history.log. שניהם מכילים את אותן האפשרויות. כל האפשרויות שאינן מוגדרות במקטעי ההגדרה האלו יירשו את הערכים ברירת המחדל או את אלה שנקבעו ב- /etc/logrotate.conf. כל הגדרה בקובץ logrotate תחליף את ערכי ברירת המחדל של logrotate, שהן מוגדרות ב- /etc/logrotate.conf. האפשרויות שהוגדרו עבור לוגים של apt הן:

  • סובב 12: שמור עשרה קבצי לוג ישנים. זה מתעלה על הברירת מחדל סובב 4.
  • חודשי: סובב פעם בחודש. זה מתעלה על הברירת מחדל שבועי.
  • דחס: דחוס את הקבצים שסובבו. ברירת המחדל היא להשתמש ב-gzip וזה גורם לקבצים להסתיים ב־.gz. אפשר לשנות את פקודת הדחיסה באמצעות האפשרות compresscmd.
  • missingok: אל תכתוב הודעת שגיאה אם הקובץ הלוג חסר.
  • notifempty: אל סובב את הקובץ הלוג אם הוא ריק.

קבצי התצורה האלה גם מירשים את ההתנהגות create הברירת מחדל, שמורה על כך ש־Logrotate ייצור לוגים חדשים לאחר סיבוב. זה יכול להיות מתעלה באמצעות nocreate, אך זה יכבה בעצם את רוב הפונקציונליות האחרות.

קיימות עוד אפשרויות הגדרת תצורה רבות. ניתן לקרוא על כולן על ידי הקלדת man logrotate בשורת הפקודה כדי להציג את דף המדריך של Logrotate.

לאחר מכן, נקבע קובץ תצורה כדי לטפל בלוגים עבור שירות בדיוני בשם your-app.

שלב 3 — הגדרת קובץ תצורה דוגמתי

כדי לנהל קבצי לוג באמצעות Logrotate עבור אפליקציות שאינן שירותים מובנים ומוגדרים מראש של המערכת, יש לנו שני אפשרויות:

  1. צור קובץ הגדרת Logrotate חדש ושים אותו בתיקיית /etc/logrotate.d/. יש להפעיל אותו כל יום כמשתמש root יחד עם כל העבודות התקניות של Logrotate.
  2. צור קובץ הגדרות חדש והרץ אותו מחוץ להגדרת Logrotate המוגדרת של Ubuntu. זה נדרש בעיקר אם יש צורך להפעיל את Logrotate כמשתמש לא root, או אם רוצים לסובב יותר תיקיות יותר מדי פעמים מדיומיום (הגדרת hourly בתיקיית /etc/logrotate.d/ לא יעילה, מכיוון שהגדרת Logrotate של המערכת מופעלת רק פעם ביום).

בוא נעבור דרך שתי האפשרויות הללו עם כמה הגדרות דוגמא.

הוספת הגדרה ל-/etc/logrotate.d/

רוצים להגדיר סיבובי יומן עבור שרת אינטרנט בדמות שמניח קובץ access.log וקובץ error.log בתיקיית /var/log/your-app/. השרת פועל כמשתמש וקבוצת www-data.

כדי להוסיף הגדרה עבור קבצי היומן של your-app ל-/etc/logrotate.d/, פתחו קובץ חדש בתיקיית /etc/logrotate.d באמצעות nano או העורך שאתם מעדיפים:

  1. sudo nano /etc/logrotate.d/your-app

הוסיפו את השורות הבאות לקובץ ההגדרה החדש שלכם:

/etc/logrotate.d/your-app
/var/log/your-app/*.log {
	daily
	missingok
	rotate 14
	compress
	notifempty
	create 0640 www-data www-data
	sharedscripts
	postrotate
		systemctl reload your-app
	endscript
}

חלק מההוראות החדשות בקובץ ההגדרה הזה הם:

  • create 0640 www-data www-data: זה יוצר קובץ לוג ריק חדש אחרי הסיבוב, עם הרשאות (0640) המסוימות, בעל הרשאות (www-data), וקבוצה (גם www-data).
  • sharedscripts: סימן זה אומר כי כל תסריטים שנוספו להגדרה רצים רק פעם אחת לכל ריצה, במקום לכל קובץ לוג שנסובב. מאחר והנתיב /var/log/your-app/*.log כולל תו גלגול *, ההגדרה הזו תואמת כל מספר של קבצי לוג בתיקיית your-app. ללא אפשרות sharedscripts, התסריט שצוין ב-postrotate ירוץ בכל פעם ש-Logrotate מעבדת קובץ לוג ללא אפשרות זו.
  • postrotate עד endscript: בלוק זה מכיל תסריט שירוץ לאחר שהקובץ לוג סובב. במקרה זה אנו מטענים מחדש את האפליקציה של הדוגמה שלנו. כך לעיתים זה נחוץ כדי להעביר את היישום שלך לקובץ הלוג החדש שנוצר.
    שים לב כי postrotate רץ לפני שהלוגים מדוחסים. דחיסה עשויה לקחת זמן רב, והתוכנה שלך צריכה לעבור אל הקובץ הלוג החדש מיידית. למשימות שצריכות לרוץ אחרי הדחיסה של הלוגים, השתמש בבלוק lastaction במקום.

כדי לשמור ולצאת מ-nano, לחץ על Ctrl+X, וכאשר מתבקש, הקלד Y ואז Enter. ניתן לבדוק את קובץ התצורה במצב יבש:

  1. sudo logrotate /etc/logrotate.conf --debug

פקודה זו מקרא ל-logrotate, מפנה אותו לקובץ התצורה התקני, ומפעיל את מצב התחקור.

מידע יודפס על קבצי הלוג ש-Lרוטייט מטפלת בהם ומה היא הייתה עושה איתם. אם הכל נראה טוב, אתה סיימת. המשימה התקנית של לוגרוטייט תרוץ פעם ביום ותכלול את התצורה החדשה שלך.

הבא, ננסה הגדרה שלא משתמשת בתצורת ברירת המחדל של אובונטו בכלל.

שלב 4 – יצירת קונפיגורציה עצמאית ללוגרוטייט

בדוגמה זו, יש לנו אפליקציה הפועלת כמשתמש הרגיל שלנו, sammy, היוצרת לוגים שמאוחסנים ב- /home/sammy/logs/. אנו רוצים לסובב את הלוגים הללו בתדירות של שעה, לכן עלינו להגדיר זאת מחוץ למבנה של /etc/logrotate.d המסופק על ידי אובונטו.

ראשית, ניצור קובץ תצורה בספריית הבית שלנו. פתח אותו בעורך טקסט:

  1. nano /home/sammy/logrotate.conf

ואז הדבק את ההגדרה הבאה:

/home/sammy/logrotate.conf
/home/sammy/logs/*.log {
	hourly
	missingok
	rotate 24
	compress
	create
}

שמור וסגור את הקובץ. נתקלנו בכל האפשרויות הללו בשלבים קודמים, אך נסכם: התצורה הזו תסובב את הקבצים בתדירות שעתית, תדחס אותם ותשמור עשרים וארבעה לוגים ישנים ותיצור קובץ לוג חדש כדי להחליף את הקובץ שסובב.

יהיה עליך להתאים אישית את התצורה למתאימות לאפליקציה שלך, אך זהו התחלה טובה.

כדי לבדוק שהתצורה עובדת, בואו ניצור קובץ לוג. תחילה הריצו את הפקודה cd לתיקיית הבית של המשתמש באמצעות הפקודה cd ~. לאחר מכן צרו תיקייה עבור הלוגים באמצעות הפקודה mkdir. לבסוף צרו קובץ ריק בתיקיית logs באמצעות הפקודה touch. הריצו את הפקודות הבאות כדי להשלים את השלבים אלה:

  1. cd ~
  2. mkdir logs
  3. touch logs/access.log

עכשיו שיש לנו קובץ לוג ריק במקום הנכון, בואו נריץ את הפקודה logrotate.

מכיוון שהלוגים שייכים למשתמש sammy אין צורך להשתמש ב־sudo. אך, אנו כן צריכים לציין קובץ מצב. קובץ זה מקליט אילו קבצי לוג נמצאים וכל פעולות שהוא ביצע בפעם האחרונה שהוא רץ, כך שהוא יודע מה לעשות בפעם הבאה שהוא רץ. מעקב זה של מצב מנוהל עבורנו כאשר משתמשים בתצורת ברירת המחדל של /etc/logrotate.conf. קובץ המצב מאוחסן במיקום /var/lib/logrotate/status. מכיוון שאנו לא משתמשים בתצורת ברירת המחדל, נצטרך להגדיר את מיקום קובץ המצב באופן ידני.

נקבע ל־Logrotate להניח את קובץ המצב ישירות בתיקיית הבית שלנו לדוגמה זו. אפשר למקם אותו בכל מקום שנגיש ונוח. הריצו את הפקודה הבאה כדי להשתמש ב־/home/sammy/logrotate.conf שיצרתם ולרשום את המצב שבו Logrotate נתקל:

logrotate /home/sammy/logrotate.conf --state /home/sammy/logrotate-state --verbose
Output
reading config file /home/sammy/logrotate.conf Handling 1 logs rotating pattern: /home/sammy/logs/*.log hourly (24 rotations) empty log files are rotated, old logs are removed considering log /home/sammy/logs/access.log log does not need rotating

הדגל --verbose ידפיס מידע מפורט על מה ש־Logrotate עושה. במקרה זה, לא הפיל כלום. זהו פעם הראשונה ש־Logrotate נתקל בקובץ הלוג הזה והוא בן אפס שעות, כך שאין צורך לבצע סיבוב.

אם נבדוק את קובץ המצב באמצעות כלי ה־cat, נשים לב ש־Logrotate רשמה מספר פרטים על הרצת התוכנית:

  1. cat /home/sammy/logrotate-state
Output
logrotate state -- version 2 "/home/sammy/logs/access.log" 2022-07-2-19:0:0

Logrotate שים לב ללוגים שראתה ומתי התייחסה אליהם לאחרונה לצורך סיבוב. אם נריץ את אותו הפקודה שעה לאחר מכן, הלוג יתסובב כפי שצפוי.

אם ברצונך לכפות על Logrotate לסובב את קובץ הלוג כאשר זה לא היה קורה אחרת, השתמש בדגל --force:

  1. logrotate /home/sammy/logrotate.conf --state /home/sammy/logrotate-state --verbose --force

זה שימושי בעת בדיקת postrotate ותסריטים אחרים.

לבסוף, אנו צריכים להגדיר משימת cron כדי להריץ את Logrotate כל שעה. פתח את crontab של המשתמש שלך:

  1. crontab -e

זה יפתח קובץ טקסט. אם זה הפעם הראשונה שלך בשימוש ב־cron, עשוי להתבקש לבחור עורך טקסט ברירת המחדל. אם אין לך העדפה, אנו ממליצים על nano למשתמשים חדשים. ייתכן ויהיו כמה הערות כבר בקובץ המסבירות את תחביר ה־cron. הזז את הסמן לשורה ריקה חדשה בסוף הקובץ והוסף את השורה הבאה:

crontab
14 * * * * /usr/sbin/logrotate /home/sammy/logrotate.conf --state /home/sammy/logrotate-state

משימה זו תרוץ בדקה ה-14 של כל שעה, כל יום. היא מריצה כמעט את אותו הפקודת logrotate שרצינו קודם, אך הרחבנו את logrotate לנתיב המלא שלו, /usr/sbin/logrotate, לצורך ביטחון. זה תרגום טוב להשתמש בנתיבים מלאים בעת כתיבת משימות cron. למידע נוסף על cron, תוכל לקרוא את המדריכים שלנו האחרים כאן.

שמור את הקובץ וצא. זה יתקין את crontab והמשימה שלנו תרוץ על פי המועד המצוין.

אם נחזור לתיקיית הלוג שלנו בערך שעה, אנחנו צריכים למצוא את קובץ הלוג הסובב והמדוחס access.log.1.gz (או .2.gz אם הרצת את Logrotate עם הדגל --force).

מסקנה

במדריך זה אימתנו את גרסת Logrotate שלנו, חקרנו את התצורה המוגדרת כברירת מחדל של Ubuntu Logrotate, והגדרנו שני סוגים שונים של הגדרות מותאמות אישית. כדי ללמוד עוד על האפשרויות בשורת הפקודה וההגדרה הזמינות ל-Logrotate, ניתן לקרוא את דף המדריך שלו על ידי הרצת man logrotate בטרמינל שלך או על ידי ביקור ב-תיעוד המקוון.

Source:
https://www.digitalocean.com/community/tutorials/how-to-manage-logfiles-with-logrotate-on-ubuntu-22-04