1.1 লগের ভূমিকা

লগ হল ঘটনাগুলির একটি তালিকা যা ঘটেছে৷ প্রায় নটিক্যাল জার্নাল বা ডায়েরির মতো। ঠিক আছে, সেই অনুযায়ী, একটি লগার একটি বস্তু যা দিয়ে আপনি লগ করতে পারেন। প্রোগ্রামিংয়ে, প্রায় সবকিছুই লগ করার প্রথা। এবং জাভাতে, সবকিছুই এমন এবং আরও কিছুটা বেশি।

লগার জাভা

আসল বিষয়টি হ'ল জাভা প্রোগ্রামগুলি প্রায়শই একটি UI, কনসোল এবং আরও কিছু ছাড়াই বড় সার্ভার অ্যাপ্লিকেশন। তারা একই সময়ে হাজার হাজার ব্যবহারকারীর অনুরোধ প্রক্রিয়া করে এবং প্রায়শই বিভিন্ন ত্রুটি ঘটে। বিশেষ করে যখন বিভিন্ন থ্রেড একে অপরের সাথে হস্তক্ষেপ করতে শুরু করে।

এবং, প্রকৃতপক্ষে, এই ধরনের পরিস্থিতিতে খুব কমই পুনরুত্পাদিত ত্রুটি এবং ব্যর্থতাগুলি খুঁজে পাওয়ার একমাত্র উপায় হল প্রতিটি থ্রেডে ঘটে যাওয়া সমস্ত কিছু লগ / ফাইলে লেখা ।

প্রায়শই, লগটিতে যে পদ্ধতিটি কল করা হয়েছিল তার পরামিতিগুলি, সমস্ত বাধাপ্রাপ্ত ত্রুটি এবং প্রচুর মধ্যবর্তী তথ্য সম্পর্কে তথ্য লেখা হয়। লগটি যত বেশি সম্পূর্ণ হবে, ইভেন্টের ক্রম পুনরুদ্ধার করা এবং ব্যর্থতা বা ত্রুটির কারণগুলি চিহ্নিত করা তত সহজ।

কিন্তু লগটি যত বড়, এটির সাথে কাজ করা তত কঠিন। কখনও কখনও লগগুলি প্রতিদিন কয়েক গিগাবাইটে পৌঁছায়। এই জরিমানা.

1.2 ব্যর্থ লগ

প্রথম লগ হিসাবে, বিকাশকারীরা কেবল কনসোলে আউটপুট ব্যবহার করে । অ্যাপ্লিকেশন ডিবাগিংয়ের সময় এটি করা সুবিধাজনক - যখন সমস্ত গুরুত্বপূর্ণ তথ্য এবং পরিবর্তনশীল মানগুলি কনসোলে লেখা হয়। কিন্তু অ্যাপ্লিকেশনের স্বাভাবিক ক্রিয়াকলাপের সময় এই ধরনের একটি লগ সম্পূর্ণরূপে অনুপযুক্ত।

প্রথমত, অ্যাপ্লিকেশনটি নিজেই কনসোলে কিছু আউটপুট করতে চাইতে পারে এবং ব্যবহারকারী প্রোগ্রামারের উদ্দেশ্যে পরিষেবার তথ্য দেখতে চায় না।

দ্বিতীয়ত, কনসোল বাফারের আকার সীমিত, আপনি সেখানে অনেক কিছু লিখতে পারবেন না।

এবং পরিশেষে, তৃতীয়ত, প্রোগ্রামের ত্রুটি সম্পর্কে তথ্য যা দীর্ঘ সময় ধরে সংগ্রহ করা হয় প্রোগ্রাম ডেভেলপারদের কাছে পাঠানো উচিত। এবং এই সমস্ত তথ্য একবারে একটি ফাইলে লেখা সবচেয়ে সুবিধাজনক।

বিকাশকারীরা দ্রুত প্রথম সমস্যাটি সমাধান করেছে - তারা আরেকটি আউটপুট স্ট্রীম নিয়ে এসেছে - System.err। আপনি এটিতে বার্তা লিখতে পারেন এবং সেগুলি একটি পৃথক থ্রেডে পাঠানো হবে, স্ট্যান্ডার্ড কনসোলে নয়।

এমনকি একটি ফাইলে লেখার সমস্যাটিও সমাধান করা হয়েছিল:

// Define the file to which we will write the log
System.setErr(new PrintStream(new File("log.txt")));
// Display messages
System.err.println("Message 1");
System.err.println("Message 2");
// Display an error message
try {
    throw new Exception("Error message");
} catch (Exception e) {
    e.printStackTrace();
}

কিন্তু এই ফর্মটিতেও, এটি পুরো সমস্যার সমাধান করেনি, তাই একটি বিশেষ লাইব্রেরি তৈরি করার সিদ্ধান্ত নেওয়া হয়েছিল যা একটি ফাইলে লগ বার্তা লিখবে। তিনি এটি একটি স্মার্ট উপায়ে করেছেন এবং লগড ইভেন্ট এবং ডেটার জন্য ফিল্টার কনফিগার করার নমনীয়তাকে অনুমতি দিয়েছেন৷

পুরো লগিং প্রক্রিয়াটি আসলে তিনটি অংশ নিয়ে গঠিত:

  • প্রথম অংশটি তথ্য সংগ্রহ
  • দ্বিতীয় অংশ হল সংগৃহীত তথ্য ফিল্টারিং ।
  • তৃতীয় অংশটি নির্বাচিত তথ্যের রেকর্ডিং ।

1.3 log4j লগারের পরিচিতি

জাভা সম্প্রদায়ের প্রথম জনপ্রিয় লগার ছিল log4j। প্রকল্পে এটি অন্তর্ভুক্ত করা খুবই সহজ, এর জন্য আপনাকে আপনার pom.xml এ মাত্র কয়েকটি লাইন যোগ করতে হবে


<dependency>
    <groupId>log4j</groupId>
    <artifactId>log4j</artifactId>
    <version>2.2.17</version>
</dependency>

এই ধরনের লগারের সাথে আপনার প্রোগ্রামের মিথস্ক্রিয়া এইরকম কিছু দেখাবে:

class Manager {
   private static final Logger logger = LoggerFactory.getLogger(Manager.class);

   public boolean processTask(Task task) {
        logger.debug("processTask id = " + task.getId());
        try {
            task.start();
            task.progress();
            task.complete();
            return true;
        } catch (Exception e) {
            logger.error("Unknown error", e);
            return false;
        }
    }
}

এখানে তিনটি জিনিস ঘটে:

বস্তুর সৃষ্টি সবুজ রঙে হাইলাইট করা হয় Logger । এর অবজেক্টটি এটির সাথে সুবিধাজনক আরও কাজ করার জন্য একটি স্ট্যাটিক ভেরিয়েবলে সংরক্ষণ করা হয়। এবং এছাড়াও getLogger()যে ক্লাসে তথ্য সংগ্রহ করা হয় তার তথ্য পদ্ধতিতে পাস করা হয়।

নীল রঙে হাইলাইট করা লাইনটি হল যেখানে আমরা শুধুমাত্র ডিবাগিংয়ের সময় মানের তথ্য লগ করি । এই জন্য, একটি বিশেষ পদ্ধতি ব্যবহার করা হয় -debug()

এবং সবশেষে , যে লাইনে আমরা লগে উদ্ভূত ব্যতিক্রমটি সংরক্ষণ করি সেটি লাল রঙে হাইলাইট করা হয়েছে । ব্যতিক্রমগুলি সম্ভাব্য ত্রুটি, তাই error().