System.out.println לעומת לוגרים

1. מדוע חוטבים?

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

אבל באמצעות System.out.println מגיע עם מספר חסרונות המשפיעים על השימושיות שלו במצבים רבים. במדריך זה נדון מדוע ומתי נרצה להשתמש ב- Logger על פני ישן רגיל System.out ו System.err. נראה גם כמה דוגמאות מהירות באמצעות מסגרת הרישום של Log4J2.

2. התקנה

לפני שנתחיל, בואו נבדוק את התלות והתצורות של Maven הנדרשות.

2.1. תלות Maven

נתחיל בהוספה של התלות Log4J2 שלנו pom.xml:

 org.apache.logging.log4j log4j-api 2.12.1 org.apache.logging.log4j log4j-core 2.12.1 

אנו יכולים למצוא את הגרסאות העדכניות ביותר של log4j-api ו log4j-core במרכז מייבן.

2.2. תצורת Log4J2

השימוש של System.out אינו דורש תצורה נוספת. עם זאת, כדי להשתמש ב- Log4J2, אנו זקוקים ל- log4j.xml קובץ תצורה:

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

3. הפרדת פלט יומן

3.1. System.out ו System.err

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

גם עם System.out.printlnאין שליטה או סינון של היומנים שיש להדפיס. הדרך היחידה האפשרית להפריד בין היומנים היא להשתמש System.out.println ליומני מידע ו System.err.println ליומני שגיאות:

System.out.println ("זוהי הודעת מידע"); System.err.println ("זו הודעת שגיאה");

3.2. רמות רישום של Log4J2

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

  • קָטלָנִי
  • שְׁגִיאָה
  • לְהַזהִיר
  • מידע
  • לנפות
  • זֵכֶר
  • את כל

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

logger.trace ("הודעת יומן מעקב"); logger.debug ("הודעת יומן ניפוי באגים"); logger.info ("הודעת יומן מידע"); logger.error ("הודעת יומן שגיאה"); logger.warn ("אזהרת הודעת יומן"); logger.fatal ("הודעת יומן קטלנית");

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

4. כתיבת יומנים לקבצים

4.1. ניתוב מחדש System.out ו System.err

אפשר לנתב System.out.println לקובץ באמצעות System.setOut () שיטה:

PrintStream outStream = PrintStream חדש (קובץ חדש ("outFile.txt")); System.setOut (outStream); System.out.println ("זהו מאמר של Baeldung");

ובמקרה של System.err:

PrintStream errStream = PrintStream חדש (קובץ חדש ("errFile.txt")); System.setErr (errStream); System.err.println ("זו שגיאת מאמר של baeldung");

בעת הפניית הפלט לקובץ באמצעות System.out אוֹ System.err, איננו יכולים לשלוט בגודל הקובץ, לפיכך הקובץ ממשיך לצמוח במשך כל הפעלת היישום.

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

4.2. כניסה לקבצים באמצעות Log4J2

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

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

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

5. כניסה למערכות חיצוניות

כפי שראינו בסעיף הקודם, מסגרות לוגר מאפשרות כתיבת היומנים לקובץ. באופן דומה, הם גם מספקים appenders לשלוח יומנים למערכות ויישומים אחרים. זה מאפשר לשלוח יומנים לזרם קפקא או למסד נתונים של Elasticsearch באמצעות תומכי Log4J במקום להשתמש System.out.println.

אנא עיין במאמר ה- Log4j שלנו למפרש לקבלת פרטים נוספים על השימוש במוצבים כאלה.

6. התאמה אישית של פלט יומן

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

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

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

7. מסקנה

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

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