package com.nbee.echolink; import android.content.Context; import android.util.Log; import timber.log.Timber; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; public class FileLoggingTree extends Timber.DebugTree { private final File logFile; public FileLoggingTree(Context context) { File logDirectory = new File(context.getFilesDir(), "logs"); if (!logDirectory.exists()) { logDirectory.mkdirs(); } this.logFile = new File(logDirectory, "echoLink.log"); } @Override protected void log(int priority, String tag, String message, Throwable t) { super.log(priority, tag, message, t); try (FileWriter fileWriter = new FileWriter(logFile, true)) { SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.getDefault()); String timestamp = dateFormat.format(new Date()); String logMessage = timestamp + " [" + priorityToString(priority) + "] " + tag + ": " + message + "\n"; fileWriter.append(logMessage); if (t != null) { fileWriter.append(Log.getStackTraceString(t)).append("\n"); } } catch (IOException e) { Log.e("FileLoggingTree", "Error writing log to file", e); } } private String priorityToString(int priority) { switch (priority) { case Log.ERROR: return "ERROR"; case Log.WARN: return "WARN"; case Log.INFO: return "INFO"; case Log.DEBUG: return "DEBUG"; case Log.VERBOSE: return "VERBOSE"; default: return "UNKNOWN"; } } }