diff options
| author | Roy Ben-Shabat <Roy@Twine-s.com> | 2018-03-18 16:36:18 +0200 |
|---|---|---|
| committer | Roy Ben-Shabat <Roy@Twine-s.com> | 2018-03-18 16:36:18 +0200 |
| commit | a21d0758fd56a76d934a036a3bfeacea8984ee85 (patch) | |
| tree | fcc29e5cc06bbe6a119aeadcdeb1cf51b96cb624 | |
| parent | dbc2ed4982139d0dae5d380979a385938ca832f9 (diff) | |
| download | Tango-a21d0758fd56a76d934a036a3bfeacea8984ee85.tar.gz Tango-a21d0758fd56a76d934a036a3bfeacea8984ee85.zip | |
Implemented custom logging on Java !
19 files changed, 563 insertions, 12 deletions
diff --git a/Software/Android_Studio/Tango.DAL/build.gradle b/Software/Android_Studio/Tango.DAL/build.gradle index 86c71c619..abaccdd33 100644 --- a/Software/Android_Studio/Tango.DAL/build.gradle +++ b/Software/Android_Studio/Tango.DAL/build.gradle @@ -71,6 +71,6 @@ task generateEntities(type: Exec, description: 'Generate DAL Entities') { } } -preBuild.dependsOn(copyFiles) +//preBuild.dependsOn(copyFiles) -preBuild.dependsOn(generateEntities)
\ No newline at end of file +//preBuild.dependsOn(generateEntities)
\ No newline at end of file diff --git a/Software/Android_Studio/Tango.DAL/src/main/res/raw/tangodb b/Software/Android_Studio/Tango.DAL/src/main/res/raw/tangodb Binary files differindex 82b936014..336f96dcf 100644 --- a/Software/Android_Studio/Tango.DAL/src/main/res/raw/tangodb +++ b/Software/Android_Studio/Tango.DAL/src/main/res/raw/tangodb diff --git a/Software/Android_Studio/Tango.Logging/build.gradle b/Software/Android_Studio/Tango.Logging/build.gradle index 36a8dfafb..724faea79 100644 --- a/Software/Android_Studio/Tango.Logging/build.gradle +++ b/Software/Android_Studio/Tango.Logging/build.gradle @@ -20,6 +20,11 @@ android { proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_1_8 + targetCompatibility JavaVersion.VERSION_1_8 + } } dependencies { @@ -29,4 +34,6 @@ dependencies { testImplementation 'junit:junit:4.12' androidTestImplementation 'com.android.support.test:runner:1.0.1' androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1' + + compile globalDependencies.joda } diff --git a/Software/Android_Studio/Tango.Logging/src/main/java/com/twine/tango/logging/ExceptionLogItem.java b/Software/Android_Studio/Tango.Logging/src/main/java/com/twine/tango/logging/ExceptionLogItem.java index 86166ff95..49aa1b687 100644 --- a/Software/Android_Studio/Tango.Logging/src/main/java/com/twine/tango/logging/ExceptionLogItem.java +++ b/Software/Android_Studio/Tango.Logging/src/main/java/com/twine/tango/logging/ExceptionLogItem.java @@ -6,4 +6,45 @@ package com.twine.tango.logging; public class ExceptionLogItem extends LogItem { + private Exception exception; + private String description; + + public Exception getException() + { + return exception; + } + + public void setException(Exception exception) + { + this.exception = exception; + } + + public String getDescription() + { + return description; + } + + public void setDescription(String description) + { + this.description = description; + } + + @Override + public String getMessage() + { + return exception.getMessage(); + } + + @Override + public String toString() + { + return String.format("[%s] [%s] [%s] [%s] [Line %s]: %s\n%s", + getTimeStamp().toString("HH:mm:ss.SS"), + getCategory().toString(), + getCallerFile(), + getCallerMethodName(), + String.valueOf(getCallerLineNumber()), + getDescription(), + exception.toString()); + } } diff --git a/Software/Android_Studio/Tango.Logging/src/main/java/com/twine/tango/logging/FileLogger.java b/Software/Android_Studio/Tango.Logging/src/main/java/com/twine/tango/logging/FileLogger.java index db9da89a7..50b6b27b6 100644 --- a/Software/Android_Studio/Tango.Logging/src/main/java/com/twine/tango/logging/FileLogger.java +++ b/Software/Android_Studio/Tango.Logging/src/main/java/com/twine/tango/logging/FileLogger.java @@ -1,9 +1,108 @@ package com.twine.tango.logging; +import android.content.Context; + +import org.joda.time.DateTime; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.IOException; +import java.nio.charset.StandardCharsets; + /** * Created by Roy on 3/18/2018. */ public class FileLogger implements ILogger { + private boolean enabled; + private boolean immediate; + private String fileName; + private String folder; + private Context context; + private FileOutputStream stream; + private boolean fileCreated; + + public FileLogger(Context context) + { + this.context = context; + folder = "logs"; + fileName = "log-" + DateTime.now().toString("dd-MM-yyyy_HH-mm-ss") + ".log"; + enabled = true; + } + + public FileLogger(Context context, String folder, String fileName) + { + this(context); + + this.folder = folder; + this.fileName = fileName; + this.context = context; + } + + @Override + public void setEnabled(boolean enabled) + { + this.enabled = enabled; + } + + @Override + public boolean getEnabled() + { + return this.enabled; + } + + @Override + public void setImmediate(boolean immediate) + { + this.immediate = immediate; + } + + @Override + public boolean getImmediate() + { + return this.immediate; + } + + public String getFileName() + { + return fileName; + } + + @Override + public void onLog(LogItem log) + { + try + { + ensureLogFile(); + stream.write((log.toString() + System.lineSeparator()).getBytes(StandardCharsets.UTF_8)); + } + catch (IOException e) + { + e.printStackTrace(); + } + } + + @Override + protected void finalize() throws Throwable + { + super.finalize(); + stream.close(); + } + + private void ensureLogFile() throws IOException + { + if (!fileCreated) + { + fileCreated = true; + File sdcard = context.getFilesDir(); + File dir = new File(sdcard.getAbsolutePath() + "/" + folder); + boolean b = dir.mkdirs(); + + File file = new File(dir.getAbsolutePath() + "/" + fileName); + b = file.createNewFile(); + + stream = new FileOutputStream(file, true); + } + } } diff --git a/Software/Android_Studio/Tango.Logging/src/main/java/com/twine/tango/logging/ILogger.java b/Software/Android_Studio/Tango.Logging/src/main/java/com/twine/tango/logging/ILogger.java index 4e550332b..a6ddf1dfc 100644 --- a/Software/Android_Studio/Tango.Logging/src/main/java/com/twine/tango/logging/ILogger.java +++ b/Software/Android_Studio/Tango.Logging/src/main/java/com/twine/tango/logging/ILogger.java @@ -6,4 +6,13 @@ package com.twine.tango.logging; public interface ILogger { + void onLog(LogItem log); + + void setEnabled(boolean enabled); + + boolean getEnabled(); + + void setImmediate(boolean immediate); + + boolean getImmediate(); } diff --git a/Software/Android_Studio/Tango.Logging/src/main/java/com/twine/tango/logging/LogCatLogger.java b/Software/Android_Studio/Tango.Logging/src/main/java/com/twine/tango/logging/LogCatLogger.java index 8dc14abad..e394503e1 100644 --- a/Software/Android_Studio/Tango.Logging/src/main/java/com/twine/tango/logging/LogCatLogger.java +++ b/Software/Android_Studio/Tango.Logging/src/main/java/com/twine/tango/logging/LogCatLogger.java @@ -1,9 +1,67 @@ package com.twine.tango.logging; +import android.util.Log; + /** * Created by Roy on 3/18/2018. */ public class LogCatLogger implements ILogger { + private boolean enabled; + private boolean immediate; + private static final String tag = "Tango"; + + public LogCatLogger() + { + enabled = true; + immediate = true; + } + + @Override + public void setEnabled(boolean enabled) + { + this.enabled = enabled; + } + + @Override + public boolean getEnabled() + { + return this.enabled; + } + + @Override + public void setImmediate(boolean immediate) + { + this.immediate = immediate; + } + + @Override + public boolean getImmediate() + { + return this.immediate; + } + + @Override + public void onLog(LogItem log) + { + switch (log.getCategory()) + { + case Info: + Log.i(tag,log.toString()); + break; + case Error: + Log.e(tag,log.toString()); + break; + case Warning: + Log.w(tag,log.toString()); + break; + case Critical: + Log.wtf(tag,log.toString()); + break; + case Debug: + Log.d(tag,log.toString()); + break; + } + } } diff --git a/Software/Android_Studio/Tango.Logging/src/main/java/com/twine/tango/logging/LogCategory.java b/Software/Android_Studio/Tango.Logging/src/main/java/com/twine/tango/logging/LogCategory.java index bf116f95a..5ce2c521e 100644 --- a/Software/Android_Studio/Tango.Logging/src/main/java/com/twine/tango/logging/LogCategory.java +++ b/Software/Android_Studio/Tango.Logging/src/main/java/com/twine/tango/logging/LogCategory.java @@ -6,4 +6,9 @@ package com.twine.tango.logging; public enum LogCategory { + Info, + Warning, + Error, + Critical, + Debug, } diff --git a/Software/Android_Studio/Tango.Logging/src/main/java/com/twine/tango/logging/LogItem.java b/Software/Android_Studio/Tango.Logging/src/main/java/com/twine/tango/logging/LogItem.java index 327858b15..deaeb3084 100644 --- a/Software/Android_Studio/Tango.Logging/src/main/java/com/twine/tango/logging/LogItem.java +++ b/Software/Android_Studio/Tango.Logging/src/main/java/com/twine/tango/logging/LogItem.java @@ -1,9 +1,71 @@ package com.twine.tango.logging; +import org.joda.time.DateTime; + /** * Created by Roy on 3/18/2018. */ -public class LogItem +public abstract class LogItem { + private String callerMethodName; + private String callerFile; + private int callerLineNumber; + private DateTime timeStamp; + private LogCategory category; + + public String getCallerMethodName() + { + return callerMethodName; + } + + public void setCallerMethodName(String callerMethodName) + { + this.callerMethodName = callerMethodName; + } + + public String getCallerFile() + { + return callerFile; + } + + public void setCallerFile(String callerFile) + { + this.callerFile = callerFile; + } + + public int getCallerLineNumber() + { + return callerLineNumber; + } + + public void setCallerLineNumber(int callerLineNumber) + { + this.callerLineNumber = callerLineNumber; + } + + public DateTime getTimeStamp() + { + return timeStamp; + } + + public void setTimeStamp(DateTime timeStamp) + { + this.timeStamp = timeStamp; + } + + public LogCategory getCategory() + { + return category; + } + + public void setCategory(LogCategory category) + { + this.category = category; + } + + public abstract String getMessage(); + + @Override + public abstract String toString(); } diff --git a/Software/Android_Studio/Tango.Logging/src/main/java/com/twine/tango/logging/LogManager.java b/Software/Android_Studio/Tango.Logging/src/main/java/com/twine/tango/logging/LogManager.java index f77e09274..b3b8041a2 100644 --- a/Software/Android_Studio/Tango.Logging/src/main/java/com/twine/tango/logging/LogManager.java +++ b/Software/Android_Studio/Tango.Logging/src/main/java/com/twine/tango/logging/LogManager.java @@ -1,9 +1,215 @@ package com.twine.tango.logging; +import org.joda.time.DateTime; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.ConcurrentLinkedQueue; + /** * Created by Roy on 3/18/2018. */ public class LogManager { + private static LogManager defaultLogger; + + private List<ILogger> loggers; + private ConcurrentLinkedQueue<LogItem> logs; + private Thread loggingThread; + private boolean isStarted; + private List<LogCategory> categories; + + public static LogManager getDefault() + { + if (defaultLogger == null) + { + defaultLogger = new LogManager(); + } + + return defaultLogger; + } + + public LogManager() + { + loggers = new ArrayList<>(); + logs = new ConcurrentLinkedQueue<>(); + categories = new ArrayList<>(); + + categories.add(LogCategory.Info); + categories.add(LogCategory.Critical); + categories.add(LogCategory.Error); + categories.add(LogCategory.Warning); + } + + public List<LogCategory> getCategories() + { + return categories; + } + + public void setCategories(List<LogCategory> categories) + { + this.categories = categories; + } + + public boolean getHasLogsPending() + { + return logs.size() > 0; + } + + public void registerLogger(ILogger logger) + { + if (logger != null && !loggers.contains(logger)) + { + loggers.add(logger); + } + } + + public void unregisterLogger(ILogger logger) + { + if (logger != null && loggers.contains(logger)) + { + loggers.remove(logger); + } + } + + private void fillStackInfo(StackTraceElement[] stackTraceElements, LogItem log) + { + if (stackTraceElements.length > 0) + { + int counter = 0; + + StackTraceElement stack = stackTraceElements[counter]; + + while (!stack.getFileName().equals("LogManager.java")) + { + stack = stackTraceElements[counter++]; + } + + stack = stackTraceElements[counter]; + + log.setCallerFile(stack.getFileName()); + log.setCallerMethodName(stack.getMethodName()); + log.setCallerLineNumber(stack.getLineNumber()); + } + } + + public Exception log(Exception exception, LogCategory category, String description) + { + if (!categories.contains(category)) return exception; + + ExceptionLogItem log = new ExceptionLogItem(); + StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace(); + fillStackInfo(stackTraceElements, log); + log.setTimeStamp(DateTime.now()); + log.setCategory(category); + log.setDescription(description); + log.setException(exception); + + appendLog(log); + + return exception; + } + + public Exception log(Exception exception, String description) + { + ExceptionLogItem log = new ExceptionLogItem(); + StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace(); + fillStackInfo(stackTraceElements, log); + log.setTimeStamp(DateTime.now()); + log.setDescription(description); + log.setException(exception); + log.setCategory(LogCategory.Error); + + appendLog(log); + + return exception; + } + + public String log(String message, LogCategory category) + { + MessageLogItem log = new MessageLogItem(); + StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace(); + fillStackInfo(stackTraceElements, log); + log.setTimeStamp(DateTime.now()); + log.setMessage(message); + log.setCategory(category); + + appendLog(log); + + return message; + } + + public String log(String message) + { + MessageLogItem log = new MessageLogItem(); + StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace(); + fillStackInfo(stackTraceElements, log); + log.setTimeStamp(DateTime.now()); + log.setMessage(message); + log.setCategory(LogCategory.Info); + + appendLog(log); + + return message; + } + + private void appendLog(LogItem log) + { + if (log != null) + { + for (ILogger logger : loggers) + { + if (logger.getEnabled() && logger.getImmediate()) + { + logger.onLog(log); + } + } + + logs.add(log); + } + + startLoggingThread(); + } + + private void startLoggingThread() + { + if (!isStarted) + { + isStarted = true; + loggingThread = new Thread(this::loggingThreadMethod); + loggingThread.start(); + } + } + + private void loggingThreadMethod() + { + try + { + while (isStarted) + { + while (logs.size() > 0) + { + LogItem log = logs.poll(); + + if (log != null) + { + for (ILogger logger : loggers) + { + if (logger.getEnabled() && !logger.getImmediate()) + { + logger.onLog(log); + } + } + } + } + + Thread.sleep(10); + } + } + catch (InterruptedException e) + { + e.printStackTrace(); + } + } } diff --git a/Software/Android_Studio/Tango.Logging/src/main/java/com/twine/tango/logging/MessageLogItem.java b/Software/Android_Studio/Tango.Logging/src/main/java/com/twine/tango/logging/MessageLogItem.java index 90659cb7e..cf7c7ab48 100644 --- a/Software/Android_Studio/Tango.Logging/src/main/java/com/twine/tango/logging/MessageLogItem.java +++ b/Software/Android_Studio/Tango.Logging/src/main/java/com/twine/tango/logging/MessageLogItem.java @@ -6,4 +6,28 @@ package com.twine.tango.logging; public class MessageLogItem extends LogItem { + private String message; + + @Override + public String getMessage() + { + return message; + } + + public void setMessage(String message) + { + this.message = message; + } + + @Override + public String toString() + { + return String.format("[%s] [%s] [%s] [%s] [Line %s]: %s", + getTimeStamp().toString("HH:mm:ss.SS"), + getCategory().toString(), + getCallerFile(), + getCallerMethodName(), + String.valueOf(getCallerLineNumber()), + getMessage()); + } } diff --git a/Software/Android_Studio/Tango.PMR/build.gradle b/Software/Android_Studio/Tango.PMR/build.gradle index d65ec1a97..1aca6d009 100644 --- a/Software/Android_Studio/Tango.PMR/build.gradle +++ b/Software/Android_Studio/Tango.PMR/build.gradle @@ -56,10 +56,10 @@ task reflectPMR() << { } } -tasks.withType(JavaCompile) { - compileTask -> compileTask.dependsOn createPMR -} - -tasks.withType(JavaCompile) { - compileTask -> compileTask.dependsOn reflectPMR -} +//tasks.withType(JavaCompile) { +// compileTask -> compileTask.dependsOn createPMR +//} +// +//tasks.withType(JavaCompile) { +// compileTask -> compileTask.dependsOn reflectPMR +//} diff --git a/Software/Android_Studio/Tango.UnitTesting/build.gradle b/Software/Android_Studio/Tango.UnitTesting/build.gradle index 3f58e3803..a785e4580 100644 --- a/Software/Android_Studio/Tango.UnitTesting/build.gradle +++ b/Software/Android_Studio/Tango.UnitTesting/build.gradle @@ -45,4 +45,5 @@ dependencies { implementation project(':Tango.Transport') implementation project(':Tango.Web') implementation project(':Tango.NativeBridge') + implementation project(':Tango.Logging') } diff --git a/Software/Android_Studio/Tango.UnitTesting/src/androidTest/java/com/twine/tango/unittesting/Logging_TST.java b/Software/Android_Studio/Tango.UnitTesting/src/androidTest/java/com/twine/tango/unittesting/Logging_TST.java index 0e7b1fbd5..a1baa6f67 100644 --- a/Software/Android_Studio/Tango.UnitTesting/src/androidTest/java/com/twine/tango/unittesting/Logging_TST.java +++ b/Software/Android_Studio/Tango.UnitTesting/src/androidTest/java/com/twine/tango/unittesting/Logging_TST.java @@ -1,9 +1,48 @@ package com.twine.tango.unittesting; +import android.content.Context; +import android.support.test.InstrumentationRegistry; +import android.support.test.runner.AndroidJUnit4; + +import com.twine.tango.logging.FileLogger; +import com.twine.tango.logging.LogCatLogger; +import com.twine.tango.logging.LogCategory; +import com.twine.tango.logging.LogManager; + +import org.junit.Test; +import org.junit.runner.RunWith; + /** * Created by Roy on 3/18/2018. */ +@RunWith(AndroidJUnit4.class) public class Logging_TST { + @Test + public void register_and_log_using_log_Cat() + { + // Context of the app under test. + Context appContext = InstrumentationRegistry.getTargetContext(); + + LogManager logManager = LogManager.getDefault(); + + logManager.registerLogger(new LogCatLogger()); + logManager.registerLogger(new FileLogger(appContext)); + + logManager.log("This is a general log message."); + logManager.log("This is a critical log message", LogCategory.Critical); + + while (logManager.getHasLogsPending()) + { + try + { + Thread.sleep(5000); + } + catch (InterruptedException e) + { + e.printStackTrace(); + } + } + } } diff --git a/Software/Android_Studio/settings.gradle b/Software/Android_Studio/settings.gradle index 15bb94e3b..77d1d0863 100644 --- a/Software/Android_Studio/settings.gradle +++ b/Software/Android_Studio/settings.gradle @@ -1 +1 @@ -include ':Tango.Stubs.UI', ':Tango.SharedUI', ':Tango.Models', ':Tango.Stubs', ':Tango.Integration', ':Tango.Transport', ':Tango.Core', ':Tango.PMR', ':Tango.DAL', ':Tango.Web', ':Tango.UnitTesting', ':Tango.NativeBridge' +include ':Tango.Stubs.UI', ':Tango.SharedUI', ':Tango.Models', ':Tango.Stubs', ':Tango.Integration', ':Tango.Transport', ':Tango.Core', ':Tango.PMR', ':Tango.DAL', ':Tango.Web', ':Tango.UnitTesting', ':Tango.NativeBridge', ':Tango.Logging' diff --git a/Software/DB/Tango.db b/Software/DB/Tango.db Binary files differindex 82b936014..336f96dcf 100644 --- a/Software/DB/Tango.db +++ b/Software/DB/Tango.db diff --git a/Software/DB/Tango.mdf b/Software/DB/Tango.mdf Binary files differindex 328def1cd..8542aaac6 100644 --- a/Software/DB/Tango.mdf +++ b/Software/DB/Tango.mdf diff --git a/Software/DB/Tango_log.ldf b/Software/DB/Tango_log.ldf Binary files differindex a89ce1563..bf5478dd0 100644 --- a/Software/DB/Tango_log.ldf +++ b/Software/DB/Tango_log.ldf diff --git a/Software/Visual_Studio/Tango.Logging/FileLogger.cs b/Software/Visual_Studio/Tango.Logging/FileLogger.cs index 75c6e529e..e104b59b9 100644 --- a/Software/Visual_Studio/Tango.Logging/FileLogger.cs +++ b/Software/Visual_Studio/Tango.Logging/FileLogger.cs @@ -27,7 +27,7 @@ namespace Tango.Logging _isEnabled = true; String logsFolder = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Twine", "Tango", "logs"); Directory.CreateDirectory(logsFolder); - LogFile = Path.Combine(logsFolder, string.Format("{1}-{0:yyyy-MM-dd_hh-mm-ss}.log", DateTime.Now, Path.GetFileNameWithoutExtension(System.AppDomain.CurrentDomain.FriendlyName))); + LogFile = Path.Combine(logsFolder, string.Format("{1}-{0:dd-MM-yyyy_hh-mm-ss}.log", DateTime.Now, Path.GetFileNameWithoutExtension(System.AppDomain.CurrentDomain.FriendlyName))); } /// <summary> |
