Haywood Associates > ProfDog
ProfDog
 

Using the Scoping Appender

Simple Scoping

The following example assumes that you are using the StandardLoggingEventInterpretor.

public class WebServiceFacade {
    private Logger LOG = Logger.getLogger("Web"); // used as category
    public void invoke() {
        String method = "invoke";
        LOG.info("scoped://start:" + getCurrentUserFromThread() + "@" + method + "@id="+id);
        try {
            ...
            _dbFacade.lookupById(id);
            ...
        } finally {
            LOG.info("scoped://finish:" + getCurrentUserFromThread() + "@" + method);
        }
    }
}
public class DatabaseFacade {
    private Logger LOG = Logger.getLogger("DB"); // used as category
    public void lookupById(String id) {
        String method = "lookupById";
        LOG.info("scoped://start:" + getCurrentUserFromThread() + "@" + method + "@id="+id);
        try {
            ...
        } finally {
            LOG.info("scoped://finish:" + getCurrentUserFromThread() + "@" + method);
        }
    }
}

Scoping with Error Termination

The following example again assumes that you are using the StandardLoggingEventInterpretor. It differs in that we capture whether the scope finished as a result of an error or not.

public class WebServiceFacade {
    private Logger LOG = Logger.getLogger("Web");
    public void invoke() {
        String method = "invoke";
        LOG.info("scoped://start:" + getCurrentUserFromThread() + "@" + method + "@id="+id);
        try {
            ...
            _dbFacade.lookupById(id);
            ...
            LOG.info("scoped://finish:" + getCurrentUserFromThread() + "@" + method);
        } catch(Throwable t) {
            LOG.info("scoped://error:" + getCurrentUserFromThread() + "@" + method);
            throw t;
        }
    }
}