I found a complete solution that I want to share with you.
I have previously tried each of these on their own, but you have to combine some of the techniques mentioned in other answers.
- You need to write your own LogDelegate:
import org.hornetq.spi.core.logging.LogDelegate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class Slf4jLogDelegate implements LogDelegate {
private final Logger logger;
public Slf4jLogDelegate(Class clazz) {
logger = LoggerFactory.getLogger(clazz);
}
@Override
public void debug(Object message) {
logger.debug(message.toString());
}
@Override
public void debug(Object message, Throwable t) {
logger.debug(message.toString(), t);
}
@Override
public void error(Object message) {
logger.error(message.toString());
}
@Override
public void error(Object message, Throwable t) {
logger.error(message.toString(), t);
}
@Override
public void fatal(Object message) {
logger.error(message.toString());
}
@Override
public void fatal(Object message, Throwable t) {
logger.error(message.toString(), t);
}
@Override
public void info(Object message) {
logger.info(message.toString());
}
@Override
public void info(Object message, Throwable t) {
logger.info(message.toString(), t);
}
@Override
public boolean isDebugEnabled() {
return logger.isDebugEnabled();
}
@Override
public boolean isInfoEnabled() {
return logger.isInfoEnabled();
}
@Override
public boolean isTraceEnabled() {
return logger.isTraceEnabled();
}
@Override
public void trace(Object message) {
logger.trace(message.toString());
}
@Override
public void trace(Object message, Throwable t) {
logger.trace(message.toString(), t);
}
@Override
public void warn(Object message) {
logger.warn(message.toString());
}
@Override
public void warn(Object message, Throwable t) {
logger.warn(message.toString(), t);
}
}
- Then you need to write the factory:
import org.hornetq.spi.core.logging.LogDelegate;
import org.hornetq.spi.core.logging.LogDelegateFactory;
public class Slf4jLogDelegateFactory implements LogDelegateFactory {
// Maybe caching of delegates makes sense?
@Override
public LogDelegate createDelegate(Class clazz) {
return new Slf4jLogDelegate(clazz);
}
}
- Then add to your hornetq-configuration.xml the following line:
<log-delegate-factory-class-name>yourpackage.Slf4jLogDelegateFactory</log-delegate-factory-class-name>
- Finally, add the following line before you start the embedded server:
org.hornetq.core.logging.Logger.setDelegateFactory(new Slf4jLogDelegateFactory());
I'm just wondering why they can't use proven logging mechanisms, that make it easy to exchange a logger.