CodeGym /جاوا بلاگ /Random-SD /جاوا لاگنگ
John Squirrels
سطح
San Francisco

جاوا لاگنگ

گروپ ۾ شايع ٿيل
سلام سبق لکڻ وقت، مان خاص طور تي زور ڏيان ٿو ته جيڪڏهن ڪو خاص موضوع آهي جيڪو حقيقي ڪم ۾ بلڪل ضروري هوندو. سو، ٻڌو! اهو موضوع جيڪو اسان اڄ ڍڪيندا سين، يقيناً توهان جي سڀني منصوبن ۾ روزگار جي پهرين ڏينهن کان ڪم ايندو. اسان جاوا لاگنگ بابت ڳالهائڻ وارا آهيون. هي موضوع تمام پيچيده نه آهي (مان به آسان چوان ها). پر توهان وٽ ڪافي واضح شيون هونديون جيڪي توهان جي پهرين نوڪري تي دٻاءُ وجهڻ لاءِ آهن، تنهن ڪري اهو بهتر آهي ته ان کي چڱيءَ طرح سمجهو هن وقت :) خير، اچو ته شروع ڪريون.

جاوا ۾ لاگ ان ڇا آهي؟

لاگنگ هڪ پروگرام جي آپريشن بابت ڊيٽا کي رڪارڊ ڪرڻ جو عمل آهي. اها جڳهه جتي اسان هن ڊيٽا کي رڪارڊ ڪيو آهي "لاگ" سڏيو ويندو آهي. ٻه سوال فوري طور تي پيدا ٿين ٿا: ڇا ڊيٽا لکيو ويو آهي ۽ ڪٿي؟ اچو ته "جتي" سان شروع ڪريون. توهان ڪيترن ئي هنڌن تي پروگرام جي ڪم بابت ڊيٽا لکي سگهو ٿا. مثال طور، توهان جي پڙهائي دوران، توهان اڪثر System.out.println()ڪنسول ڏانهن ڊيٽا ڪڍڻ لاءِ. هي واقعي لاگنگ آهي، جيتوڻيڪ ان جي آسان ترين شڪل ۾. يقينن، اهو استعمال ڪندڙن يا هڪ پراڊڪٽ سپورٽ ٽيم لاءِ تمام آسان ناهي: ظاهر آهي، اهي IDE کي انسٽال ڪرڻ ۽ ڪنسول کي مانيٽر ڪرڻ نٿا چاهين :) معلومات کي رڪارڊ ڪرڻ لاءِ هڪ وڌيڪ رواجي فارميٽ آهي: ٽيڪسٽ فائلون. انسان هن فارميٽ ۾ ڊيٽا پڙهڻ ۾ تمام گهڻو آرامده آهن، ۽ يقيناً اهو ڊيٽا کي محفوظ ڪرڻ لاءِ تمام گهڻو آسان آهي! هاڻي ٻيو سوال: ڪهڙي پروگرام جي ڊيٽا کي لاگ ان ٿيڻ گهرجي؟ اهو مڪمل طور تي توهان تي آهي! جاوا جو لاگنگ سسٽم تمام لچڪدار آهي. توھان ان کي ترتيب ڏئي سگھوٿا ان کي لاگ ان ڪرڻ لاءِ جيڪو توھان جو پروگرام ڪندو آھي. هڪ پاسي، اهو سٺو آهي. پر ٻئي طرف، تصور ڪريو ته فيسبوڪ يا ٽوئيٽر جا لاگس ڪيترا وڏا هوندا جيڪڏهن اهي انهن ۾ سڀ ڪجهه لکن. اهي وڏيون ڪمپنيون شايد ايتري ڊيٽا کي ذخيرو ڪرڻ جي صلاحيت رکن ٿيون. پر تصور ڪريو ته 500 گيگا بائيٽ ٽيڪسٽ لاگز ۾ هڪ نازڪ غلطي بابت معلومات ڳولڻ ڪيترو ڏکيو هوندو؟ اهو گاهه جي دڙي ۾ سوئي ڳولڻ کان وڌيڪ خراب هوندو. انهي جي مطابق، جاوا صرف غلطي ڊيٽا کي لاگ ان ڪرڻ لاء ترتيب ڏئي سگهجي ٿو. يا اڃا به صرف نازڪ غلطيون! اهو چيو ته، جاوا جي اصلي لاگنگ سسٽم بابت ڳالهائڻ مڪمل طور تي درست ناهي. حقيقت اها آهي ته پروگرامرز کي لاگنگ جي ضرورت هئي انهي کان اڳ هن فنڪشنلٽي کي ٻولي ۾ شامل ڪيو ويو. جڏهن جاوا پنهنجي لاگنگ لائبريري متعارف ڪرايو، هرڪو اڳ ۾ ئي استعمال ڪري رهيو هو log4j لائبريري. جاوا ۾ لاگنگ جي تاريخ اصل ۾ تمام ڊگهي ۽ معلوماتي آهي. مختصر ۾، جاوا وٽ پنهنجي لاگنگ لائبريري آهي، پر تقريبن ڪو به ان کي استعمال نٿو ڪري :) بعد ۾، جڏهن ڪيترائي مختلف لاگنگ لائبريريون ظاهر ٿيون ۽ پروگرامرز پاران استعمال ٿيڻ شروع ڪيو، مطابقت جا مسئلا پيدا ٿيا. ماڻهن کي مختلف انٽرفيس سان درجن جي مختلف لائبريرين ۾ وهيل کي ٻيهر ايجاد ڪرڻ کان روڪڻ لاءِ، خلاصو SLF4J فريم ورڪ ("جاوا لاءِ سروس لاگنگ فيڪڊ") ٺاهيو ويو. ان کي خلاصو سڏيو ويندو آهي، ڇاڪاڻ ته جيتوڻيڪ جيڪڏهن توهان SLF4J طبقن جا طريقا استعمال ۽ سڏيندا آهيو، هود جي هيٺان اهي اصل ۾ سڀ لاگنگ فريم ورڪ استعمال ڪندا آهن جيڪي اڳ ۾ آيا آهن: log4j، معياري java.util.logging، ۽ ٻيا. جيڪڏهن ڪنهن موقعي تي توهان کي Log4j جي ڪجهه خاص خاصيتن جي ضرورت آهي جيڪا ٻين لائبريرين ۾ نه آهي، پر توهان نٿا چاهيو ته توهان پنهنجي پروجيڪٽ کي سڌو سنئون هن لائبريري سان ڳنڍڻ، صرف SLF4J استعمال ڪريو. ۽ پوء ان کي سڏين ٿا Log4j طريقن. جيڪڏهن توهان پنهنجو ذهن تبديل ڪيو ۽ فيصلو ڪيو ته توهان کي هاڻي Log4j خاصيتن جي ضرورت ناهي، توهان کي صرف "ريپر" (يعني SLF4J) کي ٻي لائبريري استعمال ڪرڻ لاءِ ٻيهر ترتيب ڏيڻ جي ضرورت آهي. توهان جو ڪوڊ ڪم ڪرڻ بند نه ڪندو، ڇو ته توهان SLF4J طريقن کي سڏي رهيا آهيو، نه ڪي مخصوص لائبريري. هڪ ننڍڙو تڪرار. ھيٺ ڏنل مثالن لاءِ ڪم ڪرڻ لاءِ، توھان کي ڊائون لوڊ ڪرڻ جي ضرورت آھي SLF4J لائبريري ھتي ، ۽ Log4j لائبريري ھتي . اڳيون، آرڪائيو کي کوليو ۽ استعمال ڪريو IntelliJ IDEA JAR فائلن کي ڪلاس پاٿ ۾ شامل ڪرڻ لاءِ. مينيو شيون: فائل -> پروجيڪٽ جو ڍانچو -> لائبريريون ضروري JAR فائلون چونڊيو ۽ انھن کي پروجيڪٽ ۾ شامل ڪريو (جيڪي آرڪائيوز اسان ڊائون لوڊ ڪيا آھن انھن ۾ ڪيتريون ئي JAR فائلون شامل آھن - انھن تصويرن کي ڏسو جيڪي توھان کي گھربل آھن) نوٽ ڪريو ھي ھدايت انھن شاگردن ڇو اسان کي لاگنگ جي ضرورت آهي - 2ڇو اسان کي لاگنگ جي ضرورت آهي - 3لاءِ جن کي خبر ناهي ته Maven ڪيئن استعمال ڪجي. جيڪڏهن توهان ڄاڻو ٿا ته Maven ڪيئن استعمال ڪجي، اهو عام طور تي بهتر آهي (گهڻو آسان) اتي شروع ڪرڻ جي ڪوشش ڪرڻ. جيڪڏھن توھان استعمال ڪريو Maven ، ھي انحصار شامل ڪريو:
<dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j-impl</artifactId>
            <version>2.14.0</version>
</dependency>
زبردست! اسان سيٽنگون ڪڍيون :) اچو ته ڏسو ته ڪيئن SLF4J ڪم ڪري ٿو. اسان ڪيئن پڪ ڪريون ٿا ته پروگرام جو ڪم ڪٿي رڪارڊ ٿيل آهي؟ هن کي ڪرڻ لاء، اسان کي ٻن شين جي ضرورت آهي: logger ۽ appender. اچو ته پهرين سان شروع ڪريون. هڪ لاگر هڪ اعتراض آهي جيڪو لاگنگ جي مڪمل ڪنٽرول مهيا ڪري ٿو. هڪ لاگر ٺاهڻ تمام آسان آهي: اسان اهو ڪندا آهيون static 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 entry!!!");
       LOGGER.error("An error occurred!");
   }
}
ڪنسول آئوٽ:

ERROR StatusLogger No Log4j 2 configuration file found. Using default configuration (logging only errors to the console), or user programmatically provided configurations. Set system property 'log4j2.debug' to show Log4j 2 internal initialization logging. See https://logging.apache.org/log4j/2.x/manual/configuration.html for instructions on how to configure Log4j 2 15:49:08.907 [main] ERROR MyTestClass - An error occurred!
اسان هتي ڇا ٿا ڏسو؟ پهرين، اسان هڪ غلطي پيغام ڏسون ٿا. اهو ان حقيقت جو نتيجو آهي ته هاڻي اسان وٽ ضروري سيٽنگن جي کوٽ آهي. ان جي مطابق، اسان جو لاگر في الحال صرف آئوٽ ڪرڻ جي قابل آهي غلطي پيغام (ERROR) ۽ صرف ڪنسول ڏانهن. logger.info () طريقو ڪم نه ڪيو. پر logger.error() ڪيو! ڪنسول تي، اسان ڏسون ٿا موجوده تاريخ، اهو طريقو جتي غلطي ٿي آهي ( main )، لفظ "ERROR"، ۽ اسان جو پيغام! ERROR لاگنگ جي سطح آھي. عام طور تي، جيڪڏهن لاگ انٽري لفظ "ERROR" سان نشان لڳل آهي، پوء پروگرام ۾ هن نقطي تي هڪ غلطي ٿي چڪي آهي. جيڪڏهن داخلا لفظ سان نشان لڳل آهي "INFO"، پوء پيغام صرف پروگرام جي عام آپريشن بابت موجوده معلومات جي نمائندگي ڪري ٿو. SLF4J لائبريري ۾ ڪيترائي مختلف لاگنگ ليول آھن جيڪي توھان کي لاگنگ کي لچڪدار طريقي سان ترتيب ڏيڻ جي اجازت ڏين ٿيون. اهو انتظام ڪرڻ تمام آسان آهي: سڀ ضروري منطق اڳ ۾ ئي جاوا لاگر ڪلاس ۾ آهي. توهان کي صرف لاڳاپيل طريقن کي سڏڻ جي ضرورت آهي. جيڪڏهن توهان هڪ معمولي پيغام کي لاگ ان ڪرڻ چاهيو ٿا، ڪال ڪريو logger.info() طريقو. غلط پيغام لاءِ، logger.error() استعمال ڪريو . ڊيڄاريندڙ لاءِ، استعمال ڪريو logger.warn()

هاڻي اچو ته ضمير جي باري ۾ ڳالهايون

هڪ ضمير اهو هنڌ آهي جتي توهان جي ڊيٽا وڃي ٿي. هڪ طريقي سان، ڊيٽا جي ذريعن جي سامهون، يعني "پوائنٽ B". ڊفالٽ طور، ڊيٽا ڪنسول ڏانهن ٻاھر آھي. نوٽ ڪريو ته پوئين مثال ۾ اسان کي ڪجھ به ترتيب ڏيڻ جي ضرورت نه ھئي: متن ڪنسول ۾ ظاهر ٿيو، ۽ Log4j لائبريري جو لاگر صرف ڪنسول ڏانھن ERROR-سطح جا پيغام ڪڍي سگھي ٿو. ظاهر آهي، اهو وڌيڪ آسان آهي ماڻهن لاءِ لکڻ پڙهڻ ۽ لکڻ پڙهڻ لاءِ ٽيڪسٽ فائل ۾ لاگ. لاگر جي ڊفالٽ رويي کي تبديل ڪرڻ لاء، اسان کي اسان جي فائل اپنڊر کي ترتيب ڏيڻ جي ضرورت آهي. شروع ڪرڻ لاءِ، توهان کي log4j.xml فائل ٺاهڻ جي ضرورت آهي سڌو سنئون src فولڊر ۾. توھان اڳ ۾ ئي 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">
اھو آھي جنھن کي StatusLogger سڏيو ويندو آھي. اهو اسان جي لاگر سان لاڳاپيل ناهي ۽ Log4j جي اندروني عملن ۾ استعمال ٿيندو آهي. جيڪڏهن توهان Status="INFO" جي بدران status="TRACE" سيٽ ڪيو، ۽ Log4j جي اندروني ڪم بابت سموري معلومات ڪنسول تي ڏيکاري ويندي (StatusLogger ڪنسول تي ڊيٽا ڏيکاري ٿو، جيتوڻيڪ اسان جو ضميمو هڪ فائل آهي). اسان کي هاڻي ان جي ضرورت ناهي، تنهنڪري اچو ته ان کي ڇڏي ڏيو جيئن اهو آهي.
<Appenders>
   <File name="MyFileAppender" fileName="C:\Users\Evgeny\Desktop\testlog.txt" append="true">
       <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n"/>
   </File>
</Appenders>
هتي اسان پنهنجو ضمير ٺاهيندا آهيون. < فائل> ٽيگ ظاھر ڪري ٿو ته اھو ھڪڙو فائل اپنڊر ٿيندو. 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 پيغام هوندا: هڪ ڄاڻ، هڪ خبردار ۽ هڪ غلطي. موجوده ترتيب سان، سڀ 3 پيغام لاگ ان ڪيا ويندا. جيڪڏهن توهان روٽ ليول کي ERROR ۾ تبديل ڪريو ٿا، صرف LOGGER.error() ميٿڊ ڪال مان آخري پيغام لاگ ۾ ختم ٿي ويندو. اضافي طور تي، ضمير جو حوالو پڻ هتي وڃي ٿو. اهڙو حوالو ٺاهڻ لاءِ، توهان کي <Root> ٽيگ جي اندر هڪ <ApprenderRef> ٽيگ ٺاهڻو پوندو ۽ ان ۾ ref='your appender's 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("The program is starting!!!");

       try {
           LOGGER.warn("Attention! The program is trying to divide a number by another.
           System.out.println(12/0);
       } catch (ArithmeticException x) {

           LOGGER.error("Error! Division by zero!");
       }
   }
}
يقينن، اهو ٿورڙو بيوقوف آهي (هڪ RuntimeException کي پڪڙڻ هڪ قابل اعتراض خيال آهي)، پر اهو اسان جي مقصدن لاء مڪمل آهي :) اچو ته اسان جي مکيه () طريقي کي 4 ڀيرا قطار ۾ هلون ۽ اسان جي testlog.txt فائل کي ڏسو. توهان کي ان کي اڳ ۾ ٺاهڻ جي ضرورت ناهي: لائبريري اهو خودڪار طريقي سان ڪندي. سڀ ڪم ڪيو! :) هاڻي توهان وٽ هڪ ترتيب ڏنل لاگر آهي. توهان پنهنجي ڪجهه پراڻي پروگرامن سان گڏ راند ڪري سگهو ٿا، هر طريقي سان لاگر ڪالون شامل ڪندي. ان کان پوء نتيجو لاگ ان کي ڏسو :) اهو غور ڪري ٿو لاگ ان جي کوٽائي جي موضوع تي. اهو سڀ ڪجهه هڪ ئي ويٽنگ ۾ پڙهڻ مشڪل هوندو. اهو چيو ته، ان ۾ شامل آهي تمام گهڻو اضافي مفيد معلومات. مثال طور، توهان سيکاريندا ته لاگر کي ڪيئن ترتيب ڏيو ته جيئن اسان جي testlog.txt فائل هڪ خاص سائيز تائين پهچي وڃي ته اهو هڪ نئين ٽيڪسٽ فائل ٺاهي :) ۽ اهو اسان جي طبقي کي ختم ڪري ٿو! اڄ توهان هڪ انتهائي اهم موضوع کان واقف ٿي ويا آهيو، ۽ اهو علم ضرور توهان جي مستقبل جي ڪم ۾ مددگار ثابت ٿيندو. ٻئي دفعي تائين! :)
تبصرا
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION