Logging Framework
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
}- 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
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.