📝
Infrastructure Components

Logging Framework

Chain of Responsibility Ka Classic
💡 Logging framework EK DAFTAR KI FILE SYSTEM hai — chhoti baat clerk sambhaal leta hai, badi baat manager tak jaati hai, aur emergency seedhe director ke paas. Level decide karta hai baat kahan tak jaayegi.

Ye problem Chain of Responsibility ke liye poochi jaati hai. Log levels — DEBUG < INFO < WARN < ERROR — ek chain banate hain: har handler dekhta hai ki message uske level ka hai ya nahi, warna aage pass kar deta hai.

Do aur cheezein zaroor cover karo: APPENDERS (console, file, database — Strategy pattern) aur ASYNC LOGGING. Logging kabhi bhi application thread block nahi karni chahiye — messages ek queue mein daalo aur alag thread se likho. Aur Logger aksar Singleton hota hai.

abstract class LogHandler {
  private final LogLevel level;
  private LogHandler next;

  void handle(LogMessage msg) {
    if (msg.getLevel().ordinal() >= level.ordinal()) write(msg);
    if (next != null) next.handle(msg);
  }
  protected abstract void write(LogMessage msg);
}

interface LogAppender { void append(LogMessage m); }  // Console, File, DB

class AsyncLogger {
  private final BlockingQueue<LogMessage> queue = new LinkedBlockingQueue<>(10_000);
  // Alag thread queue se padhkar appenders ko deta hai
  // Queue full -> drop ya block, ye policy decide karni padti hai
}
📝
Logging framework EK DAFTAR KI FILE SYSTEM hai — chhoti baat clerk sambhaal leta hai, badi baat manager tak jaati hai, aur emergency seedhe director ke paas. Level decide karta hai baat kahan tak jaayegi.
1 / 2
⚡ Quick Recap
  • Log levels ka chain — Chain of Responsibility ka natural fit
  • Appenders (console/file/DB) Strategy pattern se pluggable
  • Async logging zaroori; queue-full policy explicitly decide karo
Is page mein (2 subtopics)

DEBUG development ke liye — production mein aksar band. INFO normal business events (order placed). WARN kuch galat hai par system chal raha hai (retry lag gaya). ERROR kaam fail ho gaya aur kisi ko dekhna padega.

Level ek THRESHOLD hai, filter nahi — level INFO set karne ka matlab hai INFO aur usse upar sab (WARN, ERROR) log honge. Ye common confusion hai aur interview mein clarify karna achha rehta hai.

enum LogLevel { DEBUG, INFO, WARN, ERROR }   // ordinal se comparison

boolean shouldLog(LogLevel msgLevel, LogLevel configured) {
  return msgLevel.ordinal() >= configured.ordinal();
}

Plain string log ("Order failed") search karne layak nahi hota. Structured logging mein log ek key-value object hota hai (orderId, userId, errorCode) jo JSON mein likha jaata hai — phir Elasticsearch/Splunk mein query ho sakta hai.

Har log line mein CORRELATION ID hona chahiye taaki ek request ke saare logs jodkar dekhe ja sakein. Java mein ye MDC (Mapped Diagnostic Context) se hota hai — thread-local context jo har log line mein apne aap add ho jaata hai.

💡Tip: Async logging ke saath MDC ka dhyaan rakho — thread badalne par thread-local context kho jaata hai, isliye context ko message ke saath copy karna padta hai.