+
+
+ private static class InMemoryLogger implements Logger {
+ private final int myMinLogLevel;
+ private final List<LogEntry> myLogEntries;
+ InMemoryLogger(int minLogLevel) {
+ myMinLogLevel = minLogLevel;
+ myLogEntries = new ArrayList<LogEntry>();
+ }
+
+ @Override
+ public boolean isEnabled(final int level) {
+ return level >= myMinLogLevel;
+ }
+
+ @Override
+ public void log(final int level, final String message) {
+ if (isEnabled(level)) {
+ synchronized (myLogEntries) {
+ myLogEntries.add(new LogEntry(System.currentTimeMillis(), level, message));
+ }
+ }
+ }
+
+ void printLog() {
+ SimpleDateFormat dateFormat = new SimpleDateFormat("[HH:mm:ss.SSS]");
+ synchronized (myLogEntries) {
+ for (LogEntry entry : myLogEntries) {
+ System.err.print(dateFormat.format(new Date(entry.myTimestamp)));
+ System.err.print(" ");
+ System.err.print(getLevel(entry.myLogLevel));
+ System.err.print(" ");
+ System.err.println(entry.myMessage);
+ }
+ }
+ }
+
+ @NotNull
+ private String getLevel(int level) {
+ switch (level) {
+ case Logger.DEBUG:
+ return "DEBUG";
+ case Logger.INFO:
+ return "INFO";
+ case Logger.WARN:
+ return "WARN";
+ case Logger.ERROR:
+ return "ERROR";
+ case Logger.FATAL:
+ return "FATAL";
+ default:
+ return "UNKNOWN";
+ }
+ }
+
+ private static class LogEntry {
+ private final long myTimestamp;
+ private final int myLogLevel;
+ private final String myMessage;
+ LogEntry(long timestamp, int logLevel, @NotNull String message) {
+ myTimestamp = timestamp;
+ myLogLevel = logLevel;
+ myMessage = message;
+ }
+ }
+ }