JakeWharton / timber

A logger with a small, extensible API which provides utility on top of Android's normal Log class.
https://jakewharton.github.io/timber/docs/5.x/
Apache License 2.0
10.41k stars 959 forks source link

[Feature Request] Can we write logs in a file and place a cap on its size? #444

Closed shahwaiz90 closed 3 years ago

shahwaiz90 commented 3 years ago

Does timber provides functionality to write logs in a file and have a file cap size on top of it? I made something like that, do I need to manually write the code to check for the file size limit? Timber not includes something like this? https://stackoverflow.com/questions/14539519/android-logcat-rotation-size-and-number-of-rotation-parameters/18694488

class FileLoggingTree @Inject constructor(var context: Context?, var fileLoggingEnabled: Boolean) :
    Timber.DebugTree() {
    override fun log(priority: Int, tag: String?, message: String, t: Throwable?) {
        try {
            if (fileLoggingEnabled) {
                val fileNameTimeStamp: String =
                    SimpleDateFormat("dd-MM-yyyy", Locale.getDefault()).format(Date())
                val logTimeStamp: String =
                    SimpleDateFormat("E MMM dd yyyy 'at' hh:mm:ss:SSS aaa", Locale.getDefault())
                        .format(Date())
                val fileName = "$fileNameTimeStamp.html"

                // Create file
                val file: File? = generateFile(context, fileName)

                // If file created or exists save logs
                if (file != null) {
                    val writer = FileWriter(file, true)
                    writer
                        .append(
                            "<p style=\"background:lightgray;\"><strong " +
                                "style=\"background:lightblue;\">  "
                        )
                        .append(logTimeStamp)
                        .append(" :  </strong><strong>  ")
                        .append(tag)
                        .append("</strong> - ")
                        .append(message)
                        .append("</p>")
                    writer.flush()
                    writer.close()
                }
            }
        } catch (e: Exception) {}
    }

    fun deleteFileLogFolder(context: Context?): Boolean {
        return deleteLogFolder(context)
    }

    fun deleteLogFileByFileName(context: Context?, fileName: String): Boolean? {
        return deleteLogFile(context, fileName)
    }

    override fun createStackElementTag(element: StackTraceElement): String {
        // Add log statements line number to the log
        return super.createStackElementTag(element) + " - " + element.lineNumber
    }

    companion object {

        /*  Helper method to create file*/
        @Nullable
        private fun generateFile(context: Context?, fileName: String): File? {
            var file: File? = null
            // creating log folder inside data/data/mypackagename/files/
            val root = File(context?.filesDir?.absolutePath, "log")
            var dirExists = true
            if (!root.exists()) {
                dirExists = root.mkdirs()
            }
            if (dirExists) {
                file = File(root, fileName)
            }
            return file
        }

        /*  Helper method to delete already created file*/
        @Nullable
        private fun deleteLogFile(context: Context?, fileName: String): Boolean? {
            var file: File? = null
            // creating log folder inside data/data/mypackagename/files/
            val root = File(context?.filesDir?.absolutePath, "log")
            var dirExists = true
            if (!root.exists()) {
                dirExists = root.mkdirs()
            }
            if (dirExists) {
                file = File(root, fileName)
            }
            return file?.delete()
        }

        /*  Helper method to delete log folder */
        @Nullable
        private fun deleteLogFolder(context: Context?): Boolean {
            // creating log folder inside data/data/mypackagename/files/
            val root = File(context?.filesDir?.absolutePath, "log")
            return root.delete()
        }
    }
}
JakeWharton commented 3 years ago

This is not implemented, and likely won't be. The strategy for what to do about stuff like this is tracked by #255. I suspect we'll have a few as samples but not part of the released artifact itself.

shahwaiz90 commented 3 years ago

Thanks.