JavaRush /בלוג Java /Random-HE /מדוע יש צורך ברישום?

מדוע יש צורך ברישום?

פורסם בקבוצה
שלום! בעת כתיבת הרצאות, אני שם לב במיוחד אם נושא מסוים בהחלט ישמש בעבודה אמיתית. למה אתה צריך רישום - 1 אז, שימו לב! הנושא בו ניגע היום בהחלט יועיל לך בכל הפרויקטים שלך מהיום הראשון לעבודה. נדבר על רישום. הנושא הזה בכלל לא קשה (אפילו הייתי אומר קל). אבל בעבודה הראשונה שלך כבר יהיה מספיק לחץ כדי בכל זאת להתמודד עם הדברים הברורים, אז עדיף לסדר את זה ביסודיות עכשיו :) אז בואו נתחיל. מה זה רישום? רישום הוא רישום איפשהו מידע על פעולת תוכנית. המקום שבו נכתבים נתונים אלה נקרא " יומן ". עולות שתי שאלות בבת אחת: היכן ואיזה נתונים נרשמים? נתחיל ב"איפה". אתה יכול להקליט נתוני הפעלה של התוכנית במקומות רבים ושונים. לדוגמה, במהלך הלימודים אתה לעתים קרובות פלט נתונים לקונסולה באמצעות System.out.println(). זהו רישום אמיתי, אם כי הפשוט ביותר. כמובן שזה לא מאוד נוח ללקוח או לצוות התמיכה במוצר: ברור שהם לא ירצו להתקין את ה-IDE ולנטר את הקונסולה :) יש גם פורמט מוכר יותר להקלטת מידע - בקובץ טקסט. הרבה יותר קל לאנשים לקרוא אותם בצורה זו, ובוודאי הרבה יותר קל לאחסן אותם! עכשיו השאלה השנייה: אילו נתונים על פעולת התוכנית צריכים להירשם ביומן? אבל כאן הכל תלוי בך! מערכת הרישום של Java גמישה מאוד. אתה יכול להגדיר את זה בצורה כזו שכל ההתקדמות של התוכנית שלך תירשם. מצד אחד, זה טוב. אבל מצד שני, תארו לעצמכם לאיזה גודל יומני פייסבוק או טוויטר יכולים להגיע אם הכל כתוב שם. לחברות גדולות כאלה יש כנראה את היכולת לאחסן אפילו את כמות המידע הזו. אבל תארו לעצמכם כמה קשה יהיה לחפש מידע על שגיאה קריטית אחת ביומנים של 500 גיגה-בייט של טקסט? זה אפילו יותר גרוע ממחט בערימת שחת. לכן, ניתן להגדיר את התחברות ב-Java כך שרק נתוני שגיאה ייכתבו ליומן (לוג). או אפילו רק על שגיאות קריטיות! אמנם, אמירת "כניסה ל-Java" אינה נכונה לחלוטין. העובדה היא שהצורך ברישום התעורר בקרב מתכנתים לפני שהפונקציונליות הזו נוספה לשפה. ובזמן שלג'אווה הייתה ספריית רישום משלה, כולם כבר השתמשו בספריית log4j. ההיסטוריה של הופעת ההתחברות ב-Java היא למעשה ארוכה ואינפורמטיבית; בנוחיותכם, תוכלו לקרוא את הפוסט הזה ב-Habré . בקיצור, לג'אווה יש ספריית רישום משלה, אבל כמעט אף אחד לא משתמש בה :) מאוחר יותר, כשהופיעו כמה ספריות רישום שונות, וכל המתכנתים התחילו להשתמש בשונות, נוצרה בעיית תאימות. כדי למנוע מאנשים לעשות את אותו הדבר באמצעות תריסר ספריות שונות עם ממשקים שונים, נוצרה מסגרת ההפשטה slf4j("חזית רישום שירות עבור Java"). זה נקרא abstrating כי למרות שאתה משתמש במחלקות slf4j וקורא לשיטות שלהן, מתחת למכסה המנוע פועלות כל מסגרות הרישום הקודמות: log4j, java.util.logging סטנדרטית ואחרות. אם אתה צריך כרגע תכונה ספציפית של log4j שאין לספריות אחרות, אבל אתה לא רוצה לקשר בקפדנות את הפרויקט לספרייה מסוימת זו, פשוט השתמש ב-slf4j. והיא כבר "תמשוך" את שיטות log4j. אם תשנה את דעתך ותחליט שאתה כבר לא צריך את התכונות של log4j, אתה רק צריך להגדיר מחדש את "העטיפה" (כלומר, slf4j) כדי להשתמש בספרייה אחרת. הקוד שלך לא יפסיק לעבוד, כי בו אתה קורא לשיטות של slf4j, ולא של ספרייה ספציפית. סטייה קטנה. כדי שהדוגמאות הבאות יפעלו, עליך להוריד את ספריית slf4j מכאן ואת ספריית log4j מכאן . לאחר מכן, עלינו לפרק את הארכיון ולהוסיף את קבצי ה-jar שאנו צריכים ל-classpath דרך Intellij IDEA. פריטי תפריט: קובץ -> מבנה הפרויקט -> ספריות בחרו את הצנצנות הדרושות והוסיפו אותן לפרויקט (יש הרבה צנצנות בארכיונים שהורדנו, ראו את אלו שאתם צריכים בתמונות) למה אתה צריך רישום - 2למה אתה צריך רישום - 3שימו לב - הוראה זו מיועדת לאלו תלמידים שלא יודעים איך להשתמש ב-Maven. אם אתה יודע איך להשתמש בו, עדיף לנסות להתחיל איתו: זה בדרך כלל הרבה יותר קל. אם אתה משתמש ב-Maven , הוסף את התלות הזו:
<dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j-impl</artifactId>
            <version>2.14.0</version>
</dependency>
מעולה, סידרנו את ההגדרות :) בואו נראה איך slf4j עובד. איך נוכל לוודא שהתקדמות התוכנית מתועדת איפשהו? בשביל זה אנחנו צריכים שני דברים - לוגר וספח . נתחיל עם הראשון. לוגר הוא אובייקט שמנהל לחלוטין את שמירת הרשומות . יצירת לוגר קלה מאוד: היא נעשית בשיטה סטטית - . כפרמטר למתודה, עליך לעבור מחלקה שעבודתה תירשם. בואו נריץ את הקוד שלנו: 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 record!!!");
       LOGGER.error("В программе возникла ошибка!");
   }
}
פלט מסוף: ERROR StatusLogger לא נמצא קובץ תצורה של Log4j 2. שימוש בתצורת ברירת מחדל (רישום שגיאות לקונסולה בלבד), או בתצורות שסופקו על ידי המשתמש באופן תכנותי. הגדר את מאפיין המערכת 'log4j2.debug' כדי להציג רישום אתחול פנימי של Log4j 2. ראה https://logging.apache.org/log4j/2.x/manual/configuration.html להנחיות כיצד להגדיר את Log4j 2 15:49:08.907 [ראשי] שגיאה MyTestClass - אירעה שגיאה בתוכנית! מה אנחנו רואים כאן? ראשית אנו רואים הודעת שגיאה. זה הופיע כי כרגע חסרות לנו ההגדרות הדרושות. לכן, לוגר שלנו יכול כעת להוציא רק הודעות שגיאה (ERROR) ורק לקונסולה. השיטה logger.info()לא בוצעה. אבל logger.error()זה עבד! הקונסולה מציגה את התאריך הנוכחי, השיטה שבה התרחשה השגיאה ( main), המילה ERROR וההודעה שלנו! ERROR היא רמת הרישום. באופן כללי, אם רשומת יומן מסומנת במילה ERROR, זה אומר שאירעה שגיאה בנקודה זו בתוכנית. אם ערך מסומן במילה INFO, זה אומר שזה פשוט מידע עדכני על הפעולה הרגילה של התוכנית. לספריית SLF4J יש לא מעט רמות רישום שונות המאפשרות לך להגדיר באופן גמיש רישום. הם קלים מאוד לניהול: כל ההיגיון הדרוש כבר כלול בכיתה Logger. אתה רק צריך להתקשר לשיטות הדרושות. אם אתה רוצה לפרסם הודעה רגילה, התקשר ל- logger.info(). הודעת שגיאה - logger.error(). הצג אזהרה - logger.warn() עכשיו בואו נדבר על התוספת . התוספת היא המקום שאליו מגיעים הנתונים שלך. אפשר לומר שההיפך ממקור נתונים הוא "נקודה B". כברירת מחדל, הנתונים מופקים למסוף. שימו לב שבדוגמה הקודמת לא היינו צריכים להגדיר שום דבר: הטקסט הופיע בקונסולה עצמה, אבל לוגר מספריית log4j יכול להוציא רק הודעות ברמת ERROR לקונסולה. ברור שנוח יותר לאנשים לקרוא יומנים מקובץ טקסט ולאחסן יומנים באותם קבצים. כדי לשנות את התנהגות ברירת המחדל של לוגר, עלינו להגדיר את תוספת הקבצים שלנו . ראשית, עליך ליצור קובץ log4j.xml ממש בתיקיית src , או בתיקיית משאבים, אם אתה משתמש ב-Maven, או בתיקיית משאבים, במקרה שאתה משתמש ב-Maven. את פורמט ה-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">
זהו מה שנקרא סטטוס-logger. זה לא קשור ל-logger שלנו והוא נמצא בשימוש פנימי של log4j. אתה יכול להגדיר status=”TRACE” במקום status=”INFO”, וכל המידע על הפעולה הפנימית של log4j ייצא לקונסולה (-status-logger מוציא נתונים לקונסולה, גם אם התוספת שלנו לתוכנית היא קובץ -מבוסס). אנחנו לא צריכים את זה עכשיו, אז נשאיר הכל כמו שהוא.
<Appenders>
   <File name="MyFileAppender" fileName="C:\Users\Евгений\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 הודעות בתוכנית שלנו: מידע אחד, אזהרה אחת ושגיאה אחת. עם התצורה הנוכחית, כל 3 ההודעות ייכתבו ליומן. אם תשנה את רמת השורש ל-ERROR, רק ההודעה האחרונה מ-LOGGER.error() תירשם. בנוסף, מוצב כאן קישור לנספח. כדי ליצור קישור כזה, צריך <Root>ליצור תג בתוך התג <ApprenderRef>ולהוסיף לו את הפרמטר ref=”Name твоего аппендера”. יצרנו כאן את שם התוספתן, למקרה ששכחתם: <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("Начало работы программы!!!");

       try {
           LOGGER.warn("Внимание! Программа пытается разделить одно число на другое");
           System.out.println(12/0);
       } catch (ArithmeticException x) {

           LOGGER.error("Ошибка! Произошло деление на ноль!");
       }
   }
}
כמובן, זה קצת עקום (לתפוס RuntimeException הוא רעיון בינוני), אבל זה מושלם למטרות שלנו :) בואו נריץ את השיטה שלנו main()4 פעמים ברציפות ונסתכל בקובץ testlog.txt שלנו. אין צורך ליצור אותו מראש: הספרייה תעשה זאת אוטומטית. הכל עבד! :) עכשיו יש לך לוגר מוגדר. אתה יכול לשחק עם כמה תוכניות שכתבת קודם לכן, להוסיף קריאות לוגר לכל השיטות, ולהסתכל על היומן שנוצר :) לקריאה נוספת, אני ממליץ בחום על מאמר זה . שם נדון לעומק נושא הרישום, ולא יהיה קל לקרוא אותו בישיבה אחת. אבל הוא מכיל מידע נוסף ושימושי רב. למשל, תלמדו כיצד להגדיר לוגר כך שייצור קובץ טקסט חדש אם קובץ testlog.txt שלנו מגיע לגודל מסוים :) וזהו סוף השיעור שלנו! היום למדת על נושא חשוב מאוד, והידע הזה בהחלט יועיל לך בעבודתך העתידית. נתראה שוב! :)
הערות
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION