ממשק API לרישום פלטפורמות Java 9

1. הקדמה

במדריך זה נחקור את ממשק ה- API של רישום חדש ב- Java 9 וניישם כמה דוגמאות כדי לכסות את המקרים הנפוצים ביותר.

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

2. יצירת יישום מותאם אישית

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

2.1. יצירת כּוֹרֵת עֵצִים

המעמד העיקרי שעלינו ליצור הוא כּוֹרֵת עֵצִים. בכיתה זו יש ליישם את System.Logger ממשק וארבע השיטות הללו לפחות:

  • getName (): מחזיר את שם הלוגר. זה ישמש את ה- JDK ליצירת רושמי עצים לפי שם
  • isLoggable (): מציין לאילו רמות הלוגר מופעל
  • עֵץ(): זו השיטה המדפיסה את היומן לכל מערכת בסיסית שבה היישום משתמש - הקונסולה במקרה שלנו. יש 2 עֵץ() שיטות ליישום, שכל אחת מהן קיבלה פרמטרים שונים

בואו נראה איך היישום שלנו ייראה:

מחלקה ציבורית ConsoleLogger מיישמת את System.Logger {@Override public String getName () {return "ConsoleLogger"; } @ Override בוליאני ציבורי isLoggable (רמת רמה) {return true; } @ ביטול יומן הריק הציבורי @ (רמת רמה, חבילת ResourceBundle, מחרוזת msg, נזרק) {System.out.printf ("ConsoleLogger [% s]:% s -% s% n", level, msg, throw); } @ ביטול יומן הריקים הציבוריים (רמת רמה, חבילת ResourceBundle, פורמט מחרוזת, אובייקט ... params) {System.out.printf ("ConsoleLogger [% s]:% s% n", level, MessageFormat.format (פורמט, פאראמים)); }}

שֶׁלָנוּ ConsoleLogger מחלקה עוקפת את ארבע השיטות שהוזכרו. ה getName () שיטה מחזירה א חוּט, בזמן ש isLoggable () השיטה מחזירה נָכוֹן בכל המקרים. לבסוף, יש לנו את 2 עֵץ() שיטה המוצאת למסוף.

2.2. יצירת LoggerFinder

ברגע שנוצר את הלוגר שלנו, עלינו ליישם א LoggerFinder זה יוצר מקרים שלנו ConsoleLogger.

לשם כך עלינו להרחיב את המעמד המופשט System.LoggerFinder וליישם את getLogger () שיטה:

מחלקה ציבורית CustomLoggerFinder מרחיב את System.LoggerFinder {@Override SystemLogger הציבורי getLogger (שם מחרוזת, מודול מודול) {להחזיר ConsoleLogger חדש (); }}

במקרה זה, אנחנו תמיד מחזירים את שלנו ConsoleLogger.

לבסוף, עלינו לרשום את שלנו LoggerFinder כשירות כך שניתן יהיה לגלות אותו על ידי ה- JDK. אם אנחנו לא מספקים יישום, SimpleConsoleLogger ישמש כברירת מחדל.

המנגנון בו השתמש ה- JDK לטעינת המימוש הוא ServiceLoader. תוכל למצוא מידע נוסף אודותיו במדריך זה.

מכיוון שאנחנו משתמשים ב- Java 9, נארוז את הכיתה שלנו במודול ונרשום את השירות שלנו ב- module-info.java קוֹבֶץ:

מודול com.baeldung.logging {מספק ל- java.lang.System.LoggerFinder com.baeldung.logging.CustomLoggerFinder; יצוא com.baeldung.logging; }

למידע נוסף על מודולי Java, עיין במדריך אחר זה.

2.3. בודקים את הדוגמה שלנו

כדי לבדוק את הדוגמה שלנו, בואו ניצור מודול נוסף שישמש כיישום. זה יכיל רק את רָאשִׁי בכיתה המשתמשת ביישום השירות שלנו.

שיעור זה יקבל מופע שלנו ConsoleLogger על ידי קריאה ל System.getLogger () שיטה:

מחלקה ציבורית MainApp {פרטי סטטי System.Logger LOGGER = System.getLogger ("MainApp"); סטטי ציבורי ריק ריק (מחרוזת [] טוענת) {LOGGER.log (Level.ERROR, "מבחן שגיאה"); LOGGER.log (Level.INFO, "מבחן מידע"); }}

באופן פנימי, ה- JDK יאסוף את שלנו CustomLoggerFinder יישום וליצור מופע שלנו ConsoleLogger.

לאחר מכן, בואו ניצור את מידע על המודול קובץ עבור מודול זה:

מודול com.baeldung.logging.app {}

בשלב זה מבנה הפרויקט שלנו ייראה כך:

├── src │ ├── מודולים │ │ ├── com.baeldung.logging │ │ │ ├── com │ │ ││ .java │ │ │ │ ─── CustomLoggerFinder.java │ │ │ └── module-info.java │ │ ├── com.baeldung.logging.app │ │ │ ├── com │ │ │ │ └── baeldung │ │ │ │ ─── רישום │ │ │ │ └── אפליקציה │ │ │ │── MainApp.java │ │ │ └── module-info.java └──

לבסוף, אנו הולכים להרכיב את שני המודולים שלנו, ונניח אותם ב- אופנות מַדרִיך:

javac - מודול נתיב-מודים / mods / com.baeldung.logging \ src / modules / com.baeldung.logging / module-info.java \ src / modules / com.baeldung.logging / com / baeldung / logging / * .java javac - מודול נתיב-mods -d mods / com.baeldung.logging.app \ src / modules / com.baeldung.logging.app / module-info.java \ src / modules / com.baeldung.logging.app /com/baeldung/logging/app/*.java

לבסוף, בואו ננהל את רָאשִׁי הכיתה של אפליקציה מודול:

java - module path path \ -m com.baeldung.logging.app/com.baeldung.logging.app.MainApp

אם נסתכל על פלט המסוף אנו יכולים לראות כי יומנינו מודפסים באמצעות שלנו ConsoleLogger:

ConsoleLogger [ERROR]: בדיקת שגיאה ConsoleLogger [INFO]: בדיקת מידע

3. הוספת מסגרת רישום חיצונית

בדוגמה הקודמת, היינו רושמים את כל ההודעות שלנו למסוף, וזהה למה שעושה לוגר ברירת המחדל. אחד השימושים השימושיים ביותר בממשק ה- API לרישום ב- Java 9 הוא לאפשר ליישומים לנתב את יומני JDK לאותה מסגרת כניסה בה היישום משתמש.וזה מה שאנחנו הולכים לעשות בחלק זה.

ניצור מודול חדש המשתמש ב- SLF4J כחזית רישום ו Logback כמסגרת רישום.

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

3.1. יישומים מותאמים אישית באמצעות SLF4J

ראשית, נבצע יישום נוסף כּוֹרֵת עֵצִים שייצור לוגר SLF4J חדש לכל מופע:

מחלקה ציבורית Slf4jLogger מיישם את System.Logger {פרטי סופי מחרוזת שם; לוגר לוגר סופי פרטי; ציבורי Slf4jLogger (שם מחרוזת) {this.name = שם; לוגר = LoggerFactory.getLogger (שם); } @Override ציבורי מחרוזת getName () {שם החזרה; } // ...}

שימו לב לכך כּוֹרֵת עֵצִים הוא org.slf4j.Logger.

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

@Override בוליאני ציבורי isLoggable (רמת רמה) {מתג (רמה) {מקרה OFF: החזר שקר; case TRACE: return logger.isTraceEnabled (); מקרה DEBUG: return logger.isDebugEnabled (); INFO מקרה: להחזיר logger.isInfoEnabled (); מקרה אזהרה: return logger.isWarnEnabled (); מקרה שגיאה: return logger.isErrorEnabled (); מקרה ALL: ברירת מחדל: להחזיר נכון; }}

ושיטות היומן יכנו את שיטת הלוגר המתאימה SLF4J בהתאם לרמת היומן המשמשת:

@ ביטול יומן הריק הציבורי (רמת רמה, חבילת ResourceBundle, מחרוזת מסר, נזרק לזריקה) {if (! IsLoggable (level)) {return; } החלף (רמה) {מקרה TRACE: logger.trace (msg, נזרק); לשבור; מקרה DEBUG: logger.debug (msg, נזרק); לשבור; מקרה מידע: logger.info (msg, נזרק); לשבור; מקרה אזהרה: logger.warn (msg, נזרק); לשבור; שגיאת מקרה: logger.error (msg, נזרק); לשבור; מקרה ALL: ברירת מחדל: logger.info (msg, נזרק); }} @ ביטול יומן הריקים הציבוריים (רמת רמה, חבילת ResourceBundle, פורמט מחרוזת, אובייקט ... params) {if (! IsLoggable (level)) {return; } הודעת מחרוזת = MessageFormat.format (פורמט, params); החלף (רמה) {מקרה TRACE: logger.trace (הודעה); לשבור; // ... // זהה למתג הקודם}}

לבסוף, בואו ניצור חדש LoggerFinder המשתמשת שלנו Slf4jLogger:

מחלקה ציבורית Slf4jLoggerFinder מרחיב את System.LoggerFinder {@Override ציבור System.Logger getLogger (שם מחרוזת, מודול מודול) {להחזיר Slf4jLogger חדש (שם); }}

3.2. תצורת המודול

ברגע שמימוש כל השיעורים שלנו, בוא נרשום את השירות שלנו במודול שלנו ונוסיף את התלות של מודול SLF4J:

מודול com.baeldung.logging.slf4j {דורש org.slf4j; מספק ל- java.lang.System.LoggerFinder com.baeldung.logging.slf4j.Slf4jLoggerFinder; יצוא com.baeldung.logging.slf4j; }

למודול זה יהיה המבנה הבא:

├── src │ ├── מודולים │ │ ├── com.baeldung.logging.slf4j │ │ │ ├── com │ │ │ │ └── baeldung │ │ │ │ └── רישום │ │ │ │ └─ ─ slf4j │ │ │ │── Slf4jLoggerFinder.java │ │ │ │ ─── Slf4jLogger.java │ │ │ └── module-info.java └──

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

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

3.3. הוספת לוגבק

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

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

לסיום, בואו ניצור קובץ תצורה של Logback ונניח אותו בתוך שלנו אופנות מַדרִיך:

    % d {yyyy-MM-dd HH: mm: ss} [% thread]% -5 רמה% לוגר {36} -% msg% n 

3.4. מריץ את היישום שלנו

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

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

java - module path path \ -Dlogback.configurationFile = mods / logback.xml \ -m com.baeldung.logging.app/com.baeldung.logging.app.MainApp

לבסוף, אם נבדוק את הפלט נוכל לראות כי יומנינו מודפסים באמצעות תצורת ה- Logback שלנו:

2018-08-25 14:02:40 [main] שגיאה MainApp - מבחן שגיאה 2018-08-25 14:02:40 [main] INFO MainApp - מבחן מידע

4. מסקנה

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

כמו תמיד, קוד המקור המלא של הדוגמאות זמין באתר GitHub.


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