JavaRush /جاوا بلاگ /Random-UR /جاوا لاگنگ۔ اسٹیکٹریس کی ایک گیند کو کھولیں۔

جاوا لاگنگ۔ اسٹیکٹریس کی ایک گیند کو کھولیں۔

گروپ میں شائع ہوا۔
"صبح بخیر، آج صنعتی سائٹ پر ایک واقعہ ریکارڈ کیا گیا، میں ڈویلپر سے تجزیہ گروپ میں شامل ہونے کو کہتا ہوں۔" کام پر آپ کا ایک دن کچھ اس طرح شروع ہو سکتا ہے، یا یہ صبح ہو سکتی ہے – اس سے کوئی فرق نہیں پڑتا۔ لیکن آئیے شروع سے شروع کرتے ہیں۔ یہاں جاوا رش میں مسائل کو حل کرکے، آپ کوڈ لکھنا سیکھتے ہیں جو کام کرتا ہے اور کرتا ہے جو اس سے توقع کی جاتی ہے۔ اگر آپ مدد کے حصے کو دیکھیں تو یہ واضح ہے کہ یہ ہمیشہ پہلی بار کام نہیں کرتا۔ کام پر بھی ایسا ہی ہوگا۔ آپ ہمیشہ پہلی بار کسی مسئلے کو حل نہیں کریں گے: کیڑے ہمارے ابدی ساتھی ہیں۔ یہ ضروری ہے کہ آپ بگ کے واقعات کو بحال کر سکیں۔ لاگنگ  اسٹیکٹریس کی ایک گیند کو کھولیں - 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 - کچھ اور۔
  • ڈیبگ - کسی خاص لمحے کے واقعات کو مزید تفصیل سے بیان کرتا ہے۔ مثال کے طور پر، تاریخ میں کسی جنگ کی تفصیلات ڈیبگ کی سطح پر ہیں۔" کمانڈر تاکیتووچ اپنی فوج کے ساتھ سیلووچا گاؤں کی طرف بڑھے ۔"
  • 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 پر سیٹ کریں تاکہ فائل میں پرانی اندراجات مٹ نہ جائیں۔ استعمال کی ایک مثال یہ ہے (بغیر تبصرے کے، لاگر خود پر تبصرہ کرتا ہے):
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