JavaRush /בלוג Java /Random-HE /רישום ג'אווה. להירגע כדור של סטרטרס

רישום ג'אווה. להירגע כדור של סטרטרס

פורסם בקבוצה
"צהריים טובים, היום נרשם אירוע באתר התעשייה, אני מבקש מהיזם להצטרף לקבוצת הניתוח". אחד מהימים שלך בעבודה יכול להתחיל משהו כזה, או שזה יכול להיות הבוקר - זה לא משנה. אבל בואו נתחיל מההתחלה. על ידי פתרון בעיות כאן ב-JavaRush, אתה לומד לכתוב קוד שעובד ועושה את מה שמצפים ממנו. אם אתה מסתכל על סעיף העזרה , ברור שזה לא תמיד מסתדר בפעם הראשונה. זה יהיה אותו דבר בעבודה. לא תמיד תפתרו בעיה בפעם הראשונה: באגים הם חברינו הנצחיים. חשוב שתוכל לשחזר את אירועי הבאג. רישום.  שחררו כדור של מחזה - 1נתחיל עם דוגמה. בוא נדמיין שאתה שוטר. הוזמנת לזירת האירוע (נשברה זכוכית בחנות), הגעת, ומחכים לתשובות ממך על מה שקרה. איפה להתחיל? אני לא יודע איך המשטרה עובדת. בתנאי מאוד - מתחילים לחפש עדים, ראיות וכל הדברים האלה. מה אם המקום עצמו יוכל לספר לך בפירוט מה קרה? לדוגמה, כך:
  • 21:59 הבעלים הפעיל את האזעקה (5 דקות עד להפעלה מלאה)
  • 22:00 הבעלים סגר את הדלת
  • 22:05 הפעלת אזעקה מלאה
  • 22:06 הבעלים משך בידית
  • חיישן רעש 23:15 מופעל
  • 23:15 חבורת כלבים רצה על פניה, נובחת בקול
  • חיישן רעש 23:15 כבוי
  • 01:17 חיישן ההלם בזכוכית החיצונית של הוויטרינה הופעל
  • 01:17 יונה עפה לתוך הכוס
  • 01:17 נשברה הכוס
  • 01:17 צפירה נדלקת
  • 01:17 היונה התנערה מעצמה ועפה משם
ובכן, אתה לא צריך להתעמק בפרטים כאלה לאורך זמן; מיד ברור מה קרה. אותו הדבר נמצא בפיתוח. זה מאוד מגניב כשאפשר לדעת מההקלטות מה קרה. עכשיו אולי אתה זוכר ניפוי באגים, כי אתה יכול לנפות כל דבר. אבל לא. הלכת הביתה, ובלילה הכל נשבר, אין מה לנפות: אתה צריך להבין למה זה נשבר ולתקן את זה. כאן נכנסים לתמונה היומנים, ההיסטוריה של כל מה שקרה בן לילה. במהלך הכתבה, אני מציע לך לחשוב מה הוא אחד מהכורתים המפורסמים ביותר (לא ממש לוגר, יותר כמו ניטור), שכל מי שמאזין (צופה) בחדשות בטח שמע עליו? הודות לו, כמה אירועים משוחזרים. עכשיו בואו נהיה רציניים. כניסה ל-Java היא תהליך הקלטת כל אירוע המתרחש בקוד. באחריותך כמתכנת לרשום מה הקוד שלך עשה, כי אז יומנים אלו יימסרו לך לניתוח. אם הכל נעשה כמו שצריך, אז כל באג יסודר ויתוקן מהר מאוד. כאן, כנראה לא אתעמק באיזה סוג של כורתים יש. במאמר זה נגביל את עצמנו לפשוט java.util.Logger: זה די והותר כדי להכיר אחד את השני. כל רשומת יומן מכילה תאריך-שעה, רמת אירוע, הודעה. התאריך והשעה מוזנים אוטומטית. רמת האירוע נבחרת על ידי מחבר ההודעה. יש כמה רמות. העיקריים שבהם הם מידע, איתור באגים, שגיאה.
  • INFO - בדרך כלל אלו הודעות מידע על מה שקורה, משהו כמו היסטוריה לפי תאריך: 1915 - משהו קרה, 1916 - משהו אחר.
  • DEBUG - מתאר את האירועים של רגע מסוים ביתר פירוט. למשל, הפרטים של קרב בהיסטוריה הם ברמת ניפוי באגים". המפקד טקויטוביץ' התקדם עם צבאו לכיוון הכפר סלוביץ' ".
  • ERROR - שגיאות שמתרחשות כתובות כאן בדרך כלל. בטח שמתם לב שכאשר אתם עוטפים משהו ב- try-catch, הבלוק catchמוחלף ב- e.printStacktrace(). זה רק מוציא את הכניסה לקונסולה. באמצעות לוגר, אתה יכול לשלוח את הערך הזה ל-logger (חחח), אתה מבין את הרעיון.
  • אזהרה - אזהרות כתובות כאן. למשל, נורת התחממות יתר במכונית. זו רק אזהרה, ועדיף לשנות משהו, אבל זו לא התמוטטות. כאשר המכונה מתקלקלת, נבצע רישום עם רמת השגיאה.
סידרנו את הרמות. אבל אל דאגה: הגבול ביניהם דק מאוד - לא כולם יכולים להסביר זאת. בנוסף, זה עשוי להיות שונה מפרויקט לפרויקט. מפתח בכיר יסביר לכם באיזו רמה ומה לרשום. העיקר שהרשומות האלה מספיקות לך לניתוח עתידי. ואת זה מבינים תוך כדי תנועה. הבא הם ההגדרות. ניתן לומר לוגרים היכן לכתוב (לקונסולה, לקובץ, ל-jms או למקום אחר), ולציין את הרמה (מידע, שגיאה, איתור באגים...). דוגמה להגדרות עבור היומן הפשוט שלנו נראית כך:
handlers = java.util.logging.FileHandler, java.util.logging.ConsoleHandler

java.util.logging.FileHandler.level     = INFO
java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter
java.util.logging.FileHandler.append    = true
java.util.logging.FileHandler.pattern   = log.%u.%g.txt

java.util.logging.ConsoleHandler.level     = INFO
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter
במקרה זה, הכל מוגדר כך שהלוגר כותב לקובץ ולקונסולה בו זמנית. במקרה הזה? אם משהו נמחק במסוף, בנוסף קל יותר לחפש לפי קובץ. רמת INFO עבור שניהם. דפוס שם מצוין גם עבור הקובץ. זוהי תצורה מינימלית המאפשרת לך לכתוב גם לקונסולה וגם לקובץ בבת אחת. java.util.logging.FileHandler.appendמוגדר כ- true כך שערכים ישנים בקובץ לא יימחקו. דוגמה לשימוש היא זו (ללא הערות, הלוגן מעיר על עצמו):
public class Main {
    static Logger LOGGER;
    static {
        try(FileInputStream ins = new FileInputStream("C:\\log.config")){ \\полный путь до file с конфигами
            LogManager.getLogManager().readConfiguration(ins);
            LOGGER = Logger.getLogger(Main.class.getName());
        }catch (Exception ignore){
            ignore.printStackTrace();
        }
    }
    public static void main(String[] args) {
        try {
            LOGGER.log(Level.INFO,"Начало main, создаем лист с типизацией Integers");
            List<Integer> ints = new ArrayList<Integer>();
            LOGGER.log(Level.INFO,"присваиваем лист Integers листу без типипзации");
            List empty = ints;
            LOGGER.log(Level.INFO,"присваиваем лист без типипзации листу строк");
            List<String> string = empty;
            LOGGER.log(Level.WARNING,"добавляем строку \"бла бла\" в наш переприсвоенный лист, возможна ошибка");
            string.add("бла бла");
            LOGGER.log(Level.WARNING,"добавляем строку \"бла 23\" в наш переприсвоенный лист, возможна ошибка");
            string.add("бла 23");
            LOGGER.log(Level.WARNING,"добавляем строку \"бла 34\" в наш переприсвоенный лист, возможна ошибка");
            string.add("бла 34");


            LOGGER.log(Level.INFO,"выводим все элементы листа с типизацией Integers в консоль");
            for (Object anInt : ints) {
                System.out.println(anInt);
            }

            LOGGER.log(Level.INFO,"Размер equals " + ints.size());
            LOGGER.log(Level.INFO,"Получим первый элемент");
            Integer integer = ints.get(0);
            LOGGER.log(Level.INFO,"выведем его в консоль");
            System.out.println(integer);

        }catch (Exception e){
            LOGGER.log(Level.WARNING,"что-то пошло не так" , e);
        }
    }
}
זו לא הדוגמה הכי טובה, לקחתי את הדוגמה שהייתה בהישג יד. פלט לדוגמה:
апр 19, 2019 1:10:14 AM generics.Main main
INFO: Начало main, создаем лист с типизацией Integers
апр 19, 2019 1:10:14 AM generics.Main main
INFO: присваиваем лист Integers листу без типипзации
апр 19, 2019 1:10:14 AM generics.Main main
INFO: присваиваем лист без типипзации листу строк
апр 19, 2019 1:10:14 AM generics.Main main
WARNING: добавляем строку "бла бла" в наш переприсвоенный лист, возможна ошибка
апр 19, 2019 1:10:14 AM generics.Main main
WARNING: добавляем строку "бла 23" в наш переприсвоенный лист, возможна ошибка
апр 19, 2019 1:10:14 AM generics.Main main
WARNING: добавляем строку "бла 34" в наш переприсвоенный лист, возможна ошибка
апр 19, 2019 1:10:14 AM generics.Main main
INFO: выводим все элементы листа с типизацией Integers в консоль
апр 19, 2019 1:10:14 AM generics.Main main
INFO: Размер equals 3
апр 19, 2019 1:10:14 AM generics.Main main
INFO: Получим первый элемент
апр 19, 2019 1:10:14 AM generics.Main main
WARNING: что-то пошло не так
java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
	at generics.Main.main(Main.java:45)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
כאן אני רוצה להתמקד בהערות:
апр 19, 2019 1:10:14 AM generics.Main main
INFO: Размер equals 3
апр 19, 2019 1:10:14 AM generics.Main main
INFO: Получим первый элемент
ערך זה די חסר תועלת ואינו אינפורמטיבי. כמו רשומת השגיאה:
WARNING: что-то пошло не так
אתה לא צריך לכתוב את זה: זה יומן למען יומן, זה רק יפריע. נסו לכתוב תמיד דברים בעלי משמעות. אני חושב שזה מספיק כדי להפסיק להשתמש בו System.out.printlnולעבור לצעצועים למבוגרים. יש לזה java.util.loggingחסרונות. לדוגמה, הרמות שתיארתי לעיל אינן כאן, אבל הן נמצאות ברוב הלוגרים המשומשים. בחרתי בו למאמר זה java.util.loggingכי הוא אינו דורש מניפולציות נוספות עם החיבור. אציין גם שניתן להשתמש בו LOGGER.infoבמקום LOGGER.log(Level.INFO... אחד החסרונות כבר מופיע כאן: LOGGER.log(Level.WARNING,"что-то пошло не так" , e);- הוא מאפשר להעביר הודעה ואובייקט Exception, הלוגר עצמו ירשום זאת יפה. במקביל, LOGGER.warning("");הוא מקבל רק הודעה, כלומר. לא ניתן לעבור את החריג, אתה צריך לתרגם אותו למחרוזת בעצמך. אני מקווה שהדוגמה הזו מספיקה כדי להכיר את רישום ג'אווה. אז אתה יכול לחבר לוגרים אחרים (log4j, slf4j, Logback...) - יש הרבה מהם, אבל המהות זהה^ כדי לתעד את היסטוריית הפעולות. הדרכה רשמית
הערות
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION