CodeGym /בלוג Java /Random-HE /רישום ג'אווה
John Squirrels
רָמָה
San Francisco

רישום ג'אווה

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

מה זה התחברות ב-Java?

רישום הוא פעולה של רישום נתונים על פעולת תוכנית. המקום בו אנו מתעדים נתונים אלו נקרא "יומן". מיד עולות שתי שאלות: אילו נתונים כתובים ואיפה? נתחיל עם ה"איפה". אתה יכול לכתוב נתונים על עבודת תוכנית במקומות רבים ושונים. לדוגמה, במהלך הלימודים, אתה לעתים קרובות System.out.println()כדי להוציא נתונים לקונסולה. זהו אכן רישום, אם כי בצורתו הפשוטה ביותר. כמובן שזה לא מאוד נוח למשתמשים או לצוות תמיכה במוצר: ברור שהם לא ירצו להתקין IDE ולנטר את הקונסולה :) יש פורמט נהוג יותר להקלטת מידע: קבצי טקסט. לבני אדם הרבה יותר נוח לקרוא נתונים בפורמט הזה, ובוודאי שזה הרבה יותר נוח לאחסון נתונים! עכשיו השאלה השנייה: אילו נתוני תוכנית צריכים להירשם? זה לגמרי תלוי בך! מערכת הרישום של Java גמישה מאוד. אתה יכול להגדיר אותו לתיעוד כל מה שהתוכנית שלך עושה. מצד אחד, זה טוב. אבל מצד שני, תארו לעצמכם כמה היו גדולים היומנים של פייסבוק או טוויטר אם היו כותבים בהם הכל. לחברות הגדולות האלה יש כנראה את היכולת לאחסן כל כך הרבה נתונים. אבל תארו לעצמכם כמה קשה יהיה למצוא מידע על שגיאה קריטית אחת ביומני טקסט של 500 גיגה-בייט? זה יהיה גרוע יותר מאשר לחפש מחט בערימת שחת. בהתאם לכך, ניתן להגדיר את Java לתיעוד נתוני שגיאה בלבד. או אפילו סתם שגיאות קריטיות! עם זאת, זה לא לגמרי מדויק לדבר על מערכת הרישום המקורית של Java. העובדה היא שמתכנתים היו צריכים רישום לפני שפונקציונליות זו נוספה לשפה. בזמן ש-Java הציגה ספריית רישום משלה, כולם כבר השתמשו בספריית log4j. ההיסטוריה של הכניסה ב-Java היא למעשה ארוכה ואינפורמטיבית. בקיצור, ל-Java יש ספריית רישום משלה, אבל כמעט אף אחד לא משתמש בה :) מאוחר יותר, כשהופיעו כמה ספריות רישום שונות והתחילו לשמש מתכנתים, התעוררו בעיות תאימות. כדי למנוע מאנשים להמציא מחדש את הגלגל בתריסר ספריות שונות עם ממשקים שונים, נוצרה המסגרת המופשטת SLF4J ("Service Logging Facade For Java"). זה נקרא אבסטרקטי, כי גם אם אתה משתמש וקורא לשיטות של מחלקות SLF4J, מתחת למכסה המנוע הם למעשה משתמשים בכל מסגרות ה-logging שהגיעו לפני: log4j, ה-java.util.logging הסטנדרטי ואחרות. אם בשלב מסוים אתה צריך תכונה מסוימת של Log4j שחסרה בספריות אחרות, אבל אתה לא רוצה לקשר ישירות את הפרויקט שלך לספרייה זו, פשוט השתמש ב-SLF4J. ואז תן לזה לקרוא לשיטות Log4j. אם תשנה את דעתך ותחליט שאתה כבר לא צריך תכונות של Log4j, אתה רק צריך להגדיר מחדש את ה"מעטפת" (כלומר SLF4J) לשימוש בספרייה אחרת. הקוד שלך לא יפסיק לעבוד, כי אתה קורא לשיטות SLF4J, לא לספרייה ספציפית. סטייה קטנה. כדי שהדוגמאות הבאות יעבדו, עליך להוריד את ספריית SLF4J כאן , ואת ספריית Log4j כאן . לאחר מכן, פרק את הארכיון והשתמש ב- IntelliJ IDEA כדי להוסיף את קבצי ה-JAR ל-classpath. פריטי תפריט: קובץ -> מבנה הפרויקט -> ספריות בחרו את קבצי ה-JAR הנחוצים והוסיפו אותם לפרויקט (הארכיונים שהורדנו מכילים קבצי JAR רבים - הסתכלו בתמונות כדי לראות את אלו שאתם צריכים) שימו לב כי הוראה זו מיועדת לאותם למה אנחנו צריכים רישום - 2למה אנחנו צריכים רישום - 3תלמידים שלא יודעים איך להשתמש ב-Maven. אם אתה יודע איך להשתמש ב-Maven, בדרך כלל עדיף (הרבה יותר קל) לנסות להתחיל שם. אם אתה משתמש ב-Maven , הוסף את התלות הזו:
<dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j-impl</artifactId>
            <version>2.14.0</version>
</dependency>
גדול! הבנו את ההגדרות :) בואו נראה איך SLF4J עובד. איך נוודא שעבודת התוכנית מוקלטת איפשהו? כדי לעשות זאת, אנחנו צריכים שני דברים: לוגר ו-appender. נתחיל עם הראשון. לוגר הוא אובייקט המספק שליטה מלאה ברישום. יצירת לוגר קלה מאוד: אנו עושים זאת באמצעות שיטות LoggerFactory.getLogger() הסטטיות . פרמטר המתודה הוא המחלקה שהפעולה שלה תירשם. בואו נריץ את הקוד שלנו:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MyTestClass {

   public static final Logger LOGGER = LoggerFactory.getLogger(MyTestClass.class);

   public static void main(String[] args) {

       LOGGER.info("Test log entry!!!");
       LOGGER.error("An error occurred!");
   }
}
פלט מסוף:

ERROR StatusLogger No Log4j 2 configuration file found. Using default configuration (logging only errors to the console), or user programmatically provided configurations. Set system property 'log4j2.debug' to show Log4j 2 internal initialization logging. See https://logging.apache.org/log4j/2.x/manual/configuration.html for instructions on how to configure Log4j 2 15:49:08.907 [main] ERROR MyTestClass - An error occurred!
מה אנחנו רואים כאן? ראשית, אנו רואים הודעת שגיאה. זו תוצאה של העובדה שעכשיו חסרות לנו ההגדרות הדרושות. בהתאם, לוגר שלנו מסוגל כרגע להוציא הודעות שגיאה בלבד (ERROR) ורק לקונסולה. השיטה logger.info() לא עבדה. אבל logger.error() עשה זאת! במסוף, אנו רואים את התאריך הנוכחי, השיטה שבה התרחשה השגיאה ( ראשי ), המילה "ERROR" וההודעה שלנו! ERROR היא רמת הרישום. באופן כללי, אם רשומת יומן מסומנת במילה "ERROR", אז התרחשה שגיאה בשלב זה בתוכנית. אם הערך מסומן במילה "INFO", אז ההודעה פשוט מייצגת מידע עדכני על הפעולה הרגילה של התוכנית. לספריית SLF4J יש הרבה רמות רישום שונות המאפשרות לך להגדיר רישום באופן גמיש. הכל קל מאוד לניהול: כל ההיגיון הדרוש כבר נמצא במחלקת Java Logger . אתה רק צריך להתקשר לשיטות הרלוונטיות. אם ברצונך לרשום הודעה שגרתית, קרא לשיטת logger.info() . לקבלת הודעת שגיאה, השתמש ב-logger.error() . לקבלת אזהרה, השתמש ב-logger.warn()

עכשיו בואו נדבר על תוספתן

תוספת היא המקום שאליו הנתונים שלך הולכים. במובן מסוים, ההפך ממקור נתונים, כלומר "נקודה ב'". כברירת מחדל, הנתונים מופקים למסוף. שימו לב שבדוגמה הקודמת לא היינו צריכים להגדיר כלום: הטקסט הופיע בקונסולה, והלוגר של ספריית Log4j יכול להוציא רק הודעות ברמת ERROR לקונסולה. ברור שנוח יותר לאנשים לקרוא ולכתוב יומנים בקובץ טקסט. כדי לשנות את התנהגות ברירת המחדל של לוגר, עלינו להגדיר את תוספת הקבצים שלנו. כדי להתחיל, עליך ליצור קובץ log4j.xml ישירות בתיקיית src. אתה כבר מכיר את פורמט ה-XML: לאחרונה היה לנו שיעור בנושא :) להלן תוכן הקובץ:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
   <Appenders>
       <File name="MyFileAppender" fileName="C:\Users\Username\Desktop\testlog.txt" immediateFlush="false" append="false">
           <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
       </File>
   </Appenders>
   <Loggers>
       <Root level="INFO">
           <AppenderRef ref="MyFileAppender"/>
       </Root>
   </Loggers>
</Configuration>
שום דבר מיוחד או קשה כאן :) אבל בכל זאת, בואו נעבור על התוכן.
<Configuration status="INFO">
זהו מה שנקרא StatusLogger. זה לא קשור ללוגר שלנו ומשמש בתהליכים הפנימיים של Log4j. אם תגדיר status="TRACE" במקום status="INFO", וכל המידע על העבודה הפנימית של Log4j יוצג בקונסולה (StatusLogger מציג נתונים על הקונסולה, גם אם התוספת שלנו היא קובץ). אנחנו לא צריכים את זה עכשיו, אז בואו נשאיר את זה כמו שהוא.
<Appenders>
   <File name="MyFileAppender" fileName="C:\Users\Evgeny\Desktop\testlog.txt" append="true">
       <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
   </File>
</Appenders>
כאן אנו יוצרים את התוספת שלנו. התג <File> מציין שזה יהיה תוספת לקובץ. name="MyFileAppender" מגדיר את שם התוספת. fileName="C:\Users\Username\Desktop\testlog.txt" מציין את הנתיב לקובץ היומן שבו ייכתבו כל הנתונים. append="true" מציין האם יש לכתוב את הנתונים בסוף הקובץ. במקרה שלנו, זה בדיוק מה שנעשה. אם תגדיר את הערך ל-false, התוכן הישן של קובץ היומן יימחק בכל פעם שהתוכנית מופעלת. <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/> מציין את הגדרות העיצוב . כאן נוכל להשתמש בביטויים רגולריים כדי להתאים אישית את אופן עיצוב הטקסט ביומן שלנו.
<Loggers>
       <Root level="INFO">
           <AppenderRef ref="MyFileAppender"/>
       </Root>
</Loggers>
כאן אנו מציינים את רמת השורש. קבענו את רמת ה"INFO", כלומר כל ההודעות שרמותיהן גבוהות מ-INFO (לפי הטבלה שבדקנו למעלה) לא יירשמו. לתוכנית שלנו יהיו 3 הודעות: אחת INFO, אחת אזהרה ושגיאה אחת. עם התצורה הנוכחית, כל 3 ההודעות יירשמו. אם תשנה את רמת השורש ל-ERROR, רק ההודעה האחרונה מהקריאה לשיטת LOGGER.error() תגיע ל-log. בנוסף, כאן מופיעה גם הפניה לתוספת. כדי ליצור הפניה כזו, עליך ליצור תג <ApprenderRef> בתוך התג <Root> ולהוסיף לו את התכונה ref='שם התוספת שלך' . למקרה ששכחת, כאן אנו מגדירים את שם התוספת: <File name="MyFileAppender" . והנה הקוד שלנו!
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MyTestClass {

   public static final Logger LOGGER = LoggerFactory.getLogger(MyTestClass.class);

   public static void main(String[] args) {

       LOGGER.info("The program is starting!!!");

       try {
           LOGGER.warn("Attention! The program is trying to divide a number by another.
           System.out.println(12/0);
       } catch (ArithmeticException x) {

           LOGGER.error("Error! Division by zero!");
       }
   }
}
כמובן, זה קצת מופרך (לתפוס RuntimeException הוא רעיון מפוקפק), אבל זה מושלם למטרות שלנו :) בואו נריץ את השיטה main() שלנו 4 פעמים ברציפות ונסתכל על הקובץ testlog.txt שלנו. אין צורך ליצור אותו מראש: הספרייה תעשה זאת באופן אוטומטי. הכל עבד! :) עכשיו יש לך לוגר מוגדר. אתה יכול לשחק עם כמה מהתוכניות הישנות שלך, להוסיף שיחות לוגר לכל שיטה. אז תסתכל על היומן המתקבל :) הוא שוקל את נושא הרישום לעומק. יהיה מאתגר לקרוא הכל בישיבה אחת. עם זאת, הוא מכיל הרבה מידע שימושי נוסף. לדוגמה, תלמד כיצד להגדיר את לוגר כך שייצור קובץ טקסט חדש אם קובץ testlog.txt שלנו מגיע לגודל מסוים :) ובזה מסתיים השיעור שלנו! היום הכרתם נושא חשוב מאוד, והידע הזה בהחלט יועיל לכם בעבודתכם העתידית. עד הפעם הבאה! :)
הערות
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION