ظهر بخیر، امروز یک حادثه در سایت صنعتی ثبت شد، از سازنده می خواهم به گروه تحلیل بپیوندد. یکی از روزهای کاری شما ممکن است چیزی شبیه به این شروع شود، یا ممکن است صبح باشد - مهم نیست. اما بیایید از ابتدا شروع کنیم. با حل مشکلات اینجا در JavaRush، یاد می گیرید که کدی بنویسید که کار کند و آنچه از آن انتظار می رود انجام دهد. اگر به بخش راهنما نگاه کنید ، واضح است که همیشه در اولین بار جواب نمی دهد. در محل کار هم همینطور خواهد بود. شما همیشه یک مشکل را در اولین بار حل نمی کنید: اشکالات همراهان ابدی ما هستند. مهم است که بتوانید رویدادهای باگ را بازیابی کنید. بیایید با یک مثال شروع کنیم. بیایید تصور کنیم که شما یک پلیس هستید. شما را به محل حادثه فراخواندند (شیشه مغازه شکسته شد)، رسیدید و منتظر پاسخ شما در مورد اتفاقات هستند. از کجا شروع کنیم؟ من نمی دانم پلیس چگونه کار می کند. خیلی مشروط - آنها شروع به جستجوی شاهد، شواهد و همه چیز می کنند. اگر خود آن مکان بتواند با جزئیات به شما بگوید چه اتفاقی افتاده است؟ به عنوان مثال، مانند این:
- ساعت 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 وارد سیستم می شویم.
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...) را متصل کنید - تعداد زیادی از آنها وجود دارد، اما ماهیت همان است^ برای ثبت تاریخچه اقدامات. آموزش رسمی
GO TO FULL VERSION