JavaRush /جاوا بلاگ /Random-SD /لاگنگ جي ضرورت ڇو آهي؟

لاگنگ جي ضرورت ڇو آهي؟

گروپ ۾ شايع ٿيل
سلام! جڏهن ليڪچر لکڻ، مان خاص طور تي نوٽ ڪريان ٿو ته هڪ خاص موضوع ضرور حقيقي ڪم ۾ استعمال ٿيندو. توهان کي لاگنگ جي ضرورت ڇو آهي - 1 تنهن ڪري، ڌيان! اڄ اسان جنهن موضوع تي رابطو ڪنداسين اهو ضرور توهان جي ڪم جي پهرين ڏينهن کان توهان جي سڀني منصوبن تي ڪارائتو ٿيندو. اسان لاگنگ بابت ڳالهائينداسين. هي موضوع تمام ڏکيو نه آهي (مان به آسان چوندس). پر توهان جي پهرين نوڪري تي اڳ ۾ ئي ڪافي دٻاءُ هوندو ته اڃا تائين واضح شين سان معاملو ڪرڻ لاءِ، تنهن ڪري اهو بهتر آهي ته ان کي چڱي طرح ترتيب ڏيو هاڻي :) سو، اچو ته شروع ڪريون. لاگنگ ڇا آهي؟ لاگنگ ڪنهن پروگرام جي آپريشن بابت ڊيٽا کي رڪارڊ ڪندي آهي. جڳھ جتي ھن ڊيٽا کي لکيو ويو آھي " لاگ " سڏيو ويندو آھي. ٻه سوال هڪ ئي وقت پيدا ٿين ٿا: ڪٿي ۽ ڪهڙي ڊيٽا رڪارڊ ٿيل آهي؟ اچو ته "جتي" سان شروع ڪريون. توهان ڪيترن ئي هنڌن تي پروگرام آپريشن ڊيٽا رڪارڊ ڪري سگهو ٿا. مثال طور، توهان جي پڙهائي دوران توهان اڪثر استعمال ڪندي ڪنسول ڏانهن ڊيٽا ڪڍيو ٿا System.out.println(). هي حقيقي لاگنگ آهي، جيتوڻيڪ آسان ترين. يقينا، اهو ڪلائنٽ يا پراڊڪٽ سپورٽ ٽيم لاءِ تمام آسان ناهي: اهي واضح طور تي IDE کي انسٽال ڪرڻ ۽ ڪنسول کي مانيٽر ڪرڻ نٿا چاهين :) معلومات کي رڪارڊ ڪرڻ لاءِ هڪ وڌيڪ واقف فارميٽ پڻ آهي - ٽيڪسٽ فائل ۾. اهو تمام آسان آهي ماڻهن لاءِ انهن کي پڙهڻ لاءِ هن طريقي سان، ۽ يقيناً ذخيرو ڪرڻ بلڪل آسان! هاڻي ٻيو سوال: پروگرام جي آپريشن بابت ڪهڙي ڊيٽا کي لاگ ۾ رڪارڊ ڪيو وڃي؟ پر هتي هر شيء توهان تي منحصر آهي! جاوا لاگنگ سسٽم تمام لچڪدار آهي. توھان ان کي ترتيب ڏئي سگھوٿا اھڙي طرح توھان جي پروگرام جي پوري ترقي لاگ ان ٿي ويندي. هڪ پاسي، اهو سٺو آهي. پر ٻئي طرف، تصور ڪريو ته فيس بوڪ يا ٽوئيٽر لاگس ڪهڙي سائيز تائين پهچي سگهن ٿا جيڪڏهن سڀ ڪجهه اتي لکيل هجي. اهڙيون وڏيون ڪمپنيون شايد معلومات جي هن رقم کي ذخيرو ڪرڻ جي صلاحيت رکن ٿيون. پر تصور ڪريو ته 500 گيگا بائيٽ ٽيڪسٽ تي مشتمل لاگز ۾ هڪ نازڪ نقص بابت معلومات ڳولڻ ڪيترو ڏکيو هوندو؟ اهو گاهه جي ٿلهي ۾ سُئي کان به بدتر آهي. تنهن ڪري، جاوا ۾ لاگنگ کي ترتيب ڏئي سگهجي ٿو ته جيئن صرف غلطي ڊيٽا لاگ (لاگ) ڏانهن لکيو وڃي. يا اڃا به صرف نازڪ غلطين بابت! جيتوڻيڪ، "جاوا ۾ لاگ ان" چوڻ بلڪل صحيح ناهي. حقيقت اها آهي ته لاگنگ جي ضرورت پروگرامن جي وچ ۾ پيدا ٿيڻ کان اڳ هن فنڪشنلٽي کي ٻوليء ۾ شامل ڪيو ويو. ۽ جڏهن جاوا وٽ پنهنجي لاگنگ لائبريري هئي، هرڪو اڳ ۾ ئي استعمال ڪري رهيو هو log4j لائبريري. جاوا ۾ لاگنگ جي ظاهر ٿيڻ جي تاريخ اصل ۾ تمام ڊگهي ۽ معلوماتي آهي؛ توهان جي فرصت ۾، توهان هن پوسٽ تي پڙهي سگهو ٿا Habré . مختصر ۾، جاوا جي پنهنجي لاگنگ لائبريري آهي، پر تقريبا ڪو به ان کي استعمال نه ڪندو آهي :) بعد ۾، جڏهن ڪيترائي مختلف لاگنگ لائبريري ظاهر ٿيا، ۽ سڀني پروگرامر مختلف استعمال ڪرڻ شروع ڪيو، هڪ مطابقت وارو مسئلو پيدا ٿيو. ماڻهن کي هڪ ئي ڪم ڪرڻ کان روڪڻ لاءِ هڪ درجن مختلف لائبريريون استعمال ڪندي مختلف انٽرفيس سان، slf4j تجزيه فريم ورڪ ٺاهي وئي("جاوا لاءِ سروس لاگنگ جو منهن"). ان کي خلاصي سڏيو ويندو آهي ڇاڪاڻ ته جيتوڻيڪ توهان slf4j ڪلاس استعمال ڪندا آهيو ۽ انهن جي طريقن کي سڏيندا آهيو، هود جي هيٺان اهي سڀئي اڳئين لاگنگ فريم ورڪ هلائي رهيا آهن: log4j، معياري java.util.logging ۽ ٻيا. جيڪڏهن توهان کي في الحال log4j جي ڪجهه خاص خاصيتن جي ضرورت آهي جيڪا ٻين لائبريرين وٽ نه آهي، پر توهان هن خاص لائبريري سان پروجيڪٽ کي سختي سان ڳنڍڻ نٿا چاهيو، صرف slf4j استعمال ڪريو. ۽ هوءَ اڳ ۾ ئي log4j طريقن کي ”ڇڏي“ ويندي. جيڪڏهن توهان پنهنجو ذهن تبديل ڪيو ۽ فيصلو ڪيو ته توهان کي هاڻي log4j خاصيتن جي ضرورت ناهي، توهان کي ٻي لائبريري استعمال ڪرڻ لاءِ صرف ”ريپر“ (يعني slf4j) کي ٻيهر ترتيب ڏيڻ جي ضرورت آهي. توهان جو ڪوڊ ڪم ڪرڻ بند نه ڪندو، ڇاڪاڻ ته ان ۾ توهان slf4j جا طريقا سڏيندا آهيو، ۽ نه ڪنهن مخصوص لائبريري جا. هڪ ننڍڙو تڪرار. ھيٺ ڏنل مثالن لاءِ ڪم ڪرڻ لاءِ، توھان کي slf4j لائبريري ڊائون لوڊ ڪرڻ جي ضرورت آھي ھتان کان ، ۽ log4j لائبريري ھتان . اڳيون، اسان کي آرڪائيو کي کولڻ جي ضرورت آهي ۽ جار فائلن کي شامل ڪرڻ جي ضرورت آهي اسان کي Intellij IDEA ذريعي ڪلاس پاٿ ۾. مينيو شيون: فائل -> پروجيڪٽ جو ڍانچو -> لائبريريون ضروري جار چونڊيو ۽ انھن کي پراجيڪٽ ۾ شامل ڪريو (اھي آرڪائيوز ۾ ڪيترائي جار آھن جيڪي اسان ڊائون لوڊ ڪيا آھن، انھن کي ڏسو جيڪي توھان کي تصويرن ۾ گھربل آھن) توهان کي لاگنگ جي ضرورت ڇو آهي - 2توهان کي لاگنگ جي ضرورت ڇو آهي - 3نوٽ - ھي ھدايت انھن لاءِ آھي. شاگرد جيڪي نٿا ڄاڻن ته Maven ڪيئن استعمال ڪجي. جيڪڏھن توھان ڄاڻو ٿا ته اھو ڪيئن استعمال ڪجي، اھو بھتر آھي ته ان سان شروع ڪرڻ جي ڪوشش ڪريو: اھو عام طور تي گھڻو آسان آھي. جيڪڏھن توھان Maven استعمال ڪريو ٿا ، ھي انحصار شامل ڪريو:
<dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j-impl</artifactId>
            <version>2.14.0</version>
</dependency>
چڱو، اسان سيٽنگون ترتيب ڏنيون آهن :) اچو ته ڏسو ته slf4j ڪيئن ڪم ڪري ٿو. اسان ڪيئن پڪ ڪري سگهون ٿا ته پروگرام جي ترقي ڪٿي رڪارڊ ٿيل آهي؟ ان لاءِ اسان کي ٻن شين جي ضرورت آهي - هڪ logger ۽ هڪ appender . اچو ته پهرين سان شروع ڪريون. Logger هڪ اعتراض آهي جيڪو مڪمل طور تي رڪارڊ رکڻ کي منظم ڪري ٿو . هڪ لاگر ٺاهڻ تمام آسان آهي: اهو هڪ جامد طريقو استعمال ڪندي ڪيو ويندو آهي - LoggerFactory.getLogger(). طريقي جي پيٽرولر جي طور تي، توهان کي هڪ ڪلاس پاس ڪرڻ جي ضرورت آهي جنهن جو ڪم لاگ ان ڪيو ويندو. اچو ته اسان جو ڪوڊ هلون:
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MyTestClass {

   public static final Logger LOGGER = LoggerFactory.getLogger(MyTestClass.class);

   public static void main(String[] args) {

       LOGGER.info("Test log record!!!");
       LOGGER.error("В программе возникла ошибка!");
   }
}
ڪنسول آئوٽ: ERROR StatusLogger No Log4j 2 ٺاھ جوڙ واري فائل ملي. ڊفالٽ ترتيبن کي استعمال ڪندي (صرف ڪنسول ۾ غلطيون لاگ ان ڪرڻ)، يا صارف پروگرام جي ترتيب سان مهيا ڪيل ترتيبون. Log4j 2 اندروني شروعاتي لاگنگ ڏيکارڻ لاءِ سسٽم جي ملڪيت 'log4j2.debug' سيٽ ڪريو. ڏسو https://logging.apache.org/log4j/2.x/manual/configuration.html Log4j 2 15:49:08.907 [main] ERROR MyTestClass - پروگرام ۾ هڪ غلطي ٿي وئي آهي. اسان هتي ڇا ٿا ڏسو؟ پهرين اسان هڪ غلطي پيغام ڏسون ٿا. اهو ظاهر ٿيو ڇاڪاڻ ته اسان وٽ في الحال ضروري سيٽنگون نه آهن. تنهن ڪري، اسان جو لاگر هاڻي صرف آئوٽ ڪري سگهي ٿو غلطي پيغام (ERROR) ۽ صرف ڪنسول ڏانهن. طريقيڪار logger.info()تي عمل نه ڪيو ويو. پر logger.error()اهو ڪم ڪيو! ڪنسول ڏيکاري ٿو موجوده تاريخ، طريقو جتي غلطي ٿي آهي ( main)، لفظ ERROR ۽ اسان جو پيغام! ERROR لاگنگ جي سطح آھي. عام طور تي، جيڪڏهن لاگ انٽري لفظ ERROR سان نشان لڳل آهي، ان جو مطلب آهي ته پروگرام ۾ ان نقطي تي هڪ غلطي ٿي وئي آهي. جيڪڏهن هڪ داخلا لفظ INFO سان نشان لڳل آهي، ان جو مطلب آهي ته اهو صرف پروگرام جي عام آپريشن بابت موجوده معلومات آهي. SLF4J لائبريري ۾ ڪجھ مختلف لاگنگ سطحون آھن جيڪي توھان کي اجازت ڏين ٿيون لچڪدار طريقي سان لاگنگ کي ترتيب ڏيو. اهي منظم ڪرڻ بلڪل آسان آهن: سڀئي ضروري منطق اڳ ۾ ئي ڪلاس ۾ شامل آهن Logger. توهان کي صرف ضروري طريقن کي سڏڻ جي ضرورت آهي. جيڪڏهن توهان باقاعده پيغام پوسٽ ڪرڻ چاهيو ٿا، ڪال ڪريو logger.info(). غلطي جو پيغام - logger.error(). ڊيڄاريندڙ ڏيکاريو - logger.warn() هاڻي اچو ته ضمير بابت ڳالهايون . ضمير اهو جڳهه آهي جتي توهان جي ڊيٽا اچي ٿي. توھان چئي سگھوٿا ڊيٽا ماخذ جي ابتڙ ”پوائنٽ بي“ آھي. ڊفالٽ طور، ڊيٽا ڪنسول ڏانهن ٻاھر آھي. مهرباني ڪري نوٽ ڪريو ته پوئين مثال ۾ اسان کي ڪجهه به ترتيب ڏيڻ جي ضرورت نه هئي: متن پاڻ ڪنسول ۾ ظاهر ٿيو، پر log4j لائبريري مان لاگر صرف ڪنسول ڏانهن ERROR سطح جا پيغام ڪڍي سگھن ٿا. اهو واضح طور تي وڌيڪ آسان آهي ماڻهن لاء هڪ ٽيڪسٽ فائل مان لاگ پڙهڻ ۽ ساڳئي فائلن ۾ لاگ ان کي ذخيرو ڪرڻ. لاگر جي ڊفالٽ رويي کي تبديل ڪرڻ لاء، اسان کي اسان جي فائل اپنڊر کي ترتيب ڏيڻ جي ضرورت آهي . شروع ڪرڻ لاءِ، توھان کي log4j.xml فائل ٺاھڻ جي ضرورت آھي ساڄي src فولڊر ۾ ، يا ريسورس فولڊر ۾، جيڪڏھن توھان Maven استعمال ڪريو ٿا، يا ريسورس فولڊر ۾، جيڪڏھن توھان Maven استعمال ڪريو ٿا. توھان اڳ ۾ ئي xml فارميٽ کان واقف آھيو، اسان تازو ان بابت ليڪچر ڏنو آھي :) اھو اھو آھي جيڪو ان جو مواد ھوندو:
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="INFO">
   <Appenders>
       <File name="MyFileAppender" fileName="C:\Users\Username\Desktop\testlog.txt" immediateFlush="false" append="false">
           <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
       </File>
   </Appenders>
   <Loggers>
       <Root level="INFO">
           <AppenderRef ref="MyFileAppender"/>
       </Root>
   </Loggers>
</Configuration>
اهو خاص طور تي پيچيده نظر نٿو اچي :) پر اچو ته اڃا تائين مواد ذريعي وڃو.
<Configuration status="INFO">
هي آهي نام نهاد اسٽيٽس لاگر. اهو اسان جي لاگر سان لاڳاپيل ناهي ۽ log4j پاران اندروني طور استعمال ڪيو ويندو آهي. توھان سيٽ ڪري سگھو ٿا status="TRACE" بدران Status="INFO"، ۽ log4j جي اندروني ڪم جي باري ۾ سڀ معلومات ڪنسول ڏانھن ٻاھر نڪرندي (status-logger ڊيٽا کي ڪنسول ڏانھن ڪڍي ٿو، جيتوڻيڪ پروگرام لاءِ اسان جو ضميمو فائل آھي. -بنياد). اسان کي هاڻي ان جي ضرورت نه آهي، تنهنڪري اسان سڀ ڪجهه ڇڏي ڏينداسين جيئن اهو آهي.
<Appenders>
   <File name="MyFileAppender" fileName="C:\Users\Евгений\Desktop\testlog.txt" append="true">
       <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
   </File>
</Appenders>
هتي اسان پنهنجو ضمير ٺاهيندا آهيون. ٽيگ <File>ظاهر ڪري ٿو ته اهو هڪ فائل هوندو. name="MyFileAppender"- اسان جي ضمير جو نالو. fileName="C:\Users\Username\Desktop\testlog.txt"- لاگ فائل ڏانهن رستو جتي سڀ ڊيٽا لکيا ويندا. append="true"- ڇا اهو ضروري آهي ته فائل جي آخر ۾ اضافي ڊيٽا لکڻ لاء. اسان جي حالت ۾ اهو معاملو ٿيندو. جيڪڏھن غلط تي سيٽ ڪيو ويو ، پراڻو لاگ مواد ختم ڪيو ويندو ھر دفعي پروگرام ٻيهر شروع ڪيو ويندو. <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>- اهي فارميٽنگ سيٽنگون آهن. هتي اسان پنهنجي لاگ ۾ متن جي فارميٽ کي ترتيب ڏيڻ لاءِ باقاعده اظهار استعمال ڪري سگهون ٿا.
<Loggers>
       <Root level="INFO">
           <AppenderRef ref="MyFileAppender"/>
       </Root>
</Loggers>
هتي اسان لاگنگ ليول (روٽ ليول) بيان ڪريون ٿا. اسان وٽ INFO ليول سيٽ آھي: اھو آھي، INFO کان مٿاھين سطحن تي سڀ پيغام (جنھن ٽيبل جي مطابق اسان مٿي ڏٺو آھي) لاگ ۾ شامل نه ٿيندا. اسان وٽ اسان جي پروگرام ۾ 3 پيغام هوندا: هڪ ڄاڻ، هڪ خبردار ۽ هڪ ERROR. موجوده ٺاھ جوڙ سان، سڀ 3 نياپا لاگ ۾ لکندا. جيڪڏهن توهان روٽ ليول کي ERROR ۾ تبديل ڪريو ٿا، صرف LOGGER.error() کان آخري پيغام لاگ ان ٿيندو. ان کان علاوه، ضميمه جي لنڪ هتي رکيل آهي. اهڙي لنڪ ٺاهڻ لاءِ، توهان کي ٽيگ جي اندر <Root>هڪ ٽيگ ٺاهڻو پوندو <ApprenderRef>۽ ان ۾ پيراميٽر شامل ڪريو ref=”Name твоего аппендера”. اسان هتي اپنڊر جو نالو ٺاهيو، جيڪڏهن توهان وساري ڇڏيو: <File name="MyFileAppender" ۽ هتي اسان جي پروگرام جو ڪوڊ آهي!
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MyTestClass {

   public static final Logger LOGGER = LoggerFactory.getLogger(MyTestClass.class);

   public static void main(String[] args) {

       LOGGER.info("Начало работы программы!!!");

       try {
           LOGGER.warn("Внимание! Программа пытается разделить одно число на другое");
           System.out.println(12/0);
       } catch (ArithmeticException x) {

           LOGGER.error("Ошибка! Произошло деление на ноль!");
       }
   }
}
يقينن، اهو ٿورڙو ٽڙيل آهي (پڪڙڻ RuntimeException هڪ معمولي خيال آهي)، پر اهو اسان جي مقصدن لاءِ مڪمل آهي :) اچو ته اسان جو طريقو main()4 ڀيرا قطار ۾ هلون ۽ ڏسو اسان جي testlog.txt فائل. ان کي اڳ ۾ ٺاهڻ جي ڪا ضرورت ناهي: لائبريري اهو خودڪار طريقي سان ڪندو. سڀ ڪم ڪيو! :) هاڻي توهان وٽ هڪ ترتيب ڏنل لاگر آهي. توھان ڪجھ پروگرامن سان گڏ راند ڪري سگھو ٿا جيڪي توھان اڳ ۾ لکيا آھن، سڀني طريقن سان لاگر ڪالون شامل ڪندي، ۽ نتيجو لاگ ڏسو :) اضافي پڙھڻ لاء، مان ھن مضمون جي ڏاڍي سفارش ڪريان ٿو . اتي، لاگنگ جي موضوع تي تفصيل سان بحث ڪيو ويو آهي، ۽ ان کي هڪ ويٺي ۾ پڙهڻ آسان نه ٿيندو. پر ان ۾ ڪافي مفيد اضافي معلومات شامل آھي. مثال طور، توهان سکو ته هڪ لاگر کي ڪيئن ترتيب ڏيو ته جيئن اهو هڪ نئين ٽيڪسٽ فائل ٺاهي جيڪڏهن اسان جي testlog.txt فائل هڪ خاص سائيز تائين پهچي وڃي :) ۽ اهو اسان جي سبق جي پڄاڻي آهي! اڄ توهان هڪ تمام اهم موضوع جي باري ۾ ڄاڻ حاصل ڪئي، ۽ اهو علم ضرور توهان جي مستقبل جي ڪم ۾ توهان لاء مفيد ثابت ٿيندو. وري ملنداسين! :)
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION