मैं लॉग 4j में SiftingAppender की तरह कार्यक्षमता खोजने के लिए थोड़ी देर के लिए संघर्ष कर रहा था (हम कुछ निर्भरताओं के कारण लॉगबैक पर स्विच नहीं कर सका), और एक प्रोग्रामेटिक समाधान के साथ समाप्त हुआ जो एमडीसी का उपयोग करके और लॉगजर जोड़कर बहुत अच्छी तरह से काम करता है क्रम:
// this can be any thread-specific string
String processID = request.getProcessID();
Logger logger = Logger.getRootLogger();
// append a new file logger if no logger exists for this tag
if(logger.getAppender(processID) == null){
try{
String pattern = "%d{yy/MM/dd HH:mm:ss} %p %c{2}: %m%n";
String logfile = "log/"+processID+".log";
FileAppender fileAppender = new FileAppender(
new PatternLayout(pattern), logfile, true);
fileAppender.setName(processID);
// add a filter so we can ignore any logs from other threads
fileAppender.addFilter(new ProcessIDFilter(processID));
logger.addAppender(fileAppender);
}catch(Exception e){
throw new RuntimeException(e);
}
}
// tag all child threads with this process-id so we can separate out log output
MDC.put("process-id", processID);
//whatever you want to do in the thread
LOG.info("This message will only end up in "+processID+".log!");
MDC.remove("process-id");
फिल्टर बस ऊपर संलग्न एक विशिष्ट प्रक्रिया आईडी की जांच करता है:
public class RunIdFilter extends Filter {
private final String runId;
public RunIdFilter(String runId) {
this.runId = runId;
}
@Override
public int decide(LoggingEvent event) {
Object mdc = event.getMDC("run-id");
if (runId.equals(mdc)) {
return Filter.ACCEPT;
}
return Filter.DENY;
}
}
आशा है कि यह एक बिट में मदद करता है।
लेकिन लॉगबैक का उपयोग करने का मतलब यह होगा कि सभी लॉगिंग विवरणों को सही ढंग से बदला जाना चाहिए? ' –
http://slf4j.org/legacy.html – Ceki