简单好用日志工具

我的日志工具

代码:

/**
 * Created by zrj on 2017/6/10.
 */
object LogUtil {
    private var logEnabled = false
    private var tag = "zrj"
    private var isSaveLog = false
    private val ROOT = Environment.getExternalStorageDirectory().path!!// SD卡中的根目录
    private val PATH = "/zrj/log"
    private var PATH_LOG_INFO = ROOT + PATH

    fun v(msg: String, customTag: String = tag) {
        log(Log.VERBOSE, customTag, msg)
    }

    fun d(msg: String, customTag: String = tag) {
        log(Log.DEBUG, customTag, msg)
    }

    fun i(msg: String, customTag: String = tag) {
        log(Log.INFO, customTag, msg)
    }

    fun w(msg: String, customTag: String = tag) {
        log(Log.WARN, customTag, msg)
    }

    fun e(msg: String, customTag: String = tag) {
        log(Log.ERROR, customTag, msg)
    }

    fun json(msg: String, customTag: String = tag) {
        val json = formatJson(msg)
        log(Log.ERROR, customTag, json)
    }

    /**
     * 格式化json
     */
    private fun formatJson(json: String): String {
        return try {
            val trimJson = json.trim()
            when {
                trimJson.startsWith("{") -> JSONObject(trimJson).toString(4)
                trimJson.startsWith("[") -> JSONArray(trimJson).toString(4)
                else -> trimJson
            }
        } catch (e: JSONException) {
            e.printStackTrace().toString()
        }
    }

    /**
     * 输出日志
     * @param priority 日志级别
     */
    private fun log(priority: Int, customTag: String, msg: String) {
        if (!logEnabled) return
        val elements = Thread.currentThread().stackTrace
        val index = findIndex(elements)
        val element = elements[index]
        val tag = handleTag(element, customTag)
        var content = "(${element.fileName}:${element.lineNumber}).${element.methodName}:  $msg"
        Log.println(priority, tag, content)
        if (isSaveLog) {
            point(PATH_LOG_INFO, tag, content)
        }
    }


    /**
     * 处理tag逻辑
     */
    private fun handleTag(element: StackTraceElement, customTag: String): String = when {
        customTag.isNotBlank() -> customTag
        else -> element.className.substringAfterLast(".")
    }

    /**
     * 寻找当前调用类在[elements]中的下标
     */
    private fun findIndex(elements: Array<StackTraceElement>): Int {
        var index = 5
        while (index < elements.size) {
            val className = elements[index].className
            if (className != LogUtil::class.java.name && !elements[index].methodName.startsWith("log")) {
                return index
            }
            index++
        }
        return -1
    }

    private fun point(path: String?, tag: String, msg: String) {
        if (isSDAva) {
            val date = Date()
            val dateFormat = SimpleDateFormat("", Locale.SIMPLIFIED_CHINESE)
            dateFormat.applyPattern("yyyy")
            var p = path + dateFormat.format(date) + "/"
            dateFormat.applyPattern("MM")
            p += dateFormat.format(date) + "/"
            dateFormat.applyPattern("dd")
            p += dateFormat.format(date) + ".log"
            dateFormat.applyPattern("[yyyy-MM-dd HH:mm:ss]")
            val time = dateFormat.format(date)
            val file = File(p)
            if (!file.exists())
                createDipPath(p)
            var out: BufferedWriter? = null
            try {
                out = BufferedWriter(OutputStreamWriter(FileOutputStream(file, true)))
                out.write("$time $tag $msg\r\n")
            } catch (e: Exception) {
                e.printStackTrace()
            } finally {
                try {
                    if (out != null) {
                        out.close()
                    }
                } catch (e: IOException) {
                    e.printStackTrace()
                }

            }
        }
    }

    /**
     * 根据文件路径 递归创建文件
     */
    private fun createDipPath(file: String) {
        val parentFile = file.substring(0, file.lastIndexOf("/"))
        val file1 = File(file)
        val parent = File(parentFile)
        if (!file1.exists()) {
            parent.mkdirs()
            try {
                file1.createNewFile()
            } catch (e: IOException) {
                e.printStackTrace()
            }

        }
    }

    private val isSDAva: Boolean
        get() = Environment.getExternalStorageState() == Environment.MEDIA_MOUNTED ||             Environment.getExternalStorageDirectory().exists()

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值