מבוא ל- Log4j2 - מועמדים, פריסות ומסננים

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

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

Log4j 2 היא גרסה חדשה ומשופרת למסגרת Log4j הקלאסית.

במאמר זה נציג את המועמדים הנפוצים ביותר, פריסות ומסננים באמצעות דוגמאות מעשיות.

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

2. התקנה

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

שתי תלות של maven משותפות לכל הדוגמאות:

 org.apache.logging.log4j log4j-core 2.7 org.apache.logging.log4j log4j-core 2.7 מבחן צנצנת 

מלבד העיקרי log4j-core חבילה עלינו לכלול את 'צנצנת הבדיקה' השייכת לחבילה בכדי לקבל גישה לכלל ההקשר הדרוש לבדיקת קבצי תצורה בעלי שם נדיר.

3. תצורת ברירת מחדל

ConsoleAppender היא תצורת ברירת המחדל של ה- Log4J 2 חבילת ליבה. זה רושם הודעות למסוף המערכת בתבנית פשוטה:

בואו ננתח את התגים בתצורת XML פשוטה זו:

  • תְצוּרָה: יסוד השורש של א Log4J 2 קובץ תצורה ותכונה סטָטוּס היא הרמה של אירועי Log4J הפנימיים שאנחנו רוצים להיכנס אליהם
  • מתלמידים: אלמנט זה מחזיק אחד או יותר תוספים. כאן נקבע תצורה של פלט שיוצא למסוף המערכת כרגיל
  • חוטבי עצים: אלמנט זה יכול להיות מורכב ממספר תצורות כּוֹרֵת עֵצִים אלמנטים. עם המיוחד שורש תג, אתה יכול להגדיר לוגר סטנדרטי ללא שם שיקבל את כל הודעות היומן מהיישום. ניתן להגדיר כל לוגר לרמת יומן מינימלית
  • AppenderRef: אלמנט זה מגדיר התייחסות לאלמנט מה- מתלמידים סָעִיף. לכן התכונה 'נ"צ'מקושר עם תוספים'שֵׁם'תכונה

מבחן היחידות המתאים יהיה פשוט באופן דומה. נשיג א כּוֹרֵת עֵצִים התייחס והדפס שתי הודעות:

@Test ציבורי בטל givenLoggerWithDefaultConfig_whLogToConsole_thanOK () זורק חריג {לוגר לוגר = LogManager.getLogger (getClass ()); חריג e = RuntimeException חדש ("זה רק מבחן!"); logger.info ("זו הודעה פשוטה ברמת INFO." + "היא תוסתר."); logger.error ("זו הודעה פשוטה ברמת שגיאה." + "זו הרמה המינימלית הנראית.", ה); } 

4. ConsoleAppender עם תבנית פריסה

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

קובץ זה משתמש בכמה משתני תבניות שמתחלפים ב Log4J 2 בזמן ריצה:

  • % style {...} {colorname}: פעולה זו תדפיס את הטקסט בצמד סוגריים ראשון () בצבע נתון (שם קולוני).
  • % הדגש {...} {FATAL = שם קולוני, ...}: זה דומה למשתנה ה'סגנון '. אך ניתן לתת צבע שונה לכל רמת יומן.
  • %פורמט תאריך}: זה יוחלף בתאריך הנוכחי שצוין פוּרמָט. כאן אנו משתמשים בפורמט DateTime 'DEFAULT', כן-MM-dd HH: מ"מ: ss, SSS '.
  • % -5 רמת: מדפיס את רמת הודעת היומן בצורה מיושרת ימינה.
  • %הוֹדָעָה: מייצג את הודעת היומן הגולמית

אבל יש הרבה יותר משתנים ועיצוב ב- תבנית פריסה. אתה יכול להפנות אותם לתיעוד הרשמי של Log4J 2.

כעת נכלול את תצורת המסוף המוגדרת בתצורה העיקרית שלנו:

מבחן היחידה:

@Test הציבור בטל givenLoggerWithConsoleConfig_whLogToConsoleInColors_thanOK () זורק חריג {לוגר לוגר = LogManager.getLogger ("CONSOLE_PATTERN_APPENDER_MARKER"); logger.trace ("זו הודעה צבעונית ברמת TRACE."); ...} 

5. יישום קובץ Async עם JSON פריסה ו פרץ פילטר

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

במקרי שימוש כאלה, אנו יכולים להשתמש ב- AsyncAppender.

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

   ...          ...        

שים לב ש:

  • ה JSON פריסה מוגדר בצורה, שכותבת אירוע יומן אחד בכל שורה
  • ה פרץ פילטר יפיל כל אירוע ברמת 'INFO' ומעלה אם יש יותר משניים מהם, אך לכל היותר 10 אירועים שהושמטו
  • ה AsyncAppender מוגדר למאגר של 80 הודעות יומן; לאחר מכן, המאגר נשטף לקובץ היומן

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

@Test הציבור בטל givenLoggerWithAsyncConfig_whenLogToJsonFile_thanOK () זורק חריג {לוגר לוגר = LogManager.getLogger ("ASYNC_JSON_FILE_APPENDER"); ספירת int int final = 88; עבור (int i = 0; i 0 && logEventsCount <= count); }

6. RollingFile Appender ו XMLLayout

לאחר מכן, ניצור קובץ יומן רולינג. לאחר גודל קובץ מוגדר, קובץ היומן נדחס וסובב.

הפעם אנו משתמשים ב- XML מַעֲרָך:

שים לב ש:

  • ה RollingFile ל- appender יש תכונה 'filePattern', המשמשת למתן שמות לקבצי יומן מסובבים וניתן להגדירם באמצעות משתני מציין מיקום. בדוגמה שלנו, זה צריך להכיל תאריך ודלפק לפני סיומת הקובץ.
  • תצורת ברירת המחדל של XMLLayout יכתוב אובייקטים של אירוע יומן בודד ללא אלמנט השורש.
  • אנו משתמשים במדיניות המבוססת על גודל לסיבוב קבצי היומן שלנו.

כיתת מבחני היחידות שלנו תיראה כמו זו מהסעיף הקודם:

@Test ציבורי בטל givenLoggerWithRollingFileConfig_whenLogToXMLFile_thanOK () זורק חריג {לוגר לוגר = LogManager.getLogger ("XML_ROLLING_FILE_APPENDER"); ספירת int int final = 88; עבור (int i = 0; i <count; i ++) {logger.info ("זוהי גלגול מסר XML של הקובץ {}} ברמת INFO.", i); }}

7. סיסלוג חוטב

נניח שעלינו לשלוח אירועים מחוברים למכונה מרוחקת דרך הרשת. הדרך הפשוטה ביותר לעשות זאת באמצעות Log4J2 תהיה השימוש בה Syslog Appender:

   ...     ...        

התכונות ב סיסלוג תָג:

  • שֵׁם: מגדיר את שם המוסף, ועליו להיות ייחודי. מכיוון שיכולים להיות לנו מספר תומכי Syslog לאותו יישום ותצורה זהה
  • פוּרמָט: ניתן להגדיר אותו ל- BSD או RFC5424, ורשומות ה- Syslog יעוצבו בהתאם
  • מארח ונמל: שם המארח והיציאה של מכונת השרת Syslog המרוחקת
  • נוהל: אם להשתמש ב- TCP או UPD
  • מִתקָן: לאיזה מתקן סיסלוג ייכתב האירוע
  • connectTimeoutMillis: פרק זמן של המתנה לחיבור מבוסס, ברירת המחדל היא אפס
  • חיבור מחדשDelayMillis: זמן לחכות לפני שתנסה שוב להתחבר

8. מפיץ נכשל

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

לדוגמא, אם סיסלוג appender לא מצליח לשלוח אירועים למכונה המרוחקת, במקום לאבד את הנתונים שאנחנו עשויים לחזור אליהם FileAppender זְמַנִית.

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

בואו נבדוק את זה:

@Test ציבורי בטל givenLoggerWithFailoverConfig_whLog_thanOK () זורק חריג {לוגר לוגר = LogManager.getLogger ("FAIL_OVER_SYSLOG_APPENDER"); חריג e = RuntimeException חדש ("זה רק מבחן!"); logger.trace ("זוהי הודעת סיסלוג ברמת TRACE."); logger.debug ("זוהי הודעת syslog ברמת DEBUG."); logger.info ("זוהי הודעת סיסלוג ברמת INFO. זו הרמה המינימלית הנראית."); logger.warn ("זוהי הודעת סיסלוג ברמת WARN."); logger.error ("זוהי הודעת סיסלוג ברמת שגיאה.", ה); logger.fatal ("זוהי הודעת סיסלוג ברמת FATAL."); }

9. JDBC Appender

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

התצורה הבסיסית מורכבת מ- מקור מידע אוֹ ConnectionFactory, ColumnConfigs ו- שם שולחן:

עכשיו בואו ננסה:

@Test ציבורי בטל givenLoggerWithJdbcConfig_whLogToDataSource_thanOK () זורק חריג {לוגר לוגר = LogManager.getLogger ("JDBC_APPENDER"); ספירת int int final = 88; עבור (int i = 0; i <count; i ++) {logger.info ("זו הודעת JDBC # {} ברמת INFO.", ספירה); } חיבור חיבור = ConnectionFactory.getConnection (); ResultSet resultSet = connection.createStatement () .executeQuery ("בחר ספירה (*) כ- ROW_COUNT מיומני"); int logCount = 0; אם (resultSet.next ()) {logCount = resultSet.getInt ("ROW_COUNT"); } assertTrue (logCount == count); }

10. מסקנה

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

הדוגמאות שמלוות את המאמר זמינות באתר GitHub.