public class Log4jZeroconfAgent extends Log4jAgent {
private static final Logger logger = Logger.getLogger(Log4jZeroconfAgent.class);
@Override
public String getDescription() {
return super.getDescription() + "(with Zeroconf support)";
}
@Override
public void dispose() {
disposeZeroconfAppenders(LogManager.getRootLogger());
for (Enumeration loggers = LogManager.getCurrentLoggers(); loggers.hasMoreElements();) {
disposeZeroconfAppenders((Logger) loggers.nextElement());
}
try {
shutdownMdnsDaemon();
} catch (ClassNotFoundException e) {
logger.debug("Log4J zeroconf not detected.");
} catch (Throwable e) {
logger.warn("Error while disposing log4J zeroconf loggers.");
}
}
private void shutdownMdnsDaemon() throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException {
Class<?> zeroconfClass = Class.forName("org.apache.log4j.net.Zeroconf4log4j");
Method zeroconfShutdownMethod = zeroconfClass.getMethod("zeroconfShutdownMethod");
zeroconfShutdownMethod.invoke(null);
}
private void disposeZeroconfAppenders(Logger logger) {
for (Enumeration appenders = logger.getAllAppenders(); appenders.hasMoreElements();) {
Appender appender = (Appender) appenders.nextElement();
String appenderClassname = appender.getClass().getName();
if ("org.apache.log4j.net.ZeroConfSocketHubAppender".equals(appenderClassname)) {
logger.removeAppender(appender);
appender.close();
}
}
}
}