CodeGym /Java Blog /এলোমেলো /জাভা লগিং
John Squirrels
লেভেল 41
San Francisco

জাভা লগিং

এলোমেলো দলে প্রকাশিত
ওহে! পাঠগুলি লেখার সময়, আমি বিশেষভাবে জোর দিই যদি একটি নির্দিষ্ট বিষয় থাকে যা বাস্তব কাজে একেবারে অপরিহার্য হবে। তাই, শুনুন! আজকে আমরা যে বিষয়টি কভার করব তা অবশ্যই কর্মসংস্থানের প্রথম দিন থেকে আপনার সমস্ত প্রকল্পে কাজে আসবে। আমরা জাভা লগিং সম্পর্কে কথা বলতে যাচ্ছি। এই বিষয়টি মোটেও জটিল নয় (আমি এমনকি সহজ বলতে চাই)। কিন্তু আপনার প্রথম চাকরিতে চাপ দেওয়ার জন্য আপনার যথেষ্ট স্পষ্ট জিনিস থাকবে, তাই এখনই এটি পুঙ্খানুপুঙ্খভাবে বোঝা ভাল :) আচ্ছা, চলুন শুরু করা যাক।

জাভা লগিং কি?

লগিং হল একটি প্রোগ্রামের অপারেশন সম্পর্কে ডেটা রেকর্ড করার কাজ। আমরা এই ডেটা রেকর্ড করার জায়গাটিকে "লগ" বলা হয়। দুটি প্রশ্ন অবিলম্বে উত্থাপিত হয়: কোন ডেটা লেখা হয় এবং কোথায়? "কোথায়" দিয়ে শুরু করা যাক। আপনি বিভিন্ন জায়গায় একটি প্রোগ্রামের কাজ সম্পর্কে ডেটা লিখতে পারেন। উদাহরণস্বরূপ, আপনার পড়াশোনার সময়, আপনি প্রায়শই System.out.println()কনসোলে ডেটা আউটপুট করতে। এটি প্রকৃতপক্ষে লগিং, যদিও তার সহজতম আকারে। অবশ্যই, এটি ব্যবহারকারী বা একটি পণ্য সমর্থন দলের জন্য খুব সুবিধাজনক নয়: স্পষ্টতই, তারা একটি IDE ইনস্টল করতে এবং কনসোল নিরীক্ষণ করতে চাইবে না :) তথ্য রেকর্ড করার জন্য একটি আরো প্রথাগত বিন্যাস আছে: পাঠ্য ফাইল। মানুষ এই বিন্যাসে ডেটা পড়তে অনেক বেশি স্বাচ্ছন্দ্যবোধ করে এবং অবশ্যই এটি ডেটা সংরক্ষণের জন্য অনেক বেশি সুবিধাজনক! এখন দ্বিতীয় প্রশ্ন: কোন প্রোগ্রাম ডেটা লগ করা উচিত? এটা সম্পূর্ণ আপনার উপর নির্ভর করে! জাভা এর লগিং সিস্টেম খুবই নমনীয়। আপনি আপনার প্রোগ্রাম যা করে সব লগ লগ করতে এটি কনফিগার করতে পারেন. একদিকে, এটি ভাল। কিন্তু অন্যদিকে, কল্পনা করুন যে ফেসবুক বা টুইটারের লগগুলি কত বড় হবে যদি তারা সেগুলিতে সবকিছু লিখে থাকে। এই বৃহৎ কোম্পানির সম্ভবত এত ডেটা সঞ্চয় করার ক্ষমতা আছে। কিন্তু কল্পনা করুন যে 500 গিগাবাইট টেক্সট লগগুলিতে একটি গুরুতর ত্রুটি সম্পর্কে তথ্য খুঁজে পাওয়া কতটা কঠিন হবে? এটি একটি খড়ের গাদায় একটি সুই খুঁজছেন চেয়ে খারাপ হবে. তদনুসারে, জাভা শুধুমাত্র ত্রুটি ডেটা লগ করার জন্য কনফিগার করা যেতে পারে। অথবা এমনকি শুধুমাত্র সমালোচনামূলক ত্রুটি! এটি বলেছে, জাভার নেটিভ লগিং সিস্টেমের কথা বলা সম্পূর্ণরূপে সঠিক নয়। আসল বিষয়টি হল যে প্রোগ্রামারদের ভাষাতে এই কার্যকারিতা যোগ করার আগে লগিং করা দরকার ছিল। জাভা তার নিজস্ব লগিং লাইব্রেরি চালু করার সময়, সবাই ইতিমধ্যে log4j লাইব্রেরি ব্যবহার করছিল। জাভা লগিং এর ইতিহাস আসলে অনেক দীর্ঘ এবং তথ্যপূর্ণ। সংক্ষেপে, জাভার নিজস্ব লগিং লাইব্রেরি আছে, কিন্তু প্রায় কেউই এটি ব্যবহার করে না :) পরে, যখন বিভিন্ন লগিং লাইব্রেরি উপস্থিত হয় এবং প্রোগ্রামারদের দ্বারা ব্যবহার করা শুরু হয়, তখন সামঞ্জস্যের সমস্যা দেখা দেয়। বিভিন্ন ইন্টারফেস সহ এক ডজন বিভিন্ন লাইব্রেরিতে চাকাটিকে নতুন করে উদ্ভাবন করা থেকে মানুষকে থামাতে, বিমূর্ত SLF4J ফ্রেমওয়ার্ক ("জাভার জন্য পরিষেবা লগিং ফ্যাকেড") তৈরি করা হয়েছিল। একে বিমূর্ত বলা হয়, কারণ আপনি SLF4J ক্লাসের পদ্ধতিগুলি ব্যবহার ও কল করলেও, তারা আসলে আগে আসা সমস্ত লগিং ফ্রেমওয়ার্ক ব্যবহার করে: log4j, স্ট্যান্ডার্ড java.util.logging এবং অন্যান্য। যদি কোনো সময়ে আপনার Log4j-এর কিছু নির্দিষ্ট বৈশিষ্ট্যের প্রয়োজন হয় যা অন্য লাইব্রেরিতে না থাকে, কিন্তু আপনি সরাসরি এই লাইব্রেরির সাথে আপনার প্রোজেক্ট লিঙ্ক করতে চান না, শুধু SLF4J ব্যবহার করুন। এবং তারপর এটি Log4j পদ্ধতি কল করা যাক. আপনি যদি আপনার মন পরিবর্তন করেন এবং সিদ্ধান্ত নেন যে আপনার আর Log4j বৈশিষ্ট্যের প্রয়োজন নেই, তাহলে আপনাকে শুধুমাত্র "কে পুনরায় কনফিগার করতে হবে"এখানে , এবং Log4j লাইব্রেরি এখানে । এরপরে, আর্কাইভটি আনপ্যাক করুন এবং ক্লাসপাথে JAR ফাইল যোগ করতে IntelliJ IDEA ব্যবহার করুন। মেনু আইটেম: ফাইল -> প্রকল্প কাঠামো -> লাইব্রেরিগুলি প্রয়োজনীয় JAR ফাইলগুলি নির্বাচন করুন এবং সেগুলিকে প্রকল্পে যুক্ত করুন (আমরা যে সংরক্ষণাগারগুলি ডাউনলোড করেছি তাতে অনেকগুলি JAR ফাইল রয়েছে — আপনার প্রয়োজনগুলি দেখতে ছবিগুলি দেখুন) নোট করুন যে এই নির্দেশটি সেই শিক্ষার্থীদের কেন আমাদের লগিং দরকার - 2কেন আমাদের লগিং দরকার - 3জন্য যারা ম্যাভেন ব্যবহার করতে জানেন না। আপনি যদি ম্যাভেন ব্যবহার করতে জানেন তবে সেখানে শুরু করার চেষ্টা করা সাধারণত ভাল (অনেক সহজ)। আপনি যদি Maven ব্যবহার করেন , তাহলে এই নির্ভরতা যোগ করুন:

    	<dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-slf4j-impl</artifactId>
            <version>2.14.0</version>
    	</dependency>
দারুণ! আমরা সেটিংস বের করেছি :) চলুন দেখি কিভাবে SLF4J কাজ করে। আমরা কিভাবে নিশ্চিত করব যে প্রোগ্রামের কাজ কোথাও রেকর্ড করা আছে? এটি করার জন্য, আমাদের দুটি জিনিস প্রয়োজন: লগার এবং অ্যাপেন্ডার। প্রথম দিয়ে শুরু করা যাক। একটি লগার হল একটি বস্তু যা লগিং এর সম্পূর্ণ নিয়ন্ত্রণ প্রদান করে। একটি লগার তৈরি করা খুবই সহজ: আমরা স্ট্যাটিক 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() করেছে! কনসোলে, আমরা বর্তমান তারিখ দেখি, যে পদ্ধতিতে ত্রুটি ঘটেছে ( প্রধান), শব্দ "ত্রুটি", এবং আমাদের বার্তা! ERROR হল লগিং লেভেল। সাধারণভাবে, যদি একটি লগ এন্ট্রি "ERROR" শব্দ দিয়ে চিহ্নিত করা হয়, তাহলে প্রোগ্রামের এই সময়ে একটি ত্রুটি ঘটেছে। যদি এন্ট্রিটি "INFO" শব্দ দিয়ে চিহ্নিত করা হয়, তাহলে বার্তাটি কেবল প্রোগ্রামের স্বাভাবিক ক্রিয়াকলাপের বর্তমান তথ্য উপস্থাপন করে। SLF4J লাইব্রেরিতে অনেকগুলি বিভিন্ন লগিং স্তর রয়েছে যা আপনাকে নমনীয়ভাবে লগিং কনফিগার করতে দেয়। এটি পরিচালনা করা খুব সহজ: সমস্ত প্রয়োজনীয় যুক্তি ইতিমধ্যে জাভা লগার ক্লাসে রয়েছে। আপনি শুধু প্রাসঙ্গিক পদ্ধতি কল করতে হবে. আপনি যদি একটি রুটিন বার্তা লগ করতে চান, logger.info() পদ্ধতিতে কল করুন। একটি ত্রুটি বার্তার জন্য, logger.error() ব্যবহার করুন । একটি সতর্কতার জন্য, logger.warn() ব্যবহার করুন

এখন অ্যাপেন্ডার সম্পর্কে কথা বলা যাক

একটি অ্যাপেন্ডার হল সেই জায়গা যেখানে আপনার ডেটা যায়। একটি উপায়ে, একটি ডেটা উৎসের বিপরীত, অর্থাৎ "বিন্দু বি"। ডিফল্টরূপে, ডেটা কনসোলে আউটপুট হয়। মনে রাখবেন যে পূর্ববর্তী উদাহরণে আমাদের কিছু কনফিগার করতে হবে না: পাঠ্যটি কনসোলে উপস্থিত হয়েছে এবং Log4j লাইব্রেরির লগার শুধুমাত্র কনসোলে ত্রুটি-স্তরের বার্তাগুলি আউটপুট করতে পারে৷ স্পষ্টতই, টেক্সট ফাইলে লগ পড়া এবং লেখার জন্য এটি আরও সুবিধাজনক। লগারের ডিফল্ট আচরণ পরিবর্তন করতে, আমাদের ফাইল অ্যাপেন্ডার কনফিগার করতে হবে। শুরু করার জন্য, আপনাকে সরাসরি src ফোল্ডারে একটি log4j.xml ফাইল তৈরি করতে হবে। আপনি ইতিমধ্যেই 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-এর অভ্যন্তরীণ কাজ সম্পর্কে সমস্ত তথ্য কনসোলে প্রদর্শিত হবে (আমাদের অ্যাপেন্ডার একটি ফাইল হলেও স্ট্যাটাসলগার কনসোলে ডেটা প্রদর্শন করে)। আমাদের এখন এটির প্রয়োজন নেই, তাই এটিকে যেমন আছে তেমনই ছেড়ে দেওয়া যাক।

<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>
এখানে আমরা আমাদের অ্যাপেন্ডার তৈরি করি। <File> ট্যাগ নির্দেশ করে যে এটি একটি ফাইল অ্যাপেন্ডার হবে name="MyFileAppender" অ্যাপেন্ডারের নাম সেট করে। fileName="C:\Users\Username\Desktop\testlog.txt" লগ ফাইলের পথ নির্দেশ করে যেখানে সমস্ত ডেটা লেখা হবে। append="true" ফাইলের শেষে ডেটা লেখা উচিত কিনা তা নির্দেশ করে। আমাদের ক্ষেত্রে, এই অবিকল আমরা কি করব. যদি আপনি মানটিকে মিথ্যাতে সেট করেন, তাহলে প্রতিবার প্রোগ্রাম শুরু করার সময় লগ ফাইলের পুরানো বিষয়বস্তু মুছে ফেলা হবে। <PatternLayout pattern="%d{yyy-MM-dd HH:mm:ss.SSS} [%t] %-5লেভেল %লগার{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' অ্যাট্রিবিউট যোগ করতে হবে। যদি আপনি ভুলে যান, এখানে আমরা অ্যাপেন্ডারের নাম সেট করি: <. এবং এখানে আমাদের কোড!

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 ধরা একটি সন্দেহজনক ধারণা), কিন্তু এটি আমাদের উদ্দেশ্যে নিখুঁত :) আসুন আমাদের main() পদ্ধতিটি পরপর 4 বার চালাই এবং আমাদের testlog.txt ফাইলটি দেখুন। আপনাকে এটি আগে থেকে তৈরি করতে হবে না: লাইব্রেরি স্বয়ংক্রিয়ভাবে এটি করবে। সব কাজ! :) এখন আপনার একটি কনফিগার করা লগার আছে। আপনি প্রতিটি পদ্ধতিতে লগার কল যোগ করে আপনার পুরানো কিছু প্রোগ্রামের সাথে খেলতে পারেন। তারপর ফলাফল লগ তাকান :) এটি গভীরতা লগিং বিষয় বিবেচনা করে. এক বসে সব পড়া চ্যালেঞ্জিং হবে। এটি বলেছে, এতে প্রচুর অতিরিক্ত দরকারী তথ্য রয়েছে। উদাহরণস্বরূপ, আপনি কীভাবে লগার কনফিগার করবেন তা শিখবেন যাতে এটি একটি নতুন টেক্সট ফাইল তৈরি করে যদি আমাদের testlog.txt ফাইল একটি নির্দিষ্ট আকারে পৌঁছায় :) এবং এটি আমাদের ক্লাস শেষ করে! আজ আপনি একটি খুব গুরুত্বপূর্ণ বিষয়ের সাথে পরিচিত হয়েছেন এবং এই জ্ঞানটি আপনার ভবিষ্যতের কাজে অবশ্যই আপনার জন্য সহায়ক হবে। পরের বার পর্যন্ত! :)
মন্তব্য
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION