MDC (Mapped Diagnostic Context) হল SLF4J এবং Logback এর একটি গুরুত্বপূর্ণ বৈশিষ্ট্য, যা লগিংয়ের সময় কনটেক্সট সম্পর্কিত ডেটা সন্নিবেশ করতে ব্যবহৃত হয়। এটি লগ মেসেজে অতিরিক্ত কনটেক্সট বা মেটাডেটা যোগ করতে সহায়ক, যেমন যেকোনো অ্যাপ্লিকেশনের মধ্যে ক্রিয়াকলাপ সম্পর্কিত নির্দিষ্ট ডেটা (যেমন, ইউজার আইডি, থ্রেড আইডি, ট্রান্সঅ্যাকশন আইডি, ইত্যাদি)। MDC-এর মাধ্যমে, আপনি লগ মেসেজের সাথে নির্দিষ্ট কনটেক্সট সংযুক্ত করতে পারেন, যা পরে ট্রাবলশুটিং এবং ডিবাগিংয়ের সময় খুবই কার্যকরী হতে পারে।
1. MDC (Mapped Diagnostic Context) এর ধারণা
MDC হল একটি থ্রেড-লোকাল স্টোরেজ মেকানিজম যা লগ মেসেজের সাথে অতিরিক্ত তথ্য (যেমন যেকোনো আইডেন্টিফায়ার বা অন্যান্য ডেটা) যোগ করার জন্য ব্যবহৃত হয়। যখন আপনার অ্যাপ্লিকেশন একাধিক থ্রেডে চলতে থাকে, তখন বিভিন্ন থ্রেডের জন্য আলাদা আলাদা কনটেক্সট তথ্য সংরক্ষণ করা যায়, যার মাধ্যমে আপনি নির্দিষ্ট থ্রেডের কার্যক্রম ট্র্যাক করতে পারেন। এটি বিশেষত multithreaded বা concurrent applications এর জন্য খুবই গুরুত্বপূর্ণ।
MDC প্রধানত লগিংয়ের সময় key-value pairs আকারে ডেটা স্টোর করে, যা পরে লগ মেসেজের সাথে অন্তর্ভুক্ত হয়।
উদাহরণ: MDC কাজ করছে কিভাবে
MDC কে ব্যবহার করে, আপনি লগের সাথে অতিরিক্ত কনটেক্সট যোগ করতে পারেন, যেমন ট্রান্সঅ্যাকশন আইডি, ইউজার আইডি, এবং অন্যান্য প্রয়োজনীয় তথ্য। এটি বিশেষভাবে গুরুত্বপূর্ণ যখন আপনি লগ মেসেজের মাধ্যমে একটি নির্দিষ্ট ব্যবহারকারী বা নির্দিষ্ট থ্রেডের কার্যক্রম ট্র্যাক করতে চান।
2. MDC এর ব্যবহার
2.1 MDC এর সাথে লগিং
SLF4J এবং Logback এর মাধ্যমে MDC এর ব্যবহার খুবই সহজ। আপনি MDC এর মধ্যে ডেটা সন্নিবেশ করতে পারেন এবং সেই তথ্য লগ মেসেজে অন্তর্ভুক্ত করতে পারেন।
2.1.1 MDC সেট করা
SLF4J এর MDC ব্যবহার করতে, প্রথমে MDC.put() ব্যবহার করে কনটেক্সট ডেটা সেট করতে হবে।
import org.slf4j.MDC;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class MyApp {
private static final Logger logger = LoggerFactory.getLogger(MyApp.class);
public static void main(String[] args) {
// Set MDC data
MDC.put("userID", "12345");
MDC.put("transactionID", "txn_98765");
// Log messages with MDC context
logger.info("This is an info log with MDC context.");
// Remove MDC data after use to avoid memory leaks
MDC.clear();
}
}
এখানে:
- MDC.put("key", "value"): এটি MDC-তে কনটেক্সট ডেটা যোগ করে। এখানে,
"userID"এবং"transactionID"কনটেক্সট ডেটার কীগুলি। - MDC.clear(): এটি ব্যবহৃত কনটেক্সট তথ্য মুছে ফেলে। এটি thread-local স্টোরেজের জন্য গুরুত্বপূর্ণ, যাতে থ্রেড-লোকাল স্টোরেজ ক্লিন থাকে এবং মেমরি লিকস না হয়।
2.1.2 MDC কনফিগারেশন এবং লগিং আউটপুট
যখন আপনি MDC কনটেক্সট ডেটা সেট করবেন, তখন আপনার লগ আউটপুটে সেই কনটেক্সট ডেটা অন্তর্ভুক্ত হবে। আপনি Logback কনফিগারেশন ফাইল logback.xml ব্যবহার করে MDC কনটেক্সট ডেটা লগ আউটপুটে অন্তর্ভুক্ত করতে পারেন।
<configuration>
<appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{yyyy-MM-dd HH:mm:ss} - %msg - userID=%X{userID}, transactionID=%X{transactionID} %n</pattern>
</encoder>
</appender>
<root level="info">
<appender-ref ref="CONSOLE"/>
</root>
</configuration>
এখানে:
%X{key}হল MDC কনটেক্সট ডেটার জন্য প্যাটার্ন, যেখানেkeyহল MDC-এ সংরক্ষিত কনটেক্সট তথ্য।
2.2 MDC এবং Multi-threaded Applications
MDC থ্রেড-লোকাল ডেটা সংরক্ষণ করে, যার মানে হল যে প্রতিটি থ্রেড তার নিজস্ব MDC কনটেক্সট রাখবে। এটি আপনাকে সহজে একটি নির্দিষ্ট থ্রেডের লগ ট্র্যাক করতে সাহায্য করে।
উদাহরণ: Multi-threaded Application
import org.slf4j.MDC;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class MultiThreadExample {
private static final Logger logger = LoggerFactory.getLogger(MultiThreadExample.class);
public static void main(String[] args) {
Runnable task = () -> {
// Set MDC for this thread
MDC.put("userID", "thread-" + Thread.currentThread().getId());
logger.info("This is a log for thread {}", Thread.currentThread().getId());
MDC.clear();
};
// Create multiple threads
Thread thread1 = new Thread(task);
Thread thread2 = new Thread(task);
thread1.start();
thread2.start();
}
}
এখানে, প্রতিটি থ্রেড তার নিজস্ব MDC কনটেক্সট তথ্য রাখে। যখন লগ আউটপুট হয়, তখন প্রতিটি থ্রেডের জন্য আলাদা আলাদা userID এবং transactionID থাকবে।
3. MDC কেন প্রয়োজন?
MDC ব্যবহারের কিছু মূল কারণ:
3.1 রিয়েল-টাইম ট্র্যাকিং
MDC এর মাধ্যমে, আপনি প্রতিটি লগ মেসেজের সাথে কনটেক্সট সম্পর্কিত তথ্য যোগ করতে পারেন, যেমন ইউজার আইডি, ট্রান্সঅ্যাকশন আইডি, অথবা থ্রেড আইডি। এটি আপনাকে রিয়েল-টাইম ট্র্যাকিং করতে সাহায্য করে, বিশেষ করে ডিস্ট্রিবিউটেড সিস্টেমে যেখানে একাধিক ইউজার এবং থ্রেড একসাথে কাজ করে।
3.2 টেবিল-ভিত্তিক তথ্য সংরক্ষণ
MDC আপনাকে একটি key-value pair আকারে কনটেক্সট ডেটা সংরক্ষণ করতে দেয়। এর মাধ্যমে আপনি একই লগ ফাইলের মধ্যে বিভিন্ন ডেটা এবং কনটেক্সট তথ্য সহজে ম্যানেজ করতে পারবেন।
3.3 ডিবাগিং ও ট্রাবলশুটিং এ সহায়তা
MDC লগিংয়ের মাধ্যমে ডিবাগিং এবং ট্রাবলশুটিং অনেক সহজ হয়ে ওঠে, কারণ আপনি সহজেই লগের মধ্যে সুনির্দিষ্ট কনটেক্সট তথ্য দেখতে পারবেন, যেমন কোন ইউজার বা কোন থ্রেড সমস্যার সৃষ্টি করেছে।
3.4 মেমরি এবং পারফরম্যান্স অপটিমাইজেশন
MDC শুধুমাত্র একটি নির্দিষ্ট থ্রেডের জন্য কনটেক্সট ডেটা সংরক্ষণ করে, এর ফলে আপনার অ্যাপ্লিকেশনের পারফরম্যান্স এবং মেমরি ব্যবস্থাপনা উন্নত হয়। যেহেতু MDC থ্রেড-লোকাল স্টোরেজ ব্যবহার করে, এটি থ্রেডের বাইরে অন্য কোন থ্রেডের সাথে কনফ্লিক্ট করবে না।
সারাংশ
MDC (Mapped Diagnostic Context) SLF4J এবং Logback এর একটি গুরুত্বপূর্ণ বৈশিষ্ট্য, যা লগ মেসেজের সাথে অতিরিক্ত কনটেক্সট তথ্য যোগ করার জন্য ব্যবহৃত হয়। এটি বিশেষভাবে রিয়েল-টাইম ট্র্যাকিং, ডিবাগিং, এবং ট্রাবলশুটিং প্রক্রিয়ায় সহায়তা করে। MDC থ্রেড-লোকাল স্টোরেজ ব্যবহার করে, যা প্রতিটি থ্রেডের জন্য আলাদা কনটেক্সট তথ্য সংরক্ষণ করে, এবং লগিংয়ের সময় সেই তথ্য সহজে ট্র্যাক করা যায়। MDC এর মাধ্যমে লগ মেসেজে প্রয়োজনীয় কনটেক্সট সংযুক্ত করার ফলে অ্যাপ্লিকেশন ডেভেলপমেন্ট এবং মেইন্টেন্যান্স অনেক সহজ হয়ে ওঠে।