package cassandra.retry;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class LoggingRetryPolicy extends RetryPolicy.Wrapper {
public static enum LogLevel {
TRACE, DEBUG, INFO, WARN, ERROR
}
private final Logger logger;
private final LogLevel level;
public LoggingRetryPolicy(RetryPolicy retryPolicy) {
this(retryPolicy, LoggingRetryPolicy.class);
}
public LoggingRetryPolicy(RetryPolicy retryPolicy, String name) {
this(retryPolicy, name, LogLevel.INFO);
}
public LoggingRetryPolicy(RetryPolicy retryPolicy, Class<?> clazz) {
this(retryPolicy, clazz, LogLevel.INFO);
}
public LoggingRetryPolicy(RetryPolicy retryPolicy, String name, LogLevel level) {
super(retryPolicy);
logger = LoggerFactory.getLogger(name);
this.level = level;
}
public LoggingRetryPolicy(RetryPolicy retryPolicy, Class<?> clazz, LogLevel level) {
super(retryPolicy);
logger = LoggerFactory.getLogger(clazz);
this.level = level;
}
@Override
public boolean canRetry(RetryContext context) {
boolean canRetry = retryPolicy.canRetry(context);
if (canRetry) {
log(level, "");
} else {
log(level, "");
}
return canRetry;
}
private void log(LogLevel level, String msg, Throwable cause) {
switch (level) {
case TRACE:
logger.trace(msg, cause);
break;
case DEBUG:
logger.debug(msg, cause);
break;
case INFO:
logger.info(msg, cause);
break;
case WARN:
logger.warn(msg, cause);
break;
case ERROR:
logger.error(msg, cause);
break;
default:
throw new Error();
}
}
private void log(LogLevel level, String msg) {
switch (level) {
case TRACE:
logger.trace(msg);
break;
case DEBUG:
logger.debug(msg);
break;
case INFO:
logger.info(msg);
break;
case WARN:
logger.warn(msg);
break;
case ERROR:
logger.error(msg);
break;
default:
throw new Error();
}
}
private void log(LogLevel level, String format, Object arg) {
switch (level) {
case TRACE:
logger.trace(format, arg);
break;
case DEBUG:
logger.debug(format, arg);
break;
case INFO:
logger.info(format, arg);
break;
case WARN:
logger.warn(format, arg);
break;
case ERROR:
logger.error(format, arg);
break;
default:
throw new Error();
}
}
private void log(LogLevel level, String format, Object argA, Object argB) {
switch (level) {
case TRACE:
logger.trace(format, argA, argB);
break;
case DEBUG:
logger.debug(format, argA, argB);
break;
case INFO:
logger.info(format, argA, argB);
break;
case WARN:
logger.warn(format, argA, argB);
break;
case ERROR:
logger.error(format, argA, argB);
break;
default:
throw new Error();
}
}
private void log(LogLevel level, String format, Object... arguments) {
switch (level) {
case TRACE:
logger.trace(format, arguments);
break;
case DEBUG:
logger.debug(format, arguments);
break;
case INFO:
logger.info(format, arguments);
break;
case WARN:
logger.warn(format, arguments);
break;
case ERROR:
logger.error(format, arguments);
break;
default:
throw new Error();
}
}
}