Skip to content
This repository was archived by the owner on Mar 19, 2024. It is now read-only.
Closed
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.4'
}

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;
}
Comment on lines -202 to -205
Copy link
Contributor

Choose a reason for hiding this comment

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

What happens if we lose this check? Could logs be huge or how is logs size controlled now?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Before

There were two files. Old and new. The new overwrites the old. So it means overall log were split into two similar size files and you see always the current.

New

EveryTime you run into Application create a new file with current date is created/reused. The old keeps there till you manually remove it.
Btw, the file-logging is in my point of view pointless, you see current logcat (in release !) anyways. It was a workaround to see what happens in release anyhow

Copy link
Contributor

Choose a reason for hiding this comment

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

Ok, thanks for this explanation! I think this is something to check with @davigonz and @jesmrec

Copy link
Collaborator

Choose a reason for hiding this comment

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

I will check in QA stage. Just one question: does the rotation happen every time you open the app? does this not lead to log file flooding?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

No, only if it's really opened. Only a click on the icon does not start app, when it's already open in background.
But when you remove app from task list, it will create a file, but maximum only one per day

}
}

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) {
Timber.forest().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))
}

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