Skip to content
This repository has been archived by the owner on Mar 19, 2024. It is now read-only.

Better logging (on upstream) #283

Merged
merged 6 commits into from
Nov 27, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions owncloudComLibrary/build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ dependencies {
api 'com.squareup.okhttp3:okhttp:3.12.0'
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlinVersion"
api 'com.gitlab.ownclouders:dav4android:oc_support_1.0.1'
api 'com.github.hannesa2:Logcat:1.5.6'
}

allOpen {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,212 +1,87 @@
package com.owncloud.android.lib.common.utils;

import android.util.Log;
import timber.log.Timber;

import com.owncloud.android.lib.BuildConfig;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Locale;

public class Log_OC {
private static final String SIMPLE_DATE_FORMAT = "yyyy/MM/dd HH:mm:ss";
private static final String LOG_FOLDER_NAME = "log";
private static final long MAX_FILE_SIZE = 2000000; // 2MB

private static String mOwncloudDataFolderLog = "owncloud_log";
private static String mOwncloudDataFolderLog;

private static File mLogFile;
private static File mFolder;
private static BufferedWriter mBuf;
public static void setLogDataFolder(String logFolder) {
mOwncloudDataFolderLog = logFolder;
}

private static String[] mLogFileNames = {
"currentLog" + BuildConfig.BUILD_TYPE + ".txt",
"olderLog" + BuildConfig.BUILD_TYPE + ".txt"
};
public static void i(String message) {
Timber.i(message);
}

private static boolean isMaxFileSizeReached = false;
private static boolean isEnabled = false;
public static void d(String message) {
Timber.d(message);
}

public static void setLogDataFolder(String logFolder) {
mOwncloudDataFolderLog = logFolder;
public static void d(String message, Exception e) {
Timber.d(e, message);
}

public static void i(String TAG, String message) {
Log.i(TAG, message);
appendLog("I: " + TAG + " : " + message);
public static void e(String message) {
Timber.e(message);
}

public static void e(String message, Throwable e) {
Timber.e(e, message);
}

public static void v(String message) {
Timber.v(message);
}

public static void w(String message) {
Timber.w(message);
}

@Deprecated
public static void i(String tag, String message) {
Timber.i(message);
}

@Deprecated
public static void d(String TAG, String message) {
Log.d(TAG, message);
appendLog("D: " + TAG + " : " + message);
Timber.d(message);
}

@Deprecated
public static void d(String TAG, String message, Exception e) {
Log.d(TAG, message, e);
appendLog("D: " + TAG + " : " + message + " Exception : " + e.getStackTrace());
Timber.d(e, message);
}

@Deprecated
public static void e(String TAG, String message) {
Log.e(TAG, message);
appendLog("E: " + TAG + " : " + message);
Timber.e(message);
}

@Deprecated
public static void e(String TAG, String message, Throwable e) {
Log.e(TAG, message, e);
appendLog("E: " + TAG + " : " + message + " Exception : " + e.getStackTrace());
Timber.e(e, message);
}

@Deprecated
public static void v(String TAG, String message) {
Log.v(TAG, message);
appendLog("V: " + TAG + " : " + message);
Timber.v(message);
}

@Deprecated
public static void w(String TAG, String message) {
Log.w(TAG, message);
appendLog("W: " + TAG + " : " + message);
}

/**
* Start doing logging
*
* @param storagePath : directory for keeping logs
*/
synchronized public static void startLogging(String storagePath) {
String logPath = storagePath + File.separator + mOwncloudDataFolderLog + File.separator + LOG_FOLDER_NAME;
mFolder = new File(logPath);
mLogFile = new File(mFolder + File.separator + mLogFileNames[0]);

boolean isFileCreated = false;

if (!mFolder.exists()) {
mFolder.mkdirs();
isFileCreated = true;
Log.d("LOG_OC", "Log file created");
}

try {

// Create the current log file if does not exist
mLogFile.createNewFile();
mBuf = new BufferedWriter(new FileWriter(mLogFile, true));
isEnabled = true;

if (isFileCreated) {
appendPhoneInfo();
}

} catch (IOException e) {
e.printStackTrace();
} finally {
if (mBuf != null) {
try {
mBuf.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

synchronized public static void stopLogging() {
try {
if (mBuf != null) {
mBuf.close();
}
isEnabled = false;

mLogFile = null;
mFolder = null;
mBuf = null;
isMaxFileSizeReached = false;

} catch (IOException e) {
// Because we are stopping logging, we only log to Android console.
Log.e("OC_Log", "Closing log file failed: ", e);
} catch (Exception e) {
// This catch should never fire because we do null check on mBuf.
// But just for the sake of stability let's log this odd situation.
// Because we are stopping logging, we only log to Android console.
Log.e("OC_Log", "Stopping logging failed: ", e);
}
}

/**
* Delete history logging
*/
public static void deleteHistoryLogging() {
File folderLogs = new File(mFolder + File.separator);
if (folderLogs.isDirectory()) {
String[] myFiles = folderLogs.list();
for (String fileName : myFiles) {
File fileInFolder = new File(folderLogs, fileName);
Log_OC.d("delete file", fileInFolder.getAbsoluteFile() + " " + fileInFolder.delete());
}
}
}

/**
* Append the info of the device
*/
private static void appendPhoneInfo() {
appendLog("Model : " + android.os.Build.MODEL);
appendLog("Brand : " + android.os.Build.BRAND);
appendLog("Product : " + android.os.Build.PRODUCT);
appendLog("Device : " + android.os.Build.DEVICE);
appendLog("Version-Codename : " + android.os.Build.VERSION.CODENAME);
appendLog("Version-Release : " + android.os.Build.VERSION.RELEASE);
}

/**
* Append to the log file the info passed
*
* @param text : text for adding to the log file
*/
synchronized private static void appendLog(String text) {

if (isEnabled) {

if (isMaxFileSizeReached) {

// Move current log file info to another file (old logs)
File olderFile = new File(mFolder + File.separator + mLogFileNames[1]);
if (mLogFile.exists()) {
mLogFile.renameTo(olderFile);
}

// Construct a new file for current log info
mLogFile = new File(mFolder + File.separator + mLogFileNames[0]);
isMaxFileSizeReached = false;
}

String timeStamp = new SimpleDateFormat(SIMPLE_DATE_FORMAT, Locale.ENGLISH).format(Calendar.getInstance().getTime());

try {
mBuf = new BufferedWriter(new FileWriter(mLogFile, true));
mBuf.newLine();
mBuf.write(timeStamp + " " + text);
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
mBuf.close();
} catch (IOException e) {
e.printStackTrace();
}
}

// Check if current log file size is bigger than the max file size defined
if (mLogFile.length() > MAX_FILE_SIZE) {
isMaxFileSizeReached = true;
}
}
}

public static String[] getLogFileNames() {
return mLogFileNames;
Timber.w(message);
}

public static void startLogging(String storagePath) {
LoggingHelper.INSTANCE.startLogging(
new File(storagePath+ File.separator + mOwncloudDataFolderLog), mOwncloudDataFolderLog);
}

public static void stopLogging() {
LoggingHelper.INSTANCE.stopLogging();
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.owncloud.android.lib.common.utils

import info.hannes.timber.FileLoggingTree
import info.hannes.timber.fileLoggingTree
import timber.log.Timber
import java.io.File

object LoggingHelper {

fun startLogging(directory: File, storagePath: String) {
fileLoggingTree()?.let {
Timber.forest().drop(Timber.forest().indexOf(it))
}
if (!directory.exists())
directory.mkdirs()
Timber.plant(FileLoggingTree(directory, filename = storagePath, delegator = Log_OC::class.java))
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As an idea for owncloud/android#2725 (comment):
Don't use filename and specify context then the file hast as prefix the package name.

}

fun stopLogging() {
fileLoggingTree()?.let {
Timber.forest().drop(Timber.forest().indexOf(it))
}
}
}