package amidst.logging; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.sql.Timestamp; import java.util.Date; import java.util.concurrent.ConcurrentLinkedQueue; public class FileLogger extends Thread implements LogListener { private File file; private boolean enabled = true; private ConcurrentLinkedQueue<String> logQueue = new ConcurrentLinkedQueue<String>(); public FileLogger(File file) { this.file = file; if (!file.exists()) { try { enabled = file.createNewFile(); if (!enabled) Log.w("Unable to create new file at: " + file + " disabling logging to file. (No exception thrown)"); } catch (IOException e) { Log.w("Unable to create new file at: " + file + " disabling logging to file."); e.printStackTrace(); enabled = false; } } else if (file.isDirectory()) { Log.w("Unable to log at path: " + file + " because location is a directory."); enabled = false; } write("log", "New FileLogger started."); start(); } @Override public void debug(Object... o) { write("debug", o); } @Override public void info(Object... o) { write("info", o); } @Override public void warning(Object... o) { write("warning", o); } @Override public void error(Object... o) { write("error", o); } @Override public void crash(Throwable e, String exceptionText, String message) { write("crash", message); if (exceptionText.length() > 0) write("crash", exceptionText); } private void write(String tag, Object... msgs) { StringBuilder stringBuilder = new StringBuilder(new Timestamp(new Date().getTime()).toString()).append(" [").append(tag).append("] "); for (int i = 0; i < msgs.length; i++) { stringBuilder.append(msgs[i]); stringBuilder.append((i < msgs.length - 1) ? " " : "\r\n"); } logQueue.add(stringBuilder.toString()); } @Override public void run() { while (enabled) { if (logQueue.size() != 0) { StringBuilder stringBuilder = new StringBuilder(); while (logQueue.size() != 0) stringBuilder.append(logQueue.poll()); if (file.exists() && file.isFile()) { FileWriter writer = null; try { writer = new FileWriter(file, true); writer.append(stringBuilder.toString()); } catch (IOException e) { Log.w("Unable to write to log file."); e.printStackTrace(); } finally { try { if (writer != null) writer.close(); } catch (IOException e) { Log.w("Unable to close writer for log file."); e.printStackTrace(); } } } } try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } } }