package org.indywidualni.fblite.util.logger;
import android.util.Log;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* Sends Log output to a file
* Created by volker on 06.02.15.
*/
public class FileLog {
private static final String TIMESTAMP_FORMAT = "yyyy-MM-dd HH:mm:ss.SSS";
private static final String MSG_FORMAT = "%s %s: %s"; // timestamp, tag, message
private static String sLogFilePath;
private static File sTheLogFile;
private static BufferedWriter sBufferedWriter;
private static int sCurrentPriority;
private static int sFileSizeLimit; // bytes
public static void open(String logFilePath, int currentPriority, int fileSizeLimit) {
sLogFilePath = logFilePath;
sCurrentPriority = currentPriority;
sFileSizeLimit = fileSizeLimit;
sTheLogFile = new File(sLogFilePath);
if (!sTheLogFile.exists()) {
try {
//noinspection ResultOfMethodCallIgnored
sTheLogFile.createNewFile();
} catch (IOException e) {
Log.e("FileLog", Log.getStackTraceString(e));
}
}
//checkFileSize( );
try {
sBufferedWriter = new BufferedWriter(new FileWriter(sTheLogFile, true));
} catch (IOException e) {
Log.e("FileLog", Log.getStackTraceString(e));
}
}
public static void setCurrentPriority(int currentPriority) {
sCurrentPriority = currentPriority;
}
public static void close() {
try {
if (sBufferedWriter != null) {
//sBufferedWriter.newLine( );
sBufferedWriter.flush( );
sBufferedWriter.close( );
}
} catch (IOException e) {
Log.e("FileLog", Log.getStackTraceString(e));
}
}
public static void delete() {
close();
if (sTheLogFile != null) {
//noinspection ResultOfMethodCallIgnored
sTheLogFile.delete();
}
}
public static int v(String tag, String msg) {
writeToFile(Log.VERBOSE, tag, msg);
return Log.v( tag, msg );
}
public static int v(String tag, String msg, Throwable tr) {
writeToFile(Log.VERBOSE, tag, msg, tr);
return Log.v(tag, msg, tr);
}
public static int d(String tag, String msg) {
writeToFile(Log.DEBUG, tag, msg);
return Log.d(tag, msg);
}
public static int d(String tag, String msg, Throwable tr) {
writeToFile(Log.DEBUG, tag, msg, tr);
return Log.d(tag, msg, tr);
}
public static int i(String tag, String msg) {
writeToFile(Log.INFO, tag, msg);
return Log.i(tag, msg);
}
public static int i(String tag, String msg, Throwable tr) {
writeToFile(Log.INFO, tag, msg, tr);
return Log.i(tag, msg, tr);
}
public static int w(String tag, String msg) {
writeToFile(Log.WARN, tag, msg);
return Log.w(tag, msg);
}
public static int w(String tag, String msg, Throwable tr) {
writeToFile(Log.WARN, tag, msg, tr);
return Log.w(tag, msg, tr);
}
public static int w(String tag, Throwable tr) {
writeToFile(Log.WARN, tag, "", tr);
return Log.w(tag, tr);
}
public static int e(String tag, String msg) {
writeToFile(Log.ERROR, tag, msg);
return Log.e(tag, msg);
}
public static int e(String tag, String msg, Throwable tr) {
writeToFile(Log.ERROR, tag, msg, tr);
return Log.e(tag, msg, tr);
}
public static String getStackTraceString(Throwable tr) {
return Log.getStackTraceString(tr);
}
private static void writeToFile(int priority, String tag, String msg) {
writeToFile(priority, tag, msg, null);
}
private static void writeToFile(int priority, String tag, String msg, Throwable tr) {
if ((priority >= sCurrentPriority) && (sBufferedWriter != null)) {
try {
if (checkFileSize()) {
sBufferedWriter = new BufferedWriter(new FileWriter(sTheLogFile, true));
}
sBufferedWriter.write(formatMsg(tag, msg));
sBufferedWriter.newLine();
if (tr != null) {
sBufferedWriter.write(Log.getStackTraceString(tr));
sBufferedWriter.newLine();
}
sBufferedWriter.flush();
} catch (IOException e) {
Log.e("FileLog", Log.getStackTraceString(e));
}
}
if (sBufferedWriter == null) {
Log.e("FileLog", "You have to call FileLog.open(...) before starting to log");
}
}
private static String formatMsg(String tag, String msg) {
return String.format(MSG_FORMAT, getCurrentTimeStamp(), tag, msg);
}
private static String getCurrentTimeStamp() {
String currentTimeStamp = null;
try {
SimpleDateFormat dateFormat = new SimpleDateFormat(TIMESTAMP_FORMAT,
java.util.Locale.getDefault());
currentTimeStamp = dateFormat.format(new Date());
} catch (Exception e) {
Log.e("FileLog", Log.getStackTraceString(e));
}
return currentTimeStamp;
}
private static boolean checkFileSize() {
boolean createdNewLogFile = false;
try {
if (sTheLogFile.length() > sFileSizeLimit) {
File to = new File(sLogFilePath + ".old");
if (to.exists()) {
//noinspection ResultOfMethodCallIgnored
to.delete();
}
//noinspection ResultOfMethodCallIgnored
sTheLogFile.renameTo(to);
sTheLogFile = new File(sLogFilePath);
//noinspection ResultOfMethodCallIgnored
sTheLogFile.createNewFile();
createdNewLogFile = true;
}
} catch (IOException e) {
Log.e("FileLog", Log.getStackTraceString(e));
}
return createdNewLogFile;
}
}