Hmm, now that I look at the monitoring thread again, I think I see why this is happening. Pretty gross oversight on my behalf. Could you try doing the following changes and see if it fixes the problem in a live setting for you:

Add the following global variable in LogMonitor.java and initialize it in the constructor:
HashMap<String, Long> timestamps = null;

Constructor:
timestamps = new HashMap<String, Long>();

Replace the entire contents of the run() method with the following:

do {
for (File f : logDir.listFiles()) {
if (f.isFile() && !alreadyParsed.containsKey(f.getName())) {
Log.INSTANCE.addFileToLog(f);
alreadyParsed.put(f.getName(), f);
timestamps.put(f.getName(), f.lastModified());
} else if (f.isFile() && f.lastModified() > timestamps.get(f.getName())) {
Log.INSTANCE.removeFileFromLog((File) alreadyParsed.get(f.getName()));
Log.INSTANCE.addFileToLog(f);
timestamps.put(f.getName(), f.lastModified());
}
}

try {
Thread.sleep(1000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
} while (true);