
Hello Ceki, Java on Domino means, you are working with 3 types of processes Agents: Every Agent has it's on VM, It has it's own Session, it could deal with static loggers. WebServices: Every Request has it's own Thread with it's own Session, but the VM remains open until the Server shuts down Servlets: Every Request has it's own Thread with it's own Session, but the VM remains open until the Server shuts down As I said we want to log into a database. To log into a database we need a session. A session is available for a Thread. This means for WebServices and Servlets, that we need a way to find the correct DatabaseAppender for the corresponding thread with the corresponding session from static Loggers. That's why I thought about the ContextSelector. _______________________________ Martin Burchard Tel: +49 89 54493730 Fax: +49 89 54493737 Mob: +49-(0)172-8520299 Skype: nabor_gilgalad martin.burchard@pentos.com _______________________________ _______________________________ Pentos AG Landsberger Straße 6 80339 München Tel: +49 89 54493730 Fax: +49 89 54493737 www.pentos.com _______________________________ From: Ceki Gulcu <ceki@qos.ch> To: logback users list <logback-user@qos.ch> Date: 05.03.2009 15:32 Subject: Re: [logback-user] ContextSelector and getLogger Sent by: logback-user-bounces@qos.ch Hello Martin, Could you please describe your use case in your terms without assuming the use of a ContextSelector? Martin Burchard wrote:
Hello,
I currently try to get SLF4J and Logback to work on IBM Lotus Domino Server 8.5. It's working. We need to do logging an a per Thread basis because we log into a Domino database. The Java object of a Domino database is based on a session object, and that can not exist over more then one thread. Okay, I created a simple ContextSelector:
package de.pentos.domino.logging;
import java.util.Arrays; import java.util.List;
import ch.qos.logback.classic.LoggerContext;
/** * @author Martin Burchard */ public class ContextSelector implements ch.qos.logback.classic.selector.ContextSelector {
private final LoggerContext defaultContext; private static final ThreadLocal<LoggerContext> threadLocal = new ThreadLocal<LoggerContext>();
public ContextSelector(final LoggerContext context) { defaultContext = context; }
public LoggerContext detachLoggerContext(final String loggerContextName) { return getLoggerContext(); }
public List<String> getContextNames() { return Arrays.asList(getLoggerContext().getName()); }
public LoggerContext getDefaultLoggerContext() { return defaultContext; }
public LoggerContext getLoggerContext() { LoggerContext lc = threadLocal.get(); if (lc == null) { threadLocal.set(new LoggerContext()); } return threadLocal.get(); }
public LoggerContext getLoggerContext(final String name) { if (getLoggerContext().getName().equals(name)) { return getLoggerContext(); } return null; }
}
As long as all Loggers are used like this:
private Logger log = LoggerFactory.getLogger(DemoWebService.class);
everything works fine, I get my logging.
But also this is a common way to get my Logger:
private static final Logger log = LoggerFactory.getLogger(DemoWebService.class);
Because for WebServices and Servlets the VM is not terminated and these Logger Instance will live a long time without ever get refreshed. After the first run I don't see logging any more.
How can I deal with external JARs like Apache HTTP Client and other that instantiate the loggers in a static way?
Regards, Martin
-- Ceki Gülcü Logback: The reliable, generic, fast and flexible logging framework for Java. http://logback.qos.ch _______________________________________________ Logback-user mailing list Logback-user@qos.ch http://qos.ch/mailman/listinfo/logback-user