MDC (Mapped Diagnostic Context) কি?
MDC (Mapped Diagnostic Context) একটি স্পেসিফিক কনসেপ্ট যা লগিংয়ের সময় একটি নির্দিষ্ট কনটেক্সটের সাথে অতিরিক্ত ডায়াগনস্টিক ইনফরমেশন (যেমন, ইউজার আইডি, থ্রেড আইডি, টার্মিনাল বা ক্লায়েন্ট ইন্ডিকেটর ইত্যাদি) যুক্ত করতে ব্যবহৃত হয়। SLF4J-তে MDC একটি ম্যাপিং কনটেক্সট হিসেবে কাজ করে, যেখানে কিজ-ভ্যালু পেয়ার হিসেবে ডেটা সেট করা হয় এবং তা সমস্ত লগিং স্টেটমেন্টে অ্যাক্সেসযোগ্য হয়।
MDC আপনাকে প্রতিটি লগ মেসেজের সাথে প্রাসঙ্গিক অতিরিক্ত তথ্য যুক্ত করার সুযোগ দেয়, যা ডিবাগিং বা মনিটরিংয়ের সময় খুবই উপকারী হতে পারে। যেমন, ইউজারের লগইন তথ্য, সার্ভিসের নাম, ট্রানজেকশন আইডি, এবং অন্যান্য কনটেক্সটের ভ্যালু লগে অন্তর্ভুক্ত করা যায়।
SLF4J MDC এর মাধ্যমে লগ মেসেজের সাথে কনটেক্সট ইনফরমেশন অন্তর্ভুক্ত করা যেতে পারে, যা লগিং এ রিচ কনটেক্সট প্রদান করে।
SLF4J MDC ব্যবহার করার পদ্ধতি:
MDC ব্যবহার করতে হলে প্রথমে আপনার কোডে MDC এর মান সেট করতে হবে এবং পরে সেই মানটি লগ মেসেজে অ্যাক্সেস করতে হবে। সাধারণত MDC স্ট্যাটিকভাবে ইনজেক্ট করা হয় এবং লগ মেসেজের সঙ্গে অটোমেটিকভাবে অন্তর্ভুক্ত করা হয়।
MDC ব্যবহার করে Contextual Information লগ করার উদাহরণ:
1. Maven Dependencies (pom.xml)
SLF4J এবং Logback এর ডিপেনডেন্সি সেট করা:
<dependencies>
<!-- SLF4J API -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.30</version>
</dependency>
<!-- Logback Classic for Logging -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
</dependencies>
2. SLF4J MDC Example with Contextual Information
MDC এর মাধ্যমে কনটেক্সচুয়াল ইনফরমেশন লোগ করা:
import org.slf4j.MDC;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class UserService {
private static final Logger logger = LoggerFactory.getLogger(UserService.class);
public void processUser(String userId) {
// Set MDC context for the current thread
MDC.put("userId", userId);
MDC.put("transactionId", "TX123456");
// Log message with MDC contextual information
logger.info("Processing user");
try {
// Simulate user processing logic
// You can log more contextual information at different steps
logger.debug("User details: " + userId);
// Simulating an operation
if (userId == null) {
throw new IllegalArgumentException("User ID cannot be null");
}
} catch (Exception e) {
logger.error("Error processing user", e);
} finally {
// Always clear the MDC after processing
MDC.clear();
}
}
}
এখানে:
- MDC.put("key", "value") ব্যবহার করে আমরা userId এবং transactionId নামক কনটেক্সচুয়াল ইনফরমেশন সেট করেছি।
logger.info()এবংlogger.debug()মেসেজে MDC থেকে কনটেক্সচুয়াল তথ্য ব্যবহার করা হচ্ছে।- MDC.clear() ব্যবহার করে কনটেক্সচুয়াল ডেটা ক্লিয়ার করা হচ্ছে যাতে পরবর্তী থ্রেডে প্রভাব না ফেলে।
3. Logback Configuration (logback.xml)
logback.xml ফাইলে MDC কনটেক্সচুয়াল ডেটার সাথে লগ আউটপুট কনফিগার করা যেতে পারে। এখানে, আমরা লগ আউটপুটে userId এবং transactionId কনটেক্সচুয়াল ইনফরমেশন অন্তর্ভুক্ত করব।
<configuration>
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg MDC{userId} - MDC{transactionId} %n</pattern>
</encoder>
</appender>
<root level="debug">
<appender-ref ref="STDOUT"/>
</root>
</configuration>
এখানে:
- %MDC{userId} এবং %MDC{transactionId} ট্যাগ ব্যবহার করে MDC থেকে কনটেক্সচুয়াল ইনফরমেশন লগ আউটপুটে অন্তর্ভুক্ত করা হয়েছে।
- লগ আউটপুটে userId এবং transactionId কনটেক্সচুয়াল ভ্যালু প্রিন্ট হবে।
4. Output Example
এখন, যদি আমরা UserService.processUser("John123") মেথডটি কল করি, লগ আউটপুট এরকম হতে পারে:
12:34:56.789 [main] INFO c.e.UserService - Processing user MDC{userId=John123} - MDC{transactionId=TX123456}
12:34:56.790 [main] DEBUG c.e.UserService - User details: John123 MDC{userId=John123} - MDC{transactionId=TX123456}
12:34:56.791 [main] ERROR c.e.UserService - Error processing user
java.lang.IllegalArgumentException: User ID cannot be null
at c.e.UserService.processUser(UserService.java:22)
এখানে:
- MDC কনটেক্সচুয়াল ইনফরমেশন (যেমন
userIdএবংtransactionId) প্রতিটি লগ মেসেজে সংযুক্ত করা হয়েছে।
MDC এর সুবিধা:
- Contextual Logging: বিভিন্ন ট্রানজেকশন, ইউজার, এবং প্রক্রিয়া সম্পর্কিত লগ মেসেজের সাথে প্রাসঙ্গিক কনটেক্সচুয়াল ডেটা যুক্ত করা সম্ভব হয়।
- Enhanced Debugging: ডিবাগিংয়ের সময় প্রতিটি লগ মেসেজের সাথে নির্দিষ্ট কনটেক্সচুয়াল ইনফরমেশন থাকা আপনাকে সমস্যার মূল কারণ চিহ্নিত করতে সাহায্য করবে।
- Multiple Threads: MDC থ্রেড-বাই-থ্রেড কনটেক্সচুয়াল ডেটা সংরক্ষণ করতে সক্ষম, যা মাল্টি-থ্রেডেড অ্যাপ্লিকেশনগুলিতে খুবই উপকারী।
- Simplified Log Filtering: কনটেক্সচুয়াল ডেটা দ্বারা লগগুলি সহজে ফিল্টার করা যায়, যেমন ইউজারের ভিত্তিতে লগ ফিল্টারিং করা।
সারাংশ
SLF4J এর MDC (Mapped Diagnostic Context) একটি শক্তিশালী টুল যা লগ মেসেজের সাথে কনটেক্সচুয়াল ইনফরমেশন যুক্ত করতে ব্যবহৃত হয়। এটি বিশেষত মাল্টি-থ্রেডেড অ্যাপ্লিকেশনগুলিতে এবং রিয়েল-টাইম লোগিংয়ের ক্ষেত্রে উপকারী, যেখানে প্রতিটি থ্রেড বা ব্যবহারকারীর জন্য আলাদা কনটেক্সচুয়াল ডেটা প্রয়োজন হয়। SLF4J MDC ব্যবহার করে আপনি লগিংয়ে নির্দিষ্ট কনটেক্সচুয়াল তথ্য যুক্ত করতে পারেন এবং এটি ডিবাগিং এবং মনিটরিংকে অনেক সহজ করে তোলে।