package games.strategy.triplea.ai.proAI.logging;
import java.util.logging.Level;
/**
* Class to log messages to log window and console.
*/
public class ProLogger {
public static void warn(final String message) {
log(Level.WARNING, message);
}
public static void info(final String message) {
log(Level.FINE, message);
}
public static void debug(final String message) {
log(Level.FINER, message);
}
public static void trace(final String message) {
log(Level.FINEST, message);
}
private static void log(final Level level, final String message) {
log(level, message, null);
}
/**
* Some notes on using the Pro AI logger:
* First, to make the logs easily readable even when there are hundreds of lines, I want every considerable step down
* in the call stack to
* mean more log message indentation.
* For example, the base logs in the Pro AI class have no indentation before them, but the base logs in the
* DoCombatMove class will have
* two spaces inserted at the start, and the level below that, four spaces.
* In this way, when you're reading the log, you can skip over unimportant areas with speed because of the
* indentation.
* Second, I generally want the Fine logs to be messages that run less than 10 times each round, including almost all
* messages in the Pro
* AI class,
* Finest for messages showing details within a method that, for example, returns a value.
* (So, for example, the NCM_Task method IsTaskWorthwhile() would primarily use finest, as it just returns a boolean,
* and the logs within
* it are just for details)
* Finer for just about everything else. (There's also the SERVER, INFO, etc. levels)
* Just keep these things in mind while adding new logging code.
*/
public static void log(final Level level, final String message, final Throwable t) {
if (!ProLogSettings.loadSettings().EnableAILogging) {
return; // Skip displaying to settings window if settings window option is turned off
}
final Level logDepth = ProLogSettings.loadSettings().AILoggingDepth;
if (logDepth.equals(Level.FINE) && (level.equals(Level.FINER) || level.equals(Level.FINEST))) {
return; // If the settings window log depth is a higher level than this messages, skip
}
if (logDepth.equals(Level.FINER) && level.equals(Level.FINEST)) {
return;
}
ProLogUI.notifyAILogMessage(level, addIndentationCompensation(message, level));
}
/**
* Adds extra spaces to get logs to lineup correctly. (Adds two spaces to fine, one to finer, none to finest, etc.)
*/
private static String addIndentationCompensation(final String message, final Level level) {
final StringBuilder builder = new StringBuilder();
final int compensateLength = (level.toString().length() - 4) * 2;
if (compensateLength == 0) {
return message;
}
for (int i = 0; i < compensateLength; i++) {
builder.append(" ");
}
builder.append(message);
return builder.toString();
}
}