כניסה למגף האביב

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

במדריך קצר זה, אנו נבחן את אפשרויות הרישום העיקריות הקיימות ב- Spring Boot.

מידע עמוק יותר על Logback זמין במדריך ל Logback, ואילו Log4j2 מוצג במבוא ל- Log4j2 - Appenders, Layouts and Filters.

2. הגדרה ראשונית

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

עכשיו בואו ניצור את קובץ הכיתה היחיד שלנו, LoggingController:

@RestController בכיתה ציבורית LoggingController {לוגר לוגר = LoggerFactory.getLogger (LoggingController.class); @RequestMapping ("/") אינדקס מחרוזות ציבורי () {logger.trace ("הודעת TRACE"); logger.debug ("הודעת DEBUG"); logger.info ("הודעת מידע"); logger.warn ("הודעת אזהרה"); logger.error ("הודעת שגיאה"); החזירו "Howdy! בדוק את היומנים כדי לראות את הפלט ..."; }} 

לאחר טעינת יישום האינטרנט, נוכל להפעיל את שורות הרישום האלה פשוט על ידי ביקור // localhost: 8080 /.

3. רישום תצורת אפס

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

במקרה של רישום, התלות החובה היחידה היא רישום Apache Commons.

עלינו לייבא אותו רק בשימוש ב- Spring 4.x (Spring Boot 1.x) מכיוון שהוא מסופק על ידי Spring Framework אביב-jcl מודול באביב 5 (מגף אביב 2.x).

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

3.1. רישום ברירת מחדל של כניסה לאחור

בעת שימוש במתחילים, Logback משמש לרישום כברירת מחדל.

Spring Boot מגדיר אותו מראש עם דוגמאות וצבעי ANSI כדי להפוך את הפלט הסטנדרטי לקריא יותר.

בואו כעת נפעיל את היישום ונבקר ב- // localhost: 8080 / עמוד, ובדוק מה קורה במסוף:

כמו שאנו יכולים לראות, רמת הרישום המוגדרת כברירת מחדל של לוגר מוגדרת מראש ל- INFO, כלומר זֵכֶר ו לנפות הודעות אינן גלויות.

על מנת להפעיל אותם מבלי לשנות את התצורה, אנחנו יכולים להעביר את -לנפות אוֹ -זֵכֶר טיעונים בשורת הפקודה:

java -jar target / spring-boot-logging-0.0.1-SNAPSHOT.jar --trace 

3.2. רמות יומן

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

ראשית, אנו יכולים להגדיר את רמת הרישום שלנו באפשרויות ה- VM שלנו:

-Dlogging.level.org.springframework = TRACE -Dlogging.level.com.baeldung = TRACE

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

אביב-אתחול mvn: הפעל -Dspring-boot.run.arguments = - logging.level.org.springframework = TRACE, - logging.level.com.baeldung = TRACE

בעבודה עם Gradle נוכל להעביר הגדרות יומן דרך שורת הפקודה. זה ידרוש הגדרת bootRun מְשִׁימָה.

לאחר סיום, אנו מריצים את היישום:

./gradlew bootRun -Pargs = - logging.level.org.springframework = TRACE, - logging.level.com.baeldung = TRACE

אם אנו רוצים לשנות את המילה באופן קבוע, אנו יכולים לעשות זאת ב application.properties קובץ כמתואר כאן:

logging.level.root = WARN logging.level.com.baeldung = TRACE 

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

הזכרנו ש- Spring Boot Starter משתמש ב Logback כברירת מחדל. בואו נראה כיצד להגדיר שבר מקובץ תצורה של Logback בו אנו קובעים את הרמה לשתי חבילות נפרדות:

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

לכן, אם נקבע את רמות הרישום באמצעות משתני Logback, Spring Boot, וסביבות בו זמנית, רמת היומן תהיה זֵכֶר, מכיוון שהוא הנמוך ביותר מבין הרמות המבוקשות.

4. רישום תצורת כניסה מחדש

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

בוא נראה כיצד לכלול תצורת התחברות עם צבע ודפוס רישום שונה, עם מפרט נפרד עבור לְנַחֵם ו קוֹבֶץ תפוקה, ועם הגון מדיניות מתגלגלת כדי למנוע יצירת קבצי יומן עצומים.

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

כאשר לקובץ בכיתה יש אחד מהשמות הבאים, Spring Boot יטען אותו באופן אוטומטי בתצורת ברירת המחדל:

  • logback-spring.xml
  • logback.xml
  • logback-spring.groovy
  • logback.groovy

אביב ממליץ להשתמש ב -אביב גִרְסָה אַחֶרֶת על פני המישורים במידת האפשר, כמתואר כאן.

בוא נכתוב פשוט logback-spring.xml:

      % שחור (% d {ISO8601})% הדגשה (% - 5 רמה) [% כחול (% t)]% צהוב (% C {1.}):% msg% n% זורק $ {LOGS} / קפיץ אתחול- logger.log% d% p% C {1.} [% t]% m% n $ {LOGS} / בארכיון / קפיצי אתחול-לוגר-% d {yyyy-MM-dd}.% i.log 10MB 

וכאשר אנו מריצים את היישום, הנה הפלט:

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

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

5. רישום תצורת Log4j2

אמנם רישום Apache Commons הוא בבסיסו, ולוגבק הוא יישום הייחוס המסופק, אך כל הניתובים לספריות הרישום האחרות כבר כלולים כדי להקל על המעבר אליהם.

על מנת להשתמש בספריית רישומים אחרת מלבד Logback, עלינו להוציא אותה מהתלות שלנו.

עבור כל מנה ראשונה כמו זו (היא היחידה בדוגמה שלנו, אבל נוכל לקבל הרבה כאלה):

 org.springframework.boot spring-boot-starter-web 

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

 org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-logging org.springframework.boot spring-boot-starter-log4j2 

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

  • log4j2-spring.xml
  • log4j2.xml

אנו נדפיס דרך Log4j2 (מעל SLF4J) ללא שינויים נוספים.

בוא נכתוב פשוט log4j2-spring.xml:

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

וכאשר אנו מריצים את היישום, הנה הפלט:

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

בנוסף לתצורת ה- XML, Log4j2 מאפשר לנו להשתמש גם בתצורת YAML או JSON, המתוארת כאן.

6. Log4j2 ללא SLF4J

אנו יכולים גם להשתמש ב- Log4j2 באופן מקורי, מבלי לעבור דרך SLF4J.

על מנת לעשות זאת, אנו פשוט משתמשים בכיתות הילידים:

ייבא org.apache.logging.log4j.Logger; ייבא org.apache.logging.log4j.LogManager; // [...] לוגר לוגר = LogManager.getLogger (LoggingController.class); 

איננו צריכים לבצע שום שינוי אחר בתצורת Log4j2 Spring Boot הרגילה.

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

7. כניסה עם לומבוק

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

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

ראשית נצטרך להוסיף את התלות של Lombok בסקריפט הבנייה שלנו כדי לעבוד איתה:

 org.projectlombok lombok 1.18.4 מסופק 

7.1. @ Slf4j ו @ CommonsLog

ממשקי ה- API לרישום של SLF4J ו- Apache Commons מאפשרים לנו את הגמישות לשנות את מסגרת הרישום שלנו ללא השפעה על הקוד שלנו.

ואנחנו יכולים השתמש בלומבוק @ Slf4j ו @ CommonsLog ביאורים כדי להוסיף את מופע הלוגר הנכון לכיתה שלנו: org.slf4j.Logger עבור SLF4J ו- org.apache.commons.logging.Log עבור רישום Apache Commons.

כדי לראות את ההערות הללו בפעולה, בואו ניצור מחלקה דומה ל- LoggingController אך ללא מופע לוגר. אנחנו קוראים לזה LombokLoggingController והערו אותו עם @ Slf4j:

@RestController @ Slf4j מחלקה ציבורית LombokLoggingController {@RequestMapping ("/ lombok") אינדקס מחרוזות ציבורי () {log.trace ("הודעת TRACE"); log.debug ("הודעת DEBUG"); log.info ("הודעת מידע"); log.warn ("הודעת WARN"); log.error ("הודעת שגיאה"); החזירו "Howdy! בדוק את היומנים כדי לראות את הפלט ..."; }}

שים לב ששינינו את קטע הקוד קצת, באמצעות עֵץ כמופע הלוגר שלנו. הסיבה לכך היא הוספת ההערה @ Slf4j מוסיף אוטומטית שדה בשם עֵץ.

עם רישום אפס תצורה, היישום ישתמש בישום יישום כניסה מחדש עבור רישום. באופן דומה, יישום Log4j2 משמש לרישום באמצעות Log4j2-Configuration Logging.

אנו מקבלים את אותה התנהגות כאשר אנו מחליפים את ההערה @ Slf4j עם @ CommonsLog.

7.2. @ Log4j2

אנחנו יכולים להשתמש בהערה @ Log4j2 כדי להשתמש ישירות ב- Log4j2. לכן, אנו מבצעים שינוי פשוט ל- LombokLoggingController להשתמש @ Log4j2 במקום @ Slf4j אוֹ @ CommonsLog:

@RestController @ Log4j2 מחלקה ציבורית LombokLoggingController {@RequestMapping ("/ lombok") אינדקס מחרוזות ציבורי () {log.trace ("הודעת TRACE"); log.debug ("הודעת DEBUG"); log.info ("הודעת מידע"); log.warn ("הודעת אזהרה"); log.error ("הודעת שגיאה"); החזירו "Howdy! עיינו ביומנים כדי לראות את הפלט ..."; }} 

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

8. היזהר מהרישום של Java Util

Spring Boot תומך גם ברישום JDK דרך ה- logging.properties קובץ תצורה.

ישנם מקרים שבהם זה לא רעיון טוב להשתמש בו. מהתיעוד:

ישנן בעיות טעינת כיתות ידועות עם רישום Java Util שגורמות לבעיות בעת הריצה מ'צנצנת הפעלה '. אנו ממליצים להימנע מכך כאשר פועלים מ'צנצנת הפעלה 'אם הדבר אפשרי.

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

9. JANSI ב- Windows

בעוד שמערכות הפעלה מבוססות יוניקס כמו לינוקס ו- Mac OS X תומכות כברירת מחדל בקודי צבע ANSI, בקונסולת Windows, הכל יהיה מונוכרומטי למרבה הצער.

Windows יכול להשיג צבעי ANSI דרך ספרייה בשם JANSI.

עלינו לשים לב לחסרונות הטעונים בכיתה.

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

לוגבק:

  true [% thread]% highlight (% - 5level)% cyan (% logger {15}) -% msg% n 

Log4j2:

רצפי בריחה של ANSI נתמכים באופן מקורי בפלטפורמות רבות אך אינם ברירת מחדל ב- Windows. כדי לאפשר תמיכה ב- ANSI, הוסף את הצנצנת Jansi ליישום שלנו והגדר נכס log4j.skipJansi ל שֶׁקֶר. זה מאפשר ל- Log4j להשתמש ב- Jansi כדי להוסיף קודי מילוט ANSI בעת כתיבה למסוף.

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

כדאי גם לציין:

  • דף תיעוד הפריסה מכיל מידע שימושי של Log4j2 JANSI ב הדגש {תבנית} {סגנון} סָעִיף.
  • בעוד JANSI יכול לצבוע את הפלט, הבאנר של Spring Boot (מקורי או מותאם אישית דרך banner.txt קובץ) יישאר מונוכרומטי.

10. מסקנה

ראינו את הדרכים העיקריות להתממשק עם מסגרות הרישום העיקריות מתוך פרויקט Spring Boot.

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

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