Log4j 2 תוספים

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

Log4j 2 משתמש בתוספים כמו Appenders ו- Layouts כדי לעצב ולהפיק יומנים. אלה ידועים בשם תוספי ליבה, ו- Log4j 2 מספק אפשרויות רבות לבחירתנו.

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

במדריך זה נשתמש במנגנון ההרחבה Log4j 2 ליישום תוספים מותאמים אישית.

2. הרחבת Log4j 2 תוספים

תוספים ב- Log4j 2 מחולקים באופן כללי לחמש קטגוריות:

  1. תוספי ליבה
  2. ממירים
  3. ספקי מפתח
  4. חיפושים
  5. הקלד ממירים

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

ב- Log4j 1.x, הדרך היחידה להרחיב תוסף קיים היא לעקוף את מחלקת היישום שלו. מצד שני, Log4j 2 מקל על הרחבת התוספים הקיימים על ידי הערת כיתה עם @חיבור.

בחלקים הבאים ניישם תוסף מותאם אישית בכמה מהקטגוריות הללו.

3. תוסף ליבה

3.1. יישום תוסף ליבה מותאם אישית

אלמנטים מרכזיים כמו Appenders, Layouts, and Filters ידועים בשם תוספי ליבה ב- Log4j 2. למרות שקיימת רשימה מגוונת של תוספים כאלה, במקרים מסוימים ייתכן שנצטרך ליישם תוסף ליבה מותאם אישית. לדוגמה, שקול א ListAppender שרושם רק רשומות יומנים בזיכרון רשימה:

@Plugin (name = "ListAppender", קטגוריה = Core.CATEGORY_NAME, elementType = Appender.ELEMENT_TYPE) מחלקה ציבורית ListAppender מרחיב AbstractAppender {רשימת פרטי log logist; ListAppender מוגן (שם מחרוזת, פילטר פילטר) {סופר (שם, פילטר, null); logList = Collections.synchronizedList (ArrayList חדש ()); } @PluginFactory סטטי ציבורי ListAppender createAppender (@PluginAttribute ("שם") שם מחרוזת, @PluginElement ("מסנן") מסנן מסנן סופי) {להחזיר ListAppender חדש (שם, פילטר); } @ העקף הריק הציבורי נספח (אירוע LogEvent) {if (event.getLevel (). IsLessSpecificThan (Level.WARN)) {error ("לא ניתן לרשום פחות מרמת ה- WARN."); לַחֲזוֹר; } logList.add (אירוע); }}

הערנו את הכיתה עם @חיבור המאפשר לנו למנות את התוסף שלנו. כמו כן, הפרמטרים מסומנים עם @PluginAttribute. האלמנטים המקוננים כמו פילטר או פריסה מועברים כ- @PluginElement. כעת אנו יכולים להפנות תוסף זה בתצורה באמצעות אותו שם:

3.2. בוני תוספים

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

לדוגמא, קחו בחשבון appender הכותב כניסה קפקא:

כדי ליישם מועמדים כאלה, Log4j 2 מספק יישום בונה תוספים המבוסס על ה- בּוֹנֶה תבנית:

@Plugin (name = "Kafka2", category = Core.CATEGORY_NAME) מחלקה ציבורית KafkaAppender מרחיב את AbstractAppender {Class public static class Builder מיישם org.apache.logging.log4j.core.util.Builder {@PluginBuilderAttribute ("שם") @ נדרש פרטי שם מחרוזת; @PluginBuilderAttribute ("ip") מחרוזת ipAddress פרטית; // ... מאפיינים נוספים // ... getters and setters @Override ציבור KafkaAppender לבנות () {להחזיר KafkaAppender חדש (getName (), getFilter (), getLayout (), נכון, KafkaBroker חדש (ipAddress, יציאה, נושא, חֲלוּקָה)); }} מתווך KafkaBroker פרטי; פרטי KafkaAppender (שם מחרוזת, פילטר פילטר, פריסת פריסה, התעלמות בוליאנית, מתווך KafkaBroker) {סופר (שם, פילטר, פריסה, ignoreExceptions); this.broker = מתווך; } @Override public void append (LogEvent event) {connectAndSendToKafka (מתווך, אירוע); }}

בקיצור, הצגנו א בּוֹנֶה בכיתה והערה על הפרמטרים עם @PluginBuilderAttribute. בגלל זה, KafkaAppender מקבל את פרמטרי החיבור של קפקא מהתצורה המוצגת לעיל.

3.3. הרחבת תוסף קיים

אנו יכולים גם להרחיב תוסף ליבה קיים ב- Log4j 2. אנו יכולים להשיג זאת על ידי מתן התוסף שלנו שם זהה לתוסף קיים. לדוגמה, אם אנו מרחיבים את RollingFileAppender:

@Plugin (name = "RollingFile", קטגוריה = Core.CATEGORY_NAME, elementType = Appender.ELEMENT_TYPE) מחלקה ציבורית RollingFileAppender מרחיב AbstractAppender {public RollingFileAppender (שם מחרוזת, פילטר מסנן, פריסת פריסה) {סופר (שם, פילטר, פריסה); } @Override public void append (אירוע LogEvent) {}}

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

שים לב כי Log4j 2 מרתיע מספר רב של תוספים עם אותו שם. עדיף ליישם במקום זאת תוסף מותאם אישית ולהשתמש בו בתצורת הרישום.

4. תוסף ממיר

הפריסה היא תוסף עוצמתי ב- Log4j 2. זה מאפשר לנו להגדיר את מבנה הפלט עבור יומנינו. למשל, אנו יכולים להשתמש JsonLayout לכתיבת היומנים בפורמט JSON.

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

פה, % d הוא דפוס ההמרה. Log4j 2 ממיר תבנית% d זו דרך a DatePatternConverter שמבין את דפוס ההמרה ומחליף אותו בתאריך המעוצב או בחותמת הזמן.

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

@Plugin (name = "DockerPatternConverter", category = PatternConverter.CATEGORY) @ConverterKeys ({"docker", "container"}) DockerPatternConverter בכיתה ציבורית מרחיב את LogEventPatternConverter {DockerPatternConverter הפרטי (אפשרויות מחרוזת []) {סופר ("Docker", העגינה "); } DockerPatternConverter סטטי ציבורי newInstance (מחרוזת [] אפשרויות) {להחזיר DockerPatternConverter חדש (אפשרויות); } @Override פורמט חלל ציבורי (אירוע LogEvent, StringBuilder toAppendTo) {toAppendTo.append (dockerContainer ()); } dockerContainer מחרוזת פרטית () {return "container-1"; }}

אז יישמנו מנהג DockerPatternConverter דומה לתבנית התאריך. זה יחליף את דפוס ההמרה בשם מיכל ה- Docker.

תוסף זה דומה לתוסף הליבה שיישמנו קודם. יש לציין שיש רק הערה אחת שונה מהתוסף האחרון. @ConverterKeys ביאור מקבל את דפוס ההמרה של תוסף זה.

כתוצאה מכך, תוסף זה יומר העגינה% אוֹ %מְכוֹלָה מחרוזת תבנית לשם המיכל בו פועלת היישום:

5. תוסף לחיפוש

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

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

  % d% p% c {1.} [% t]% m% n 

בקובץ תצורה לדוגמה זה, RollingFileAppender משתמש ב- תַאֲרִיך חפש היכן הפלט יהיה בפורמט MM-dd-yyyy. כתוצאה מכך, Log4j 2 כותב יומנים לקובץ פלט עם סיומת תאריך.

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

@Plugin (name = "kafka", category = StrLookup.CATEGORY) מחלקה ציבורית KafkaLookup מיישם את StrLookup {@Override public מחרוזת מפתחות (מפתח מחרוזת) {return getFromKafka (מפתח); } @Override חיפוש מחרוזות ציבורי (אירוע LogEvent, מפתח מחרוזת) {return getFromKafka (מפתח); } מחרוזת פרטית getFromKafka (נושא מחרוזת) {return "topic1-p1"; }}

כך KafkaLookup יפתור את הערך על ידי שאילתת נושא קפקא. כעת נעביר את שם הנושא מהתצורה:

  % d% p% c {1.} [% t]% m% n 

החלפנו את ה- תַאֲרִיך בדוק בדוגמה הקודמת שלנו עם בדיקת קפקא שתשאול נושא -1.

מכיוון ש- Log4j 2 קורא רק לבנאי ברירת המחדל של תוסף בדיקת מידע, לא יישמנו את ה- @PluginFactory כפי שעשינו בתוספים קודמים.

6. גילוי תוספים

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

יש סדר מסוים שבו Log4j 2 מבצע בדיקה כדי לפתור מחלקת תוספים:

  1. קובץ רישום התוספים בסידרה ב log4j2-core סִפְרִיָה. באופן ספציפי, א Log4j2Plugins.dat ארוז בתוך צנצנת זו כדי לרשום את תוספי ברירת המחדל של Log4j 2
  2. דוֹמֶה Log4j2Plugins.dat קובץ מחבילות OSGi
  3. רשימת חבילות המופרדת בפסיקים ב- log4j.plugin.packages נכס מערכת
  4. בתצורת Log4j 2 פרוגרמטית, אנו יכולים להתקשר PluginManager.addPackages () שיטה להוסיף א רשימה של שמות חבילות
  5. ניתן להוסיף רשימת חבילות מופרדת בפסיקים בקובץ התצורה של Log4j 2

כתנאי מוקדם, יש לאפשר עיבוד הערות כדי לאפשר ל Log4j 2 לפתור את התוסף באמצעות שֵׁם ניתן ב @חיבור ביאור.

מכיוון ש- Log4j 2 משתמש בשמות כדי לחפש את התוסף, הסדר הנ"ל הופך להיות חשוב. לדוגמא, אם יש לנו שני תוספים עם אותו שם, Log4j 2 יגלה את התוסף שנפתר תחילה. לכן, אם עלינו להרחיב תוסף קיים ב- Log4j 2, עלינו לארוז את התוסף בצנצנת נפרדת ולהניח אותו לפני log4j2-core.jar.

7. מסקנה

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

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

כמו תמיד, כל הדוגמאות זמינות ב- GitHub.


$config[zx-auto] not found$config[zx-overlay] not found