מדריך למגדלי קבצים מתגלגלים

1. סקירה כללית

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

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

במאמר זה נחקור כיצד להגדיר תצורה של תוספי קבצים מתגלגלים בכמה מספריות הרישום הנפוצות ביותר - Log4j, Log4j2 ו- Slf4j.

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

2. היישום לדוגמא שלנו

נתחיל ביישום לדוגמא שמתעד כמה הודעות. קוד זה מבוסס על Log4j אך ניתן לשנותו בקלות לעבודה עם Log4j2 או Slf4j:

יבוא org.apache.log4j.Logger; מחלקה ציבורית Log4jRollingExample {לוגר לוגר סטטי פרטי = Logger.getLogger (Log4jRollingExample.class); ראשי ריק סטטי ציבורי (String [] args) זורק את InterruptedException {עבור (int i = 0; i <2000; i ++) {logger.info ("זה הזמן" + i + "שאני אומר 'שלום עולם'.") ; Thread.sleep (100); }}}

היישום די נאיבי - הוא כותב כמה הודעות בלולאה, עם עיכוב קצר בין איטרציות. עם ריצת 2,000 לולאות והפסקה של 100 אלפיות בכל לולאה, היישום אמור להימשך קצת יותר משלוש דקות.

נשתמש במדגם זה כדי להדגים כמה תכונות של סוגים שונים של תוספי קבצים מתגלגלים.

3. רולינג קבצים מורחבים ב- Log4j

3.1. תלות Maven

קודם כל, כדי להשתמש ב- Log4j ביישום שלך, הוסף תלות זו לפרויקט שלך pom.xml קוֹבֶץ:

 log4j log4j 1.2.17 

כדי להשתמש במוספים הנוספים המסופקים על ידי אפאצ'י-יומן תוספות שנשתמש בדוגמאות הבאות, נוסיף את התלות הבאה, תוך הקפדה להשתמש באותה גרסה שהכרזנו עבור Log4j על מנת להבטיח תאימות מלאה:

 log4j apache-log4j-תוספות 1.2.17 

תוכל למצוא את המהדורה האחרונה של תוספות Log4j ו- Apache Log4j ב- Maven Central.

3.2. מתגלגל בהתבסס על גודל הקובץ

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

כאן הגדרנו את Log4j לגלגל את קובץ היומן כאשר גודלו מגיע ל 5KB, באמצעות ה- MaxFileSize פָּרָמֶטֶר. כמו כן, הנחינו את Log4j לשמור מקסימום שני קבצי יומן רול מגולגלים באמצעות ה- MaxBackupIndex פָּרָמֶטֶר.

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

27/11/2016 10:28 138 app.log 27/11/2016 10:28 5.281 app.log.1 27/11/2016 10:28 5.281 app.log.2 

מה קרה? Log4j התחיל לכתוב ל- app.log קוֹבֶץ. כשגודל הקובץ חרג ממגבלת 5KB, Log4j עבר app.log ל app.log.1, יצר חדש לגמרי, ריק app.logוהמשיך בכתיבת הודעות יומן חדשות אל app.log.

ואז אחרי החדש app.log חרג ממגבלת 5KB, תהליך הגלגול הזה חזר על עצמו. הפעם, app.log.1 הועבר ל app.log.2, מפנה מקום לעוד חדש, ריק app.log.

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

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

מצד שני, כשבדקנו את השורה הראשונה של app.log.2, הוא הכיל את ההודעה הקשורה לאיטרציה ה -700, כלומר כל הודעות היומן הקודמות אבדו:

2016-11-27 10:28:34 מידע זה הפעם 700 שאני אומר 'שלום עולם'. 

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

לשם כך אנו נשתמש בתוספי Log4j חזקים יותר, גמישים וניתנים להגדרה, שנשלחים בחבילה ייעודית הנקראת apache-log4j-תוספות.

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

3.3. מתגלגל עם דחיסה אוטומטית

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

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

בתוך ה מדיניות מתגלגלת תָג, ה ActiveFileName הפרמטר מציין את הנתיב של קבצי היומן הראשיים המכילים את ההודעות האחרונות ואת ה- FileNamePattern הפרמטר מציין תבנית המתארת ​​את הנתיב של הקבצים המגולגלים. נציין כי זה אכן דפוס בגלל מציין המיקום המיוחד %אני יוחלף באינדקס של הקובץ המגולגל.

בואו נציין זאת FileNamePattern מסתיים עם ".gz ” סיומת. בכל פעם שאנחנו משתמשים בתוסף המשויך לפורמט דחוס נתמך, נדחס את הקבצים המגולגלים הישנים ללא כל מאמץ נוסף מהצד שלנו.

כעת כאשר אנו מריצים את היישום, אנו מקבלים קבוצה אחרת של קבצי יומן:

03/12/2016 19:24 88 app.1.log.gz ... 03/12/2016 19:26 88 app.2.log.gz 03/12/2016 19:26 88 app.3.log. gz 03/12/2016 19:27 70 app.current.log 

הקובץ app.current.log זה המקום בו התרחשו היומנים האחרונים. יומני הקודם התגלגלו ודחסו כאשר גודלם הגיע למגבלה שנקבעה.

3.4. מתגלגל על ​​בסיס תאריך ושעה

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

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

3.5. מתגלגל על ​​בסיס גודל וזמן

שילוב של SizeBasedTriggeringPolicy וה זמן מבוסס רולינג מדיניות, אתה יכול להשיג appender שמתגלגל על ​​סמך תאריך / שעה וכאשר גודל הקובץ מגיע למגבלה שנקבעה, הוא מתגלגל גם על פי גודל:

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

03/12/2016 19:25 234 אפליקציה 19-25.1481393432120.log.gz 03/12/2016 19:25 234 אפליקציה 19-25.1481393438939.log.gz 03/12/2016 19:26 244 אפליקציה 19-26.1481393441940 .log.gz 03/12/2016 19:26 240 app.19-26.1481393449152.log.gz 03/12/2016 19:26 3.528 app.19-26.1481393470902.log

הקובץ אפליקציה 19-26.1481393470902.log הוא המקום בו מתבצעת רישום נוכחי. כפי שאתה יכול לראות, כל היומנים במרווח בין 19:25 ל- 19:26 מאוחסנים במספר קבצי יומן דחוסים עם שמות המתחילים ב- "אפליקציה 19-25 ″. ה "%אני" מציין מיקום מוחלף במספר הולך וגדל.

4. רולינג קבצים מורידים ב- Log4j2

4.1. תלות Maven

כדי להשתמש ב- Log4j2 כספריית הרישום המועדפת עלינו, עלינו לעדכן את ה- POM של הפרויקט שלנו בתלות הבאה:

 org.apache.logging.log4j log4j-core 2.7 

כרגיל, תוכלו למצוא את הגרסה האחרונה ב- Maven Central.

4.2. מתגלגל בהתבסס על גודל הקובץ

בואו נשנה את יישום הדוגמה שלנו לשימוש בספריות הרישום של Log4j2 ובואו נבדוק כעת כיצד נוכל להגדיר גלגול קבצים בהתבסס על גודל קובץ היומן ב log4j2.xml קובץ תצורה:

  % d {yyyy-MM-dd HH: mm: ss}% p% m% n 

בתוך ה מדיניות תג, ציינו את כל המדיניות המפעילה שאנחנו רוצים להחיל. OnStartupTriggeringPolicy מפעיל גליל בכל פעם שהיישום מתחיל, מה שיכול להיות שימושי ליישומים עצמאיים. לאחר מכן ציינו א SizeBasedTriggeringPolicy וקבע כי רול צריך להתרחש בכל פעם שקובץ היומן מגיע ל -5 KB.

4.3. מתגלגל על ​​בסיס תאריך ושעה

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

  % d {yyyy-MM-dd HH: mm: ss}% p% m% n 

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

4.4. מתגלגל על ​​בסיס גודל וזמן

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

  % d {yyyy-MM-dd HH: mm: ss}% p% m% n 

בתצורה זו קבענו כי גליל צריך להתרחש על בסיס זמן וגודל. המפתח יכול להבין לאיזה מרווח זמן אנו מתייחסים בגלל התבנית המשמשת לשם הקובץ, "אפליקציה.% d {MM-dd-yyyy-HH-mm}.% i.log.gz ", שקובע באופן מרומז רול להתרחש בכל דקה ודוחס את הקובץ המגולגל.

הוספנו גם א DefaultRolloverStrategy כדי למחוק קבצים ישנים שהתגלגלו התואמים קריטריונים מסוימים. אנו מגדירים את שלנו למחוק קבצים התואמים לדפוס הנתון כאשר הם מעל גיל 20 יום.

4.5. תלות Maven

כדי להשתמש ב- Log4j2 כספריית הרישום המועדפת עלינו, עלינו לעדכן את ה- POM של הפרויקט שלנו בתלות הבאה:

 org.apache.logging.log4j log4j-core 2.7 

כרגיל, תוכלו למצוא את הגרסה האחרונה ב- Maven Central.

5. התגלגלות קבצים מתגלגלים ב- Slf4j

5.1. תלות Maven

כאשר ברצונך להשתמש ב- Slf4j2 עם backend backback כספריות רישום, הוסף תלות זו שלך pom.xml:

 ch.qos.logback logback-classic 1.1.7 

כרגיל, תוכלו למצוא את הגרסה האחרונה ב- Maven Central.

5.2. מתגלגל בהתבסס על גודל הקובץ

בואו נראה עכשיו כיצד להשתמש ב- Slf4j במקום זאת, עם החלק האחורי של ברירת המחדל שלו לוגבק. בואו לחקור כיצד אנו יכולים להגדיר קובץ המתגלגל בקובץ התצורה logback.xml, שמוצב בנתיב הכיתה של היישום:

 target / slf4j / roll-by-size / app.log target / slf4j / roll-by-size / app.% i.log.zip 1 3 1MB 5KB% -4relative [% thread]% -5 level logger {35} -% msg% n 

שוב אנו פוגשים את הרעיון של מדיניות מתגלגלת. המנגנון הבסיסי זהה לזה שמשמש את Log4j ו- Log4j2. ה FixedWindowRollingPolicy מאפשר לנו להשתמש במיקום מיקום אינדקס בתבנית השם של הקובץ המגולגל.

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

5.3. מתגלגל על ​​בסיס זמן

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

 target / slf4j / roll-by-time / app.log target / slf4j / roll-by-time / app.% d {yyyy-MM-dd-HH-mm} .log.zip 20 1MB% d {yyyy-MM -dd HH: mm: ss}% p% m% n 

5.4. מתגלגל על ​​בסיס גודל וזמן

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

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

 target / slf4j / roll-by-time-and-size / app.log target / slf4j / roll-by-time-and-size / app.% d {yyyy-MM-dd-mm}.% i.log. zip 5KB 20 1MB% d {yyyy-MM-dd HH: mm: ss}% p% m% n 

6. מסקנה

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

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