JavaRush /وبلاگ جاوا /Random-FA /ثبت جاوا. یک توپ از استتراس را باز کنید

ثبت جاوا. یک توپ از استتراس را باز کنید

در گروه منتشر شد
ظهر بخیر، امروز یک حادثه در سایت صنعتی ثبت شد، از سازنده می خواهم به گروه تحلیل بپیوندد. یکی از روزهای کاری شما ممکن است چیزی شبیه به این شروع شود، یا ممکن است صبح باشد - مهم نیست. اما بیایید از ابتدا شروع کنیم. با حل مشکلات اینجا در 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.util.Logger: برای آشنایی با یکدیگر کافی است. هر ورودی گزارش شامل تاریخ-زمان، سطح رویداد، پیام است. تاریخ و زمان به صورت خودکار وارد می شود. سطح رویداد توسط نویسنده پیام انتخاب می شود. چندین سطح وجود دارد. موارد اصلی اطلاعات، اشکال زدایی، خطا هستند.
  • INFO - معمولاً اینها پیام های اطلاعاتی در مورد آنچه اتفاق می افتد هستند، چیزی شبیه به تاریخچه بر اساس تاریخ: 1915 - اتفاقی افتاد، 1916 - چیز دیگری.
  • DEBUG - رویدادهای یک لحظه خاص را با جزئیات بیشتری توصیف می کند. به عنوان مثال، جزئیات یک نبرد در تاریخ در سطح اشکال زدایی است." فرمانده تاکویتوویچ با ارتش خود به سمت روستای سلویچا پیشروی کرد .
  • ERROR - خطاهایی که رخ می دهند معمولاً در اینجا نوشته می شوند. احتمالاً متوجه شده اید که وقتی چیزی را در آن قرار می دهید try-catch، بلوک catchبا e.printStacktrace(). فقط ورودی را به کنسول خروجی می دهد. با استفاده از یک لاگر، می توانید این ورودی را برای لاگر ارسال کنید (هاها)، ایده می گیرید.
  • هشدار - هشدارها در اینجا نوشته شده است. به عنوان مثال، یک چراغ بیش از حد در یک ماشین. این فقط یک هشدار است و بهتر است چیزی را تغییر دهید، اما این یک خرابی نیست. هنگامی که دستگاه خراب می شود، با سطح ERROR وارد سیستم می شویم.
ما سطوح را مرتب کرده ایم. اما نگران نباشید: خط بین آنها بسیار نازک است - همه نمی توانند آن را توضیح دهند. به علاوه، ممکن است از پروژه ای به پروژه دیگر متفاوت باشد. یک توسعه دهنده ارشد به شما توضیح می دهد که در چه سطحی و چه چیزی باید وارد شوید. نکته اصلی این است که این سوابق برای تجزیه و تحلیل آینده برای شما کافی است. و این در پرواز درک می شود. بعد تنظیمات است. می توان به لاگرها گفت که کجا بنویسند (در کنسول، فایل، 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روی 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