JavaRush /مدونة جافا /Random-AR /تسجيل جافا. قم بفك كرة من السكتريس

تسجيل جافا. قم بفك كرة من السكتريس

نشرت في المجموعة
"مساء الخير، اليوم تم تسجيل حادثة في الموقع الصناعي، أطلب من المطور الانضمام إلى مجموعة التحليل." يمكن أن يبدأ أحد أيامك في العمل بشيء كهذا، أو قد يكون في الصباح - لا يهم. لكن لنبدأ من البداية. من خلال حل المشكلات هنا في 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: إنها أكثر من كافية للتعرف على بعضنا البعض. يحتوي كل إدخال سجل على التاريخ والوقت ومستوى الحدث والرسالة. يتم إدخال التاريخ والوقت تلقائيًا. يتم اختيار مستوى الحدث بواسطة مؤلف الرسالة. هناك عدة مستويات. أهمها المعلومات والتصحيح والخطأ.
  • معلومات - عادة ما تكون هذه رسائل معلومات حول ما يحدث، شيء مثل التاريخ حسب التاريخ: 1915 - حدث شيء ما، 1916 - شيء آخر.
  • DEBUG - يصف أحداث لحظة معينة بمزيد من التفصيل. على سبيل المثال، تفاصيل معركة في التاريخ هي على مستوى التصحيح." تقدم القائد تاكويتوفيتش بجيشه نحو قرية سيلوفيتشا ."
  • خطأ - عادة ما يتم كتابة الأخطاء التي تحدث هنا. ربما لاحظت أنه عند تغليف شيء ما ، يتم استبدال try-catchالكتلة بـ . يقوم فقط بإخراج الإدخال إلى وحدة التحكم. باستخدام المسجل، يمكنك إرسال هذا الإدخال إلى المسجل (هاها)، لقد فهمت الفكرة.catche.printStacktrace()
  • تحذير - التحذيرات مكتوبة هنا. على سبيل المثال، ارتفاع درجة حرارة الضوء في السيارة. هذا مجرد تحذير، ومن الأفضل تغيير شيء ما، لكن هذا ليس انهيارا. عندما يتعطل الجهاز، سنقوم بتسجيل الدخول بمستوى الخطأ.
لقد قمنا بفرز المستويات. لكن لا تقلق: فالخط الفاصل بينهما رفيع للغاية، ولا يستطيع الجميع تفسيره. بالإضافة إلى ذلك، قد يختلف الأمر من مشروع لآخر. سيشرح لك أحد كبار المطورين ما هو المستوى وما يجب تسجيله. الشيء الرئيسي هو أن هذه السجلات كافية لتحليلها في المستقبل. وهذا يُفهم على الفور. التالي هي الإعدادات. يمكن إخبار المسجلين بمكان الكتابة (إلى وحدة التحكم، أو الملف، أو 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
في هذه الحالة، يتم تكوين كل شيء بحيث يكتب المسجل إلى ملف وإلى وحدة التحكم في نفس الوقت. في هذه الحالة؟ إذا تم مسح شيء ما في وحدة التحكم، بالإضافة إلى أنه من الأسهل البحث عن طريق الملف. مستوى المعلومات لكليهما. يتم أيضًا تحديد نمط اسم للملف. هذا هو الحد الأدنى من التكوين الذي يسمح لك بالكتابة على كل من وحدة التحكم والملف في وقت واحد. java.util.logging.FileHandler.appendاضبط على "صحيح" بحيث لا يتم مسح الإدخالات القديمة في الملف. مثال على الاستخدام هو هذا (بدون تعليقات، يعلق المسجل على نفسه):
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("");يتلقى فقط رسالة، أي. لا يمكن تمرير الاستثناء، عليك ترجمته إلى سلسلة بنفسك. آمل أن يكون هذا المثال كافيًا للتعرف على تسجيل Java. ثم يمكنك توصيل أدوات قطع الأشجار الأخرى (log4j، slf4j، Logback...) - هناك الكثير منهم، ولكن الجوهر هو نفسه ^ لتسجيل تاريخ الإجراءات. البرنامج التعليمي الرسمي
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION